答案:replicate-do-table是语句级白名单,非表数据级开关。它匹配SQL中显式写出的库表名(如db1.t1),不依赖USE语句,但跨库操作易失配;需STOP SLAVE SQL_THREAD后用CHANGE REPLICATION FILTER在线修改,不支持通配符;与ignore规则冲突时后者优先;生产推荐改用replicate-wild-do-table。
replicate-do-table 只对跨库操作有效,不是“只同步某张表”
看似直白,但它的行为和多数人想的不一样:它**不检查 SQL 语句的目标表名是否匹配,而是检查语句中显式出现的表名(含库前缀)是否匹配规则**。这意味着:
如果主库执行
,而
,这条语句会被复制
但如果执行
(没 USE),同样能匹配成功
而
这种跨库语句——即使目标是
,只要语句里没写全
(比如只写了
),就可能被跳过
所以它本质是“语句级白名单”,不是“表数据级开关”。真正想按表名精确控制,
更可靠。
配置 replicate-do-table 必须停 SQL 线程,不能热生效
MySQL 5.7 虽支持
在线修改,但对
这类旧参数,仍需先停掉 SQL 线程:
注意:
不支持通配符,必须写全
;多个表要一次性用括号+逗号列出,不能重复写多条
语句。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
replicate-do-table 和 replicate-ignore-table 优先级冲突时 ignore 生效
如果同时设置了
和
,后者会胜出——整条涉及该表的语句都会被跳过,不管是否在 do 列表里。
这种冲突常见于运维误配或脚本批量生成配置时
中的
和
字段会显示当前值,但不会提示冲突
验证方法:在主库执行一条明确操作该表的语句(如
),再查从库是否落地
比 replicate-do-table 更推荐用 replicate-wild-do-table
几乎所有生产环境都应该跳过
,直接用
:
它匹配的是 binlog 事件中的实际库表名,不依赖 USE 或语句写法
支持
和
通配符,例如
可精准捕获日表
可与
共存,ignore 仍具更高优先级
修改后只需
,无需重启
mysql
d
真正难搞的从来不是怎么写规则,而是确认 binlog_format 是 ROW(推荐)还是 STATEMENT——前者让表名匹配更稳定,后者在跨库、函数调用等场景下容易失准。
replicate-do-tableUSE db1; INSERT INTO t1 VALUES (1);replicate-do-table = db1.t1INSERT INTO db1.t1 VALUES (1);INSERT INTO db2.t1 SELECT * FROM db1.t2;db1.t1db1.t1t1replicate-wild-do-tableCHANGE REPLICATION FILTERreplicate-do-tableSTOP SLAVE SQL_THREAD;CHANGE REPLICATION FILTER REPLICATE_DO_TABLE = ('db1.t1', 'db1.t2');START SLAVE SQL_THREAD;REPLICATE_DO_TABLEdb_name.table_nameCHANGEreplicate-do-table = db1.t1replicate-ignore-table = db1.t1SHOW SLAVE STATUS\GReplicate_Do_TableReplicate_Ignore_TableINSERT INTO db1.t1 VALUES (NOW());replicate-do-tablereplicate-wild-do-table%_replicate-wild-do-table = app_log.2026_%replicate-wild-ignore-tableSTOP SLAVE; START SLAVE;