如何过滤不需要同步的库或表_replicate_ignore_db参数配置

3次阅读

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

如何过滤不需要同步的库或表_replicate_ignore_db 参数配置

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.t1db2.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_dbreplicate_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 TABLEINSERT 语句——有些版本的 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 会导致复制线程永久中断,只能重搭
MySQL 复制过滤不是开关,是精密的路径匹配逻辑;一旦用错参数或时机,问题往往在深夜主从延迟飙升时才暴露出来。

星耀云
版权声明:本站原创文章,由 星耀云 2026-03-22发表,共计1533字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources