本质:多主一从
运用场景:从库用于汇总数据
架构
主库1:172.17.100.106
主库2:172.17.100.107
从库:172.17.100.108
情况稍微有点复杂:106-108这3个库曾经都是100这个主库的从库,之后经过改造107和108又成为了106的从库,现在需要把108改成106和107的从库
多源复制的搭建
#分别登录2个主库
106库信息如下
107库信息如下
在106库创建账户并授权
grant replication slave on *.* to repl@'%' identified by 'repl';
执行106库上qimo这个数据库的导出
mysqldump -S /tmp/mysql3306.sock -uroot -p密码 -d qimo > qm.sql
在107库创建账户并授权
grant replication slave on *.* to bak@'%' identified by 'bak';
执行106库上sbtest这个数据库的导出
mysqldump -S /tmp/mysql3306.sock -uroot -p密码 -d sbtest > sb.sql
同时将2个sql文件拷贝到108库服务器上,初始化108数据库
108库创建repl和bak账号,并授权
grant replication slave on *.* to repl@'%' identified by 'repl';
grant replication slave on *.* to bak@'%' identified by 'bak';
创建sbtest和qimo2个数据库
导入qimo库
mysql -uroot -p密码 qimo < qm.sql
执行reset master,再导入sbtest库
mysql -uroot -p密码 sbtest < sb.sql
★设置GTID_PURGED信息★
严格来说,这里应该是找到sb.sql和qm.sql,查看这2个sql文件第24行的GTID_PURGED信息;(下图是107库导出的sb.sql里面的信息)
(由于我在导出106库之前执行了reset master,所以106导出的qm.sql里面并没有GTID_PURGED信息,106的通过前面的show master status来获取)
这里把106的GTID_PURGED信息称为106GP,对应的107的就是107GP
所以在从库上这一步操作应该是
set global gtid_purged='106GP,107GP';
从上面2个图中可以发现106GP和107GP中都有“867834d3-5437-11e8-aba6-005056ba2eba”这个UUID对应的GTID,在这里需要取比较大的一个,也就是867834d3-5437-11e8-aba6-005056ba2eba:1-292003。
我之前在这里取了867834d3-5437-11e8-aba6-005056ba2eba:1-291992,结果在106库上对qimo库执行更新时,从库就出现了1032的报错
★综合106的GP和107的GP,从库上的操作如下★
reset master;
set global gtid_purged='850662d4-6eb6-11e8-bda3-005056ba38bb:1-6,867834d3-5437-11e8-aba6-005056ba2eba:1-292003,e7fab815-8339-11e8-a215-005056ba0d70:1-9';
#接下来将从库分别指向2个主库,与普通的GTID搭建不一样的是要设置一个通道
change master to master_host='172.17.100.106',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1 for channel 'ch1';
change master to master_host='172.17.100.107',master_user='bak',master_password='bak',master_port=3306,master_auto_position=1 for channel 'ch2';
start slave;
show slave status \G
这里应该会把2个通道的情况都显示出来,分别为双yes则表示设置成功。
也可以单独调试,比如对106主库的暂停
stop slave for channel 'ch1'\G
show slave status for channel 'ch1'\G
start slave for channel 'ch1'\G
报错一例
设置从库的gtid_purged的时候,没有写完整,只写了其中某一个主库的,比如写成下面这样
set global gtid_purged='850662d4-6eb6-11e8-bda3-005056ba38bb:1-6,867834d3-5437-11e8-aba6-005056ba2eba:1-292003';
(或者更弱智的只写了一行set global gtid_purged='850662d4-6eb6-11e8-bda3-005056ba38bb:1-6';)
则会出现1236的报错