mysql 多源复制 过滤_MYSQL 多源复制,过滤复制与应用场景

Mysql的使用中,会伴随着一个其他数据库中很少被提到的问题,数据融合。ORACLE ,SQL SERVER ,PG 你可以去分区表,MYSQL 中遇到这样的问题大多去分库分表去解决,虽然现在有了TIDB 可以进行MYSQL 的后续的数据融合,但如果数据量不大的情况下,或者有些 MYSQL 8的新支持的语法需求等等,多源复制还是一个好的选择。

缺点也是显而易见的,多源复制复制不会解决你复制中可能由于你不注意产生的复制的冲突问题。例如重名的数据库,部署系统数据的冲突。下面就来看看如何来多源复制,和其中的一些 “坑”。

首先目前大部分单位的MYSQL 基本上已经启用了 GTID ,这里下面的复制中,全部使用 GTID 的方式进行连接.

测试的机器有

192.168.192.200

192.168.192.202

192.168.192.201

首先备份 200 和 202 上的数据库,备份的时候,仅仅只备份了需要进行数据同步的数据库,并未进行全部备份,而做多源复制中,也需要这样做,否则做第一个复制还好,后面的复制就不好做了,会有一些问题。

备份是通过mydumper 进行的备份,而mydumper 目前最新的0.95 是TIDB 的团队在维护,应该是靠谱的在mysql 5.7及以下版本(如有不对请指正)

在 200 的机器上

f0130aafd3aead49c9ecc5d88a3de02f.png

在202 的机器上

5014cafcc283b4a672da02badb73a5ef.png

在201 的机器上恢复相关的数据库

40db245b8f501b2f9dcd0fccdda33215.png

恢复数据库

40db245b8f501b2f9dcd0fccdda33215.png

同理恢复第二个数据库到winner 数据库

恢复后的数据库 201 是这样的。

2902187783591ed1c20001f7783d10f9.png

下面我们来建立与两台MYSQL 主的复制

CHANGE MASTER TO MASTER_HOST='192.168.198.200', MASTER_USER='admin', MASTER_PORT=3306, MASTER_PASSWORD='XXXX', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'C200';

CHANGE MASTER TO MASTER_HOST='192.168.198.202', MASTER_USER='admin', MASTER_PORT=3306, MASTER_PASSWORD='XXXX', MASTER_AUTO_POSITION = 1 FOR CHANNEL 'C202';

通过上面两个语句,201 就已经与 200, 201 两台机器建立的复制的关系。

启动复制 start slave;  查看201 上的复制状态

5ac8ace5cc1f34512a3f77d6aaead943.png

33fa6efd6c24ebd73b766edffbd7239b.png

我们可以看到对于两台主机的复制是OK 的。而坑其实就不远了

1  举例,为了管理mysql 方便,我们在每台MYSQL 上建立管理库monitor

那么马上问题就在数据汇聚库 201 上出现问题,我先后在 200 ,和 202 两台机器上建立monitor 数据库,按照逻辑来说,201 的复制 关于202 的复制应该会停,但由于特殊的设置,并未停止复制。但201 的错误日志,会毫不留情的记录这个错误。

下面的错误日志报告 202   主机创建数据库的命令失败了

63b9b9f7bccebf4bad5bc0e6f83239dd.png

其实这就是配置中,让复制中的DDL 语句的错误忽略产生的结果,但如果我们继续操作一些非DDL 的操作,则复制就不会继续工作了。

我们创建一个表,test1 分表在 200 和 202 机器上,然后插入数据,201 的复制报错了。原因是主键重复。

99d2318bd8a0bc8050aa9f77cc166737.png

通过这个事例想说明的问题

1  如果多源复制,建议还是DDL 的错误在多源复制的机器上更宽容一些。

2  不建议有类似比如每个数据库都有的数据库并在这个数据库里面还有同样的表和主键设置

那如果有类似的问题怎么办,必须要在每个MYSQL的物理服务器上有相同命名的数据库,而这个库可以不进行复制。

那就祭出我们的复制过滤来解决问题,原理就是我们对传递过来的日志进行过滤,凡是不在我们允许的复制的数据库list  中的都不进行复制。

2ad4ce6785ced2808793bc582923c76e.png

我们先停止201 上的复制,stop slave; 然后将201 上的monitor 数据库删除

在201上执行 下图的语句

266674012c7688fcf82dee105b7430be.png

启动复制,然后我们在原来的 200 和 202 上在对monitor 数据库中的表进行操作,

202 上的表

5926d578e4b2c0f82cbd9d3e2d70608a.png

200 上的表

89be393f9b9b3a4c03cfd53d94b008c8.png

而 201 上的可以删除 monitor 数据库,复制将过滤一概不是 employees winner 数据库之外的数据。

下图,201 已经没有monitor  数据库

d37c420e4be87f56d037018d84e63ba7.png

并且201上的复制是正常工作的

dd0280283a3e37209c1209fcb46b64f7.png

ec38b2de484460451ef955385e8fbacd.png

MYSQL 的多源复制,其实是一个比较好的功能,也是针对某些分库操作后的数据再次融合和简单的数据联合查询而使用到的功能,当然其中的坑也很多,使用中不注意就会有各种复制的问题。

98a36da42dea64e9af61d4772ec5a75b.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值