GreatSQL社区

搜索

baguai

MySQL:设置replicate ignore遇到的问题

baguai 已有 480 次阅读2023-1-5 17:26 |个人分类:MySQL学习|系统分类:用户实践| 数据库, MySQL

作者简介:高鹏,笔名八怪。《深入理解MySQL主从原理》图书作者,同时运营个人公众号“MySQL学习”,持续分享遇到的有趣case以及代码解析!

一、问题描述

版本5.6/5.7,最近遇到一个问题如下:

在从库端设置如下设置这两行

replicate-ignore-db=mysql
replicate-ignore-db=information

会出现问题1如下:

  • 如果用户修改自己的密码,某些情况下不能进行主从同步
  • 管理修改密码同样某些情况下不能进行主从同步

在从库端设置再加上一行,会出现问题2,如下:

replicate_wild_ignore_table=mysql.%

则修改密码的操作必定不能同步。对于设置了从库端的replicat ignore而言过程如下:

主库binlog(完整)->从库relay log(完整) ->apply event(应用过滤规则) 

先匹配ignore-db然后匹配table进行过滤。详细过滤规则参考:

  • Evaluation of Database-Level Replication and Binary Logging Options

二、分析问题1

首先如果设置了

replicate-ignore-db=mysql
replicate-ignore-db=information

那么对于DDL语句而言,由于没有map event存在,则会通过query event中的DB进行过滤,也就是说当前在哪个DB下面(use db)则会根据这个db进行过滤。我们知道对于普通用户来讲一般能够看到information_schema和自己的db,如果用户使用:

use information_schemaalter user identified by ;

则这个操作将会在从库过滤掉。其次对于管理员账户而言能够看到的库更多包含mysql库,同样存在这个问题。因此只要用户(包括管理员)通过use 操作进行了schema然后修改用户,那么则根据匹配规则有可能过滤掉。

三、分析问题2

如果设置如下:

replicate-ignore-db=mysql
replicate-ignore-db=information
replicate_wild_ignore_table=mysql.%

如果我们修改密前不进行use db,这个及时修改密码依旧会被过滤掉,因为不管是建立用户还是修改密码,最后都将转换为对mysql.user表的操作,这种情况下虽然ignore db不会被匹配到,但是ignore table却会匹配到。如下:

调用栈:

有兴趣的童鞋可以将断点打到rpl_filter.tables_ok上自行观察就可以了,实际上我们的整个replicate-ignore规则都体现在rpl_filter这样一个全局对象上如下,数据结构就是Rpl_filter:

Rpl_filter* rpl_filter;

有感兴趣的可以研究一下,对于过滤规则的代码我也没有深入研究过,但是应该难度偏小。


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-4-18 09:56 , Processed in 0.013541 second(s), 8 queries , Redis On.
返回顶部