MySQL replicate-ignore-db详解
[attach]274[/attach]
官方的解释是:在主从同步的环境中,replicate-ignore-db用来设置不需要同步的库。解释的太简单了,但是里面还有很多坑呢。
生产库上不建议设置过滤规则。如果非要设置,那就用Replicate_Wild_Ignore_Table: mysql.%这种方式。实验探坑如下:
第一种情况 从库: replicate-ignore-db = mysql 主库: use mysql CREATE TABLE test.testrepl1( id int(5))ENGINE=INNODB DEFAULT CHARSET=UTF8; 从库不会同步。坑! 第二种情况 从库: replicate-ignore-db = mysql 主库: use test CREATE TABLE mysql.testrepl2( id int(5))ENGINE=INNODB DEFAULT CHARSET=UTF8; 从库不会同步。坑! 第三种情况 use test update mysql.user set user = 'testuser5' where user = 'testuser1'; 从库会同步 第四种情况 grant all on [i].[/i] to testnowild@'%' identified by 'ge0513.hudie'; 从库会同步 第二大类: Replicate_Wild_Ignore_Table: mysql.% 第五种情况 主库: use test update mysql.user set user = 'testuser1' where user = 'testuser5'; 从库没有同步。坑! 第六种情况 主库: grant all on [i].[/i] to testwild@'%' identified by 'ge0513.hudie'; 从库没有同步。坑!
在复制中,如果实在要启用参数 replicate-ignore-db / replicate-do-db 后想要让复制正常运行,只需在连接数据库后不执行 "use db" 语句即可,如果是在php中,连接数据库后,不再执行 mysql_select_db() 即可。
这是因为复制机制会判断是否使用了 replicate-do(ignore)-db 参数,然后判断当前数据库是否为指定的数据库,如果是,才执行相应的binlog,否则略过。如果不指定数据库的话,就可以忽略这个环节了。文章参考:链接1 链接2