MySQL 8.0 中必须使用通道级复制过滤(如 REPLICATE_WILD_DO_TABLE)替代已弃用的全局参数(如 replicate_do_db),因其不依赖 USE 语句、支持多源隔离、需显式启停 SQL 线程生效。

MySQL 8.0 中真正可控、可维护的复制过滤,必须用通道(channel)级配置,而不是全局 replicate_do_db 那类参数。全局过滤在多源复制或混合业务场景下会相互干扰,且行为依赖 USE,极易漏复制。
为什么不能继续用 replicate_do_db 做库级过滤
它不是“只复制这个库”,而是“仅当当前 USE db_name 时才执行该事件”。这意味着:
- 执行
INSERT INTO db1.t1 SELECT * FROM db2.t2时若当前USE db2,整条语句会被跳过,哪怕目标表在db1 -
mysqldump --databases db1 db2导出的脚本,切库逻辑会让部分库的语句被静默丢弃 - MySQL 8.0 已明确标记这些参数为
deprecated,未来版本将移除
用 replicate_wild_do_table + 通道实现精准控制
通配符过滤不依赖 USE,直接匹配事件中的库名和表名,配合通道可做到完全隔离:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 先停掉 SQL 线程:
STOP SLAVE SQL_THREAD FOR CHANNEL 'ch1'; - 设置通道专属过滤:
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('db1.%', 'db2.test_01') FOR CHANNEL 'ch1'; - 重启线程:
START SLAVE SQL_THREAD FOR CHANNEL 'ch1'; - 验证是否生效:
SELECT * FROM performance_schema.replication_applier_filters;
注意:该命令只影响指定通道,多个通道可配置不同规则,互不干扰。
多源复制中必须为每个主源单独建通道
如果你从两个主库同步数据(比如 master_a 和 master_b),不能共用一个通道:
- 用
CHANGE MASTER TO ... FOR CHANNEL 'ch_a'连接第一个主库 - 用
CHANGE MASTER TO ... FOR CHANNEL 'ch_b'连接第二个主库 - 再分别为
ch_a和ch_b设置不同的REPLICATE_WILD_DO_TABLE - 否则过滤规则会混用,
ch_a的规则可能误 applied 到ch_b的事件上
通道级过滤的关键在于“绑定关系”——每个通道独立持有自己的过滤器、中继日志、SQL 线程。一旦你开始用多源或需要差异化同步策略,就再也不能依赖全局配置了。最容易被忽略的一点是:修改过滤规则后必须显式执行 STOP/START SLAVE SQL_THREAD,否则新规则不会加载。

















