目前大部分公司的MySQL项目都已经实现了分库分表的功能,但一部分聚合数据的查询需求还需要从MySQL中实现,MySQL的多源复制功能就应运而生。
多源复制,顾名思义,就是将多个主库的数据同步复制到一个库中。多个主库以通道CHANNEL的形式进行同步复制。
要想使用多源复制,需要先设置两个参数:
mysql> SET GLOBAL master_info_repository = 'TABLE';
mysql> SET GLOBAL relay_log_info_repository = 'TABLE';
这两个参数是存储的同步复制信息,如果设置成file模式,则信息是同步到外部的master.info和relay-log.inf文件中,这就有可能在数据库非正常关闭下造成数据的丢失。设置成TABLE形式,则由于Innodb类型支持事务,相对File形式的存储方式更安全。
在线多源复制搭建过程:
假设多源库为51.31,现需要在这套多源库中添加同步复制51.32主库的ORDER库数据。
1.备份主库51.32的ORDER库数据,需要注意的是备份时候要记录上主库的GTID信息
mysqldump -uroot -pXXXXX --single-transaction --master-data=2 --set-gtid-purged=on -B ORDER >/data/backup/multi.sql
2.在多源库51.31上恢复51.32备份出的ORDER库数据
Mysql –uroot –p ORDER < multi.sql
3.停掉所有通道的SLAVE进程并记录已经执行过的GTID信息
mysql> stop slave all;
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.001655
Position: 826502997
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 00b7d16f-8604-11e7-b573-1402ec0540e4:1-304807418,
015c6ea4-8604-11e7-a6a7-1402ec0540cc:1-43127553,
126e786f-12c9-11ea-b5b8-9cdc71bfe56c:1-2,
2b97ad6b-a45d-11e7-96f3-30e1715cb188:1-24,
45415155-eb94-11e7-a4f8-0242ac11000a:1,
5aecd158-8321-11e7-9a83-30e17155e4cc:1-395309607
1 row in set (0.00 sec)
4.清空并重置多源库的复制信息,意思告诉从库各个通道都应用到哪个GTID点,这时候需要加上ORDER备份库文件中保存的GTID信息
fe4453f6-bb2d-11e8-bfc9-005056b7170a:1-1126907
mysql> reset master;
mysql> set @@GLOBAL.GTID_PURGED
='00b7d16f-8604-11e7-b573-1402ec0540e4:1-304807418,
015c6ea4-8604-11e7-a6a7-1402ec0540cc:1-43127553,
126e786f-12c9-11ea-b5b8-9cdc71bfe56c:1-2,
2b97ad6b-a45d-11e7-96f3-30e1715cb188:1-24,
45415155-eb94-11e7-a4f8-0242ac11000a:1,
5aecd158-8321-11e7-9a83-30e17155e4cc:1-395309607,
fe4453f6-bb2d-11e8-bfc9-005056b7170a:1-1126907';
5.CHANGE并命名51.32的复制通道信息
mysql> change master to master_host='X.X.51.32',master_port=3306,master_user='rep',master_password='XXXXX',MASTER_AUTO_POSITION=1 FOR CHANNEL 'mysql-m3';
6.重启各个SLAVE通道并检查复制状态是否正常
mysql> start slave for CHANNEL 'mysql-m3';
......
mysql -uroot -p -S /tmp/mysql.sock -e "SHOW SLAVE STATUS FOR CHANNEL 'mysql-m3'\G"|egrep "Slave_IO_Running|Slave_SQL_Running"
或者
mysql> SHOW SLAVE STATUS FOR CHANNEL 'mysql-m3'\G
如果想要过滤或者同步特定的某一个库,需要设置参数:
replicate-ignore-db = mysql
replicate-wild-ignore-table = mysql.%
需要特别注意的是,这两个参数需要一起设置,如果只设置replicate-wild-ignore-table,某些情况下开发环境会自带切库的动作导致复制报错。
欢迎关注公众号