Centos7 + Mariadb搭建主从配置
安装了2个虚拟机来搭建环境:
两个虚拟机信息如下:
master服务器ip:192.168.1.180
slave服务器ip:192.168.8.189
系统和数据库都一样的
[root@localhost mysql]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
数据库版本为: 10.3.20-MariaDB
mariadb的安装查看: 点击查看
一: 主数据库配置:
1、修改my.cnf文件
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data/
server_id=1
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 30
#需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库
binlog-do-db=mydb-test
#不需要同步数据库,比如这里的mysql系统数据库
binlog-ignore-db=mysql
#open_files_limit = 10240
#default-character-set=utf8
#character-set-server=utf8
explicit_defaults_for_timestamp=true
skip-name-resolve
pid-file=/usr/local/mysql/config/mysql.pid
# These are commonly set, remove the # and set as required.
# server_id = .....
#back_log = 600
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
max_connections = 3000
slow_query_log=1
slow_query_log_file=/usr/local/mysql/logs
log-error=/usr/local/mysql/logs/log-err
expire_logs_days = 30
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
红色的部分是为主从同步新加上去的
重启mysql ,创建访问权限:
MariaDB [(none)]> GRANT replication SLAVE ON *.* TO 'slave'@'192.168.1.189' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
注:上面配件的 ip 是从机器数据库。
3 将主库的数局导入到从库中,保证数据一致,现将Master的数据库锁定,以免数据复制的时候出现差异,同时查看当前master状态;
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000010
Position: 3441
Binlog_Do_DB: mydb-test
Binlog_Ignore_DB: mysql
1 row in set (0.000 sec)
ERROR: No query specified
上面关于master的状态
File: mysql-bin.000010
Position: 3441
这两个数据需要在slave中使用。
新开一个shell来导出数据
[root@localhost mysql]# bin/mysqldump -u root -p mydb-test > /home/download/mydb-test.sql
二: slave数据库配置:
my.cnf 配置如下:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /var/lib/mysql/mysql.sock
basedir = /usr/local/mysql
datadir= /usr/local/mysql/data
skip_name_resolve = 1
innodb_file_per_table = 1
log_error = /usr/local/mysql/logs/error
expire_logs_days = 7
back_log = 600
max_connections = 3000
max_connect_errors = 6000
external-locking = FALSE
max_allowed_packet = 32M
thread_cache_size = 300
query_cache_size = 64M query_cache_limit = 4M
query_cache_min_res_unit = 2k
transaction_isolation = READ-COMMITTED
key_buffer_size = 2048M lower_case_table_names = 1
server-id = 2
log_bin=mysql-bin
binlog-do-db=mydb-test
binlog-ignore-db=mysql
[mysqld_safe]
log-error=/usr/local/mysql/logs/mysql_old.err
pid-file=/usr/local/mysql/logs/mysqld.pid
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
以上红色是新增加的内容
重启服务器,登录进入,创建数据库,注意编码格式,和主库一样。
导入刚才的sql脚本:
MariaDB [mydb-test]> source /home/mydb-test.sql;
重登登录数据库,
MariaDB [mysql]> change master to master_host='192.168.1.180',master_user='slave',master_password='123456',master_log_file='mysql-bin.000010',master_log_pos=3441;
MariaDB [mysql]> start slave; #开始启动slave
说明:
master_host: 主服务器ip
master_user和master_password : 主数据库中通过 GRANT replication设置的值
master_log_file和master_log_pos 主数据库中通过SHOW MASTER STATUS中显示的File和Position
回到主服务器:登录master书库,解锁数据库
MariaDB [(none)]> unlock tables;
3:查看从库状态:显示如下,标识已经成功。

解除主从复制关系
MariaDB [mysql]> stop slave;
QueryOK, 0 rowsaffected (0,00 sec)
MariaDB [mysql]> reset slave all;
QueryOK, 0 rowsaffected (0,04 sec)
RESET MASTER
功能说明:删除所有的binglog日志文件,且binlog从000001 开始记录,并将日志索引文件清空,重新开始所有新的日志文件。用于第一次进行搭建主从库时,进行主库binlog初始化工作;
但是如果当前是主数据库,且主从数据库正常的时候,千万不能用这种方式删除。
RESET SLAVE
功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件;
RESET SLAVE将使SLAVE忘记主从复制关系的位置信息。该语句将被用于干净的启动, 它删除master.info文件和relay-log.info 文件以及所有的relay log 文件并重新启用一个新的relaylog文件。
使用场景:当原来的主从关系被破坏之后,从库经过重新初始化后直接连接会报 ERROR 1201的错误,运行reset slave后,需要重新配置主从连接(重新执行change master);
slave_io_running 和 slave_sql_running 的状态必须是 yes,否则主从就出错了!
三: 常见问题合集
1.Slave I/O: error connecting to master 'backup@192.168.1.x:3306'-retry-time: 60 retries: 86400,Error_code:1045
解决方法:
从服务器上删除掉所有的二进制日志文件,包括一个数据目录下的master.info文件和hostname-relay-bin开头的文件。
master.info::记录了Mysql主服务器上的日志文件和记录位置、连接的密码。
2. Errorreading packet from server: File '/home/mysql/mysqlLog/log.000001' not found(Errcode: 2) ( server_errno=29)
解决方法:
由于主服务器运行了一段时间,产生了二进制文件,而slave是从log.000001开始读取的,删除主机二进制文件,包括log.index文件。
4.以下两中类型处理方法一样
4.1:
Error 'Duplicate entry '1' for key 1' on query. Default database: 'movivi1'. Query:'INSERT INTO `v1vid0_user_samename` VALUES(null,1,'123','11','4545','123')'
Error 'You have an error in your SQL syntax; check themanual that corresponds to your MySQL server version for the right syntax
4.2:
Error 'Can't find any matching row in the user table' on query. Default database: ''. Query: 'SET PASSWORD FOR 'slave'@'192.168.1.189'='*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9''
Mysql> Slave status\G;
Slave_SQL_Running 为 NO
解决方法:
Mysql > stop slave;
Mysql > set global sql_slave_skip_counter =1 ;
Mysql > start slave;
5. show slavestatus\G;
Master_Log_File: mysql-bin.000029
Read_Master_Log_Pos: 3154083
Relay_Log_File: c7-relay-bin.000178
Relay_Log_Pos: 633
Relay_Master_Log_File: mysql-bin.000025
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: club
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1594
Last_Error: Relay log read failure: Could not parse relaylog event entry.
The possible reasons are: the master's binary log is corrupted (you can check thisby running 'mysqlbinlog' on the binary log),
the slave's relay log is corrupted (you can check this byrunning 'mysqlbinlog' on the relay log), a network problem,
or a bug in the master's or slave'sMySQL code. If you want to check the master's binary log or slave's relay log,
you will be ableto know their names by issuing 'SHOW SLAVE STATUS' on this slave.
Skip_Counter: 0
Exec_Master_Log_Pos: 1010663436
这个问题原因是,主数据库突然停止或问题终止,更改了mysql-bin.xxx日志,slave服务器找不到这个文件,需要找到同步的点和日志文件,然后chage master即可。

浙公网安备 33010602011771号