MySQL5.7 基於GTID的多源複製實踐

環境說明:

主機

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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章