MYSQL 主從同步文檔的大坑

http://dev.mysql.com/doc/refman/5.1/en/replication-rules-db-options.html

mysql 主從同步的參數

replicate-do-db   指定同步某個DB

如果大家有一個需求,只同步某一些DB,就需要用

replicate-do-db=dbA

replicate-do-db=dbB

ok,這裏還很明確,但是如果大家又想不同步dbA裏面某個表。。文檔裏面的坑就出現了

按照文檔的意思,如果 db level中沒有匹配到,就會轉入table level的匹配。ok,按照文檔,我配置成這樣:

replicate-do-db=dbB
replicate-ignore-table=dbA.question
replicate-wild-do-table=dbA.%

結果,dbA就全部不會同步了。。。但是根據文檔中的示意圖,理論上是可以的啊

其實坑就在這裏了,如果存在 replicate-do-db, 最後如果不是excute的結果,是不會進入 table level的判斷的。

所以要達到我們的需求,就需要這樣配置:

replicate-do-db=dbA

replicate-do-db=dbB
replicate-ignore-table=dbA.question
replicate-wild-do-table=dbA.%

看官看到這裏必定會問,爲什麼要用 replicate-wild-do-table 多此一舉呢?如果沒有了這一句,一切不是都很清晰嗎。。。

問題就是 replicate-do-db 只會同步 USE DB 之後的語句,並不會同步直接DB.table 非指定DB域的語句,所以很多時候,還是要加上 replicate-wild-do-table, 會穩妥一點。

好了,我們都以爲 replicate-do-db 和 replicate-wild-do-table 可以一起用,其實。。。這裏的坑更變態。

根據剛纔的規則,如果存在 replicate-do-db,語句必須在db級是execute的,纔會進入 table級別的判斷。。。所以,這裏的

replicate-wild-do-table 壓根就達不到大家預料的效果,比如大家USE dbC之後,再更新dbA中的數據,發現在

replicate-do-db=dbA

replicate-wild-do-table=dbA.%

這樣的配置中,根本達不到想要的效果,大家USE dbC之後,再更新dbA中的數據,結果還是沒有同步到從,所以最後,MYSQL的文檔寫了一句:

To make it easier to determine what effect an option set will have, it is recommended that you avoid mixing “do”and “ignore” options, or wildcard and nonwildcard options. An example of the latter that may have unintended effects is the use of --replicate-do-db and --replicate-wild-do-table together, where --replicate-wild-do-table uses a pattern for the database name that matches the name given for --replicate-do-db.

儘量不要混合使用,除非你已經測試過了。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章