主从过滤必须在从库配置且需先停sql线程;replicate_*参数仅从库生效,修改后须执行stop slave sql_thread;再start slave sql_thread;并验证seconds_behind_master归零,避免同步中断或数据错乱。

主从过滤必须在从库配置,且需停SQL线程
所有 replicate_* 类配置(如 replicate_do_db、replicate_ignore_table)只在从库生效,且必须先执行 STOP SLAVE SQL_THREAD; 才能安全修改。直接改配置文件后重启 MySQL 会丢失 relay log 位置,导致同步中断或数据错乱。
- 错误做法:改完
my.cnf就systemctl restart mysqld - 正确流程:停 SQL 线程 → 修改配置 →
START SLAVE SQL_THREAD;→ 验证SHOW SLAVE STATUS\G中Seconds_Behind_Master是否归零 - 特别注意:
replicate_wild_*规则(如replicate_wild_ignore_table)优先级高于replicate_do_*,冲突时以通配规则为准
库级过滤用 replicate_do_db 和 replicate_ignore_db 要小心 USE 语句
这两个参数不按实际表名匹配,而是依赖当前会话的 USE db_name。比如主库执行 INSERT INTO db1.table_01 ... 但会话当前没 USE db1,该语句会被忽略——哪怕目标表在白名单库里。
- 适用场景:只同步特定库、且业务代码严格保证每个 DML 前都有
USE - 风险点:存储过程、跨库 JOIN、未显式
USE的应用连接会绕过过滤 - 更稳替代:用
replicate_wild_do_table = "db1.%",按库+表名双重匹配,不受会话上下文影响
表级精确过滤优先选 replicate_wild_ignore_table
想忽略日志表(如 db1.log_01)或测试表(如 db2.test_01),直接写 replicate_ignore_table = db1.log_01 会失败——MySQL 不支持多库多表组合写法,且对大小写敏感。
- 必须用通配形式:
replicate_wild_ignore_table = "db1.log_01"或"db2.test_01" - 支持模糊:
"db1.log_%"可批量忽略所有log_开头的表 - 多个规则要分行写,不能逗号分隔;每行一个
replicate_wild_ignore_table配置项 - 验证方法:主库更新被忽略的表后,查从库对应表是否无变化,再确认
SHOW SLAVE STATUS\G的Exec_Master_Log_Pos仍在推进
混合过滤下务必验证 relay_log 是否被跳过
当同时配置了 replicate_do_db 和 replicate_wild_ignore_table,MySQL 实际执行顺序是:先按库规则判断是否进入 relay log,再按表规则决定是否执行。这意味着被忽略的表变更仍会写入 relay log,只是 SQL 线程跳过执行——这会增大 relay log 体积,还可能因 relay log 满触发复制中断。
- 关键检查:
SHOW SLAVE STATUS\G中Relay_Log_Space是否持续增长(尤其在大量写被忽略表时) - 缓解方式:定期清理旧 relay log(
PURGE RELAY LOGS BEFORE 'xxx';),或改用纯replicate_wild_do_table白名单模式,从源头减少日志写入 - 真正“不传输”的唯一办法是主库设置
binlog_ignore_db,但这会影响所有从库,不可动态调整,慎用











