Jun 14 2013

MYSQL 主从同步文档的大坑

Category: 技术ssmax @ 15:15:42

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.

尽量不要混合使用,除非你已经测试过了。。。