環境說明:
主機 | 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。