一、問題描述
版本5.6/5.7,最近遇到一個問題如下:
在從庫端設置如下設置這兩行
replicate-ignore-db=mysql
replicate-ignore-db=information
會出現(xiàn)問題1如下:
- 如果用戶修改自己的密碼,某些情況下不能進行主從同步
- 管理修改密碼同樣某些情況下不能進行主從同步
在從庫端設置再加上一行坷澡,會出現(xiàn)問題2,如下:
replicate_wild_ignore_table=mysql.%
則修改密碼的操作必定不能同步含蓉。對于設置了從庫端的replicat ignore而言過程如下:
主庫binlog(完整)->從庫relay log(完整) ->apply event(應用過濾規(guī)則)
先匹配ignore-db然后匹配table進行過濾频敛。詳細過濾規(guī)則參考:
- 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)則會根據(jù)這個db進行過濾差油。
我們知道對于普通用戶來講一般能夠看到information_schema和自己的db拗军,如果用戶使用:
use information_schema
alter user identified by ;
則這個操作將會在從庫過濾掉任洞。其次對于管理員賬戶而言能夠看到的庫更多包含mysql庫,同樣存在這個問題发侵。
因此只要用戶(包括管理員)通過use 操作進行了schema然后修改用戶交掏,那么則根據(jù)匹配規(guī)則有可能過濾掉。
三刃鳄、分析問題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規(guī)則都體現(xiàn)在rpl_filter這樣一個全局對象上如下,數(shù)據(jù)結構就是Rpl_filter:
Rpl_filter* rpl_filter;
有感興趣的可以研究一下齿梁,對于過濾規(guī)則的代碼我也沒有深入研究過催植,但是應該難度偏小。