replicate_ignore_db 在主从复制中不可靠,仅对 SBR 格式生效且依赖 USE 库,跨库操作即失效;MySQL 8.0.26+ 已弃用,应改用 replicate_do_table 白名单精确控制,GTID 模式下须启动前静态配置。

replicate_ignore_db 在主从复制中根本不会按你想象的方式工作
MySQL 的 replicate_ignore_db 是个高危配置项,它不看 SQL 语句实际操作哪个库,只看当前 session 的 USE 库。比如你在 USE db1 下执行 INSERT INTO db2.t1 VALUES (1),这条语句仍会被复制——因为“当前库”是 db1,而 db2 不在 ignore 列表里,规则压根没触发。
- 它只对基于语句(SBR)格式的 binlog 生效;在 ROW 格式下,该参数被完全忽略
- 如果应用习惯用跨库语法(如
db1.t1、db2.t2),这个参数基本失效 - MySQL 8.0.26+ 已将该参数标记为 deprecated,未来版本会移除
真正可控的过滤方式:replicate_replicate_do_db / replicate_do_table
想精确控制同步范围,必须换思路:用白名单代替黑名单,且优先使用表级粒度。MySQL 支持多组 replicate_do_table,每条匹配 db_name.table_name 格式,支持通配符(% 和 _),但注意通配符只作用于表名,不能用于库名。
-
replicate_do_table=test_db.users—— 只同步 test_db.users 表 -
replicate_do_table=test_db.log_%—— 同步 test_db 下所有 log_ 开头的表 - 多个表需重复写多行配置,不能用逗号分隔
- 如果同时设置了
replicate_do_db和replicate_do_table,后者优先级更高
mysqldump 导出时漏掉 –ignore-table 导致从库初始化失败
用 mysqldump 初始化从库时,如果源库包含大量不需要同步的库或表(比如监控库 percona、临时库 tmp_*),但 dump 命令没加 --ignore-table,就会把不该有的结构和数据也倒进去,后续复制可能因表不存在、字段冲突或权限问题卡住。
- 正确做法:
mysqldump --all-databases --ignore-table=monitoring.metrics --ignore-table=tmp_db.% -u root -p > full.sql -
--ignore-table必须写成db_name.table_name格式,通配符只支持在表名位置(如tmp_db.%合法,%.users非法) - 导出后务必检查
full.sql中是否还残留被忽略对象的CREATE TABLE或INSERT语句——有些版本的 mysqldump 对通配符处理不彻底
GTID 环境下 filter 配置必须在从库启动前完成
开启 GTID(gtid_mode=ON)后,MySQL 要求所有复制过滤规则必须在从库首次启动复制前就写进配置文件,并且不能在运行时通过 CHANGE REPLICATION SOURCE TO 动态修改——否则会报错 ERROR 3094 (HY000): The @@@@ is not allowed when @@gtid_mode = ON。
- 配置必须写在
[mysqld]段下,重启 mysqld 生效 - 改完配置后,先停掉复制:
STOP REPLICA;,再重启 mysqld,最后START REPLICA; - 误在 GTID 模式下热加
replicate_do_table会导致复制线程永久中断,只能重搭