环境说明:
主机 |
IP |
MySQL版本 |
端口 |
复制帐号 |
复制密码 |
Master1 |
192.168.1.225 |
5.7.25 |
3306 |
repl |
123456 |
Master2 |
192.168.1.100 |
5.7.25 |
3306 |
repl |
123456 |
Slave |
192.168.1.240 |
5.7.25 |
3306 |
Master1配置文件:
[mysqld]
user = mysql
socket = /tmp/mysql3306.sock
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
server-id = 2253306
log_bin = /data/mysql/mysql3306/logs/mysql-bin
log_slave_updates = 1
binlog_format = ROW
gtid_mode = on
enforce_gtid_consistency = on
Master2配置文件
[mysqld]
user = mysql
socket = /tmp/mysql3306.sock
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
server-id = 1003306
log_bin = /data/mysql/mysql3306/logs/mysql-bin
log_slave_updates = 1
binlog_format = ROW
gtid_mode = on
enforce_gtid_consistency = on
Slave配置文件
[mysqld]
user = mysql
socket = /tmp/mysql3306.sock
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
server-id = 2403306
log_bin = /data/mysql/mysql3306/logs/mysql-bin
log_slave_updates = 1
binlog_format = ROW
gtid_mode = on
enforce_gtid_consistency = on
master_info_repository =TABLE #多源复制只能配置为table
relay_log_info_repository =TABLE #多源复制只能配置为table
在Master1,Maste2上创建复制帐号:
mysql>set sql_log_bin=0;
mysql> grant replication slave on *.* to ‘repl’@’192.168.1.240’ identified by ‘123456’;
mysql>set sql_log_bin=1;
在Master1上创建测试数据库test1,测试表t1
mysql> create database test1;
mysql> use test1;
mysql> create table t1 (id int);
mysql> insert into t1 values(1);
在Master2上创建测试数据库test2,测试表t2
mysql>create database test2;
mysql> use test2;
mysql> create table t2(id int);
mysql> insert into t2 values(2);
备份导出Master1,Master2上的test1,test2
Master1
#mysqldump -S /tmp/mysql3306.sock –single-transaction –master-data=2 test1 > test1.sql
Master2:
#mysqldump -S /tmp/mysql3306.sock –single-transaction –master-data=2 test2 > test2.sql
备份时报的警告信息可以忽略掉:
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don’t want to restore GTIDs, pass –set-gtid-purged=OFF. To make a complete dump, pass –all-databases –triggers –routines –events.
Slave配置
1.先在Slave上创建test1,test2这两个数据库
mysql>create database test1;
mysql>create database test2;
2.导入test1数据
#mysql -S /tmp/mysql3306.sock test1 < test1.sql
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
解决办法:在Slave上先执行reset master操作,后面等数据都导入之后再手动指定,后面会说。
mysql>reset master;
#mysql -S /tmp/mysql3306.sock test1 < test1.sql; #这个时候导入就不会报错了
3.导入test2的数据
mysql> reset master; #因为导入test1数据GTID_EXECUTED又生成了,要再次清理。
#mysql -S /tmp/mysql3306.sock test2 < test2.sql;
4.获取sql文件中gtid_purged的值,并在Slave上手动设置
#grep -m 1 “GTID_PURGED” test1.sql
SET @@GLOBAL.GTID_PURGED=’31315146-adbb-11e9-b99a-525400c3d235:1-3′;
#grep -m 1 “GTID_PURGED” test2.sql
SET @@GLOBAL.GTID_PURGED=’e712f244-adba-11e9-abe6-525400ebcfd9:1-3′;
mysql> reset master; #因为导入test2数据GTID_EXECUTED又生成了,要再次清理。
mysql> set @@global.GTID_PURGED=’31315146-adbb-11e9-b99a-525400c3d235:1-3,e712f244-adba-11e9-abe6-525400ebcfd9:1-3′ #注意把两个库的值都要设置,以逗号分隔。
5.配置主从同步
1.设置Master1,Master2的信息
mysql>change master to master_host=’192.168.1.225′,master_port=3306,master_user=’repl’,master_password=’123456′,master_auto_position=1 for channel ‘Master1’;
mysql>change master to master_host=’192.168.1.100′,master_port=3306,master_user=’repl’,master_password=’123456′,master_auto_position=1 for channel ‘Master2’;
2.配置同步过滤规则
因为Master会把所有的gtid推给Slave,如果只是部分库做同步的话,从库执行了不存在相关库的gtid时就会出错。
mysql> change replication filter replicate_do_db=(test1,test2);
6.启动Slave
mysql> start slave for channel ‘Master1’; #对应Master1的同步
mysql> start slave for channel ‘Master2’; #对应Master2的同步
7.验证
1.查看主从同步连接是否异常,有报错先解决报错再进行第二步测试。
mysql> show slave status\G;
2.在Master1上的test1库t1表、Master2上的test2库t2表分别写入一条记录,查看是否同步到Slave。