修改 replicate-wild-ignore-table 必须重启 sql 线程,仅 set global 不生效;需执行 stop slave sql_thread → set global → start slave sql_thread(或用 change replication filter),并验证匹配语句是否被忽略。

修改 replicate-wild-ignore-table 时必须重启 SQL 线程
直接 SET GLOBAL replicate_wild_ignore_table = 'db1.log_%' 不会生效,SQL 线程不会自动重载规则。这是最常被误踩的坑——SHOW VARIABLES LIKE 'replicate%' 能看到新值,但 SHOW SLAVE STATUS\G 里同步行为完全不变。
原因很明确:MySQL 复制过滤器只在 SQL 线程启动时读取全局变量初始化一次,运行中不监听变更。官方文档写得清楚:“Changes to replication filter options take effect only after the slave SQL thread has been stopped and restarted.”
- 必须按顺序执行:
STOP SLAVE SQL_THREAD→SET GLOBAL ...→START SLAVE SQL_THREAD - 只停
SQL_THREAD,保留IO_THREAD持续拉取 binlog,避免主从延迟突增 - 验证是否生效:主库写一条匹配规则的语句(如
INSERT INTO db1.log_20260811 VALUES (1,'x')),查从库对应表是否没新增数据
为什么优先用 replicate-wild-ignore-table,而不是 replicate-ignore-db
replicate-ignore-db 行为依赖当前 USE 上下文,在 ROW 格式 binlog 下极易失效。比如主库执行 INSERT INTO db1.log_20260811 SELECT * FROM db2.src,即使目标表在黑名单里,只要没先 USE db1,这条语句就会被 SQL 线程照常执行。
replicate-wild-ignore-table 直接匹配事件中的库名和表名字段,不受 USE 或 binlog_format 影响,对日志表、分表等动态命名场景更可靠。
- 通配符只支持
%(任意长度)和_(单字符),例如db1.log_%合法,db1.log*不合法 - 多个规则用逗号分隔,但 MySQL 不保证匹配顺序;冲突时以“最具体”为准(
db1.log_2026%比db1.log_%更具体) - 注意大小写:Linux 下表名区分大小写,
DB1.LOG_%不会匹配db1.log_%
在线改过滤规则时别碰 replicate-do-db
replicate-do-db 看似简单,实则反直觉。它不是“只同步这个库”,而是“仅当当前 USE db_name 时才执行该库的语句”。这意味着:
-
USE db2; INSERT INTO db1.t1 ...→ 即使目标是白名单库,也会被跳过 -
mysqldump --databases db1 db2导出的脚本可能漏掉部分库,因为 dump 过程中USE切换不可控 - 跨库 DML(如
UPDATE db1.t1 JOIN db2.t2)基本无法预测是否被过滤
除非你 100% 控制所有应用连接都显式 USE 且永不跨库操作,否则生产环境应避开 replicate-do-db 和 replicate-ignore-db。
用 CHANGE REPLICATION FILTER 替代 SET GLOBAL 更稳妥
MySQL 5.7+ 支持 CHANGE REPLICATION FILTER,语法更清晰、作用域更明确,且能批量设置多个规则:
STOP SLAVE SQL_THREAD;
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE = ('db1.log_%', 'db1.tmp_%');
START SLAVE SQL_THREAD;
相比 SET GLOBAL,它避免了参数名拼写错误(比如把 replicate_wild_ignore_table 写成 replicate_wild_ignored_table),也更容易做配置回滚(再次 CHANGE 覆盖即可)。
注意:CHANGE REPLICATION FILTER 修改的是当前复制通道的过滤器,不影响其他通道;如果用了多源复制,需指定 FOR CHANNEL 'xxx'。
真正麻烦的不是改哪条命令,而是改完后没验证就上线——哪怕只漏同步一张日志表,几个月后磁盘就可能被撑爆。每次修改后,务必用真实业务语句触发一次匹配,再查从库确认没写入。











