
GreatSQL一个关于主从复制的限制描述与规避
一、背景
分享一个在项目运维中遇到的一个主从复制限制的一个坑,项目的架构为主集群+灾备集群,每个集群为一主两从模式。主集群到灾备集群的同步为主从复制的方式,根据业务需求灾备集群需要忽略系统库跟某些配置表,所以才会触发此限制,而这个限制如果我们之前没有遇到过,那么排查起来也是相对不易的。
二、限制描述
1、主从同步出现报错
根据slave status状态信息可以看出
- 报错的GTID为:
'9e668a93-2618-11ee-93ee-bc16954181bb:47508257'
- 应用的主集群的binlog为:
greatsql-bin.000988
- 灾备集群的relay log为:
greatsql-relay.002963
详细信息查看performance_schema.replication_applier_status_by_worker
表
2、查看错误的详细信息
上述信息说明根据performance_schema.replication_applier_status_by_worker
表中的详细错误信息可以发现为灾备集群abs_xxx.tmp_xxx_info
表不存在,导致同步报错
3、问题分析
3.1、确认灾备集群中目标表是否存在
结论:灾备集群中目标表的确不存在
3.2、根据主从报错信息解析主集群binlog,报错的SQL
解析主集群binlog
结论:根据复制的报错信息得知具体的GTID号以及主集群的binlog文件,解析binlog得知此事务为一条INSERT语句,语句中的目标表与performance_schema.replication_applier_status_by_worker
表中信息一致
3.3、寻找主集群目标表binlog中是否有建表语句
在同一binlog日志中寻找建表语句
结论:在主集群的binlog日志中找到了目标表的建表语句,说明主集群执行DDL时并没有关闭binlog日志,那么继续查看在灾备集群的中继日志中是否存在DDL语句
3.4、解析灾备集群的中继日志,确认是否拉取到灾备集群
结论:灾备集群的中继日志中存在DDL建表语句,说明并不是IO线程出了问题
3.5、排查复制配置的忽略库表
结论:忽略库表中并不包含目标表,但是根据以上解析日志发现,在主集群binlog日志中建表语句之前有个use information_schema/!/;
的语句,此库为同步忽略的系统库,因此触发了GreatSQL的规范限制,在忽略库下对未忽略进行操作Statement模式下记录语句默认不起作用 (详情:https://dev.mysql.com/doc/refman/5.7/en/replication-options-replica.html#option_mysqld_replicate-do-db)
4、解决同步报错
在灾备集群创建目标表
结论:在灾备集群创建目标表后重启复制恢复成功
三、限制规避
1、第一种规避方式
执行DDL时进入目标库
说明:在应用连接数据库时有可能默认就是information_schema
库,而此环境将系统库全部忽略,所以为了规避类似的问题,请在执行SQL语句时请先use到目标表的目标库。
2、第二种规避方式
修改主从复制配置,以下步骤为测试环境
关闭灾备集群在复制同步
修改忽略库
修改忽略表
启动同步
测试验证
主集群:
灾备集群:
说明:复制配置中参数Replicate_Ignore_DB
设置为空,将replicate_wild_ignore_table
参数设置为shema_name.%
的方式也可以规避类似的问题
四、特别说明
- 在MySQL 5.7跟8.0版本也存在此限制
Enjoy GreatSQL :)
文章转载自公众号:GreatSQL社区
