首页/数据/数据库速查/复制过滤规则(replicate-do-db 等)
主从复制与高可用53 条

复制过滤规则(replicate-do-db 等)

复制过滤在从库侧生效:库级(replicate-do-db / replicate-ignore-db)基于默认库判断,表级(replicate-wild-do-table)更精确;生产尽量不用过滤。

数据库速查数据更新于 2026-10-13

复制过滤规则是什么

复制过滤在从库侧生效,决定哪些改动会被执行或忽略:replicate-do-db / replicate-ignore-db 按库过滤,replicate-wild-do-table / replicate-wild-ignore-table 按表名通配过滤。库级规则判断依据是语句的默认库(当前 USE 的库),表级规则按实际表名匹配,因此在 ROW 格式下两者的行为差异尤其明显。生产环境原则上不用过滤,一旦用了就要在拓扑变更时重新评估。

基本信息

适用版本MySQL 5.7 / 8.0(8.0 命名统一为 replicate-*,旧 slave-* 仍兼容)
库级规则replicate-do-db、replicate-ignore-db
表级规则replicate-wild-do-table、replicate-wild-ignore-table
匹配依据库级看语句默认库;表级按实际表名通配匹配
生效位置从库配置文件,需重启生效
推荐做法生产尽量不用过滤,用一致的库表结构替代

典型使用场景

  • 从库只承接核心业务库,跳过临时库与测试库的重放
  • 过滤掉审计、日志类表,降低从库写入压力
  • 多租户实例上只同步某个租户库,隔离资源与权限
  • 灾备实例只保留必要数据以节省存储
  • 迁移过渡期临时过滤,缩小白名单范围

配置示例(从库 my.cnf)

配置示例(从库 my.cnf)
[mysqld]
server_id = 11
replicate-wild-do-table = appdb.%
replicate-wild-ignore-table = appdb.audit_%
replicate-wild-ignore-table = appdb.log_%

# 库级过滤示例(注意判定依据是语句默认库)
# replicate-do-db = appdb
# replicate-ignore-db = tmpdb

核对过滤是否真的生效

核对过滤是否真的生效
-- 查看当前生效的过滤规则(需重启后确认)
SHOW VARIABLES LIKE 'replicate%';

-- 观察复制线程状态与延迟
SHOW REPLICA STATUS\G

-- 确认某张被忽略的表在从库是否长期无写入
SELECT COUNT(*), MAX(created_at) FROM appdb.log_access;

常用过滤规则对照

规则粒度判定依据
replicate-do-db库语句默认库(USE 的库),不是表所在库
replicate-ignore-db库同上,命中则忽略
replicate-wild-do-table表通配符匹配实际库表名,跨库语句也按表名判断
replicate-wild-ignore-table表同上,命中则忽略
replicate-rewrite-db库名改写把源库改写成从库上的另一个库名
跨库语句在库级过滤下行为反直觉:一条语句同时动了多个库时,判定只看默认库,可能出现「该忽略的库被写了」或「该同步的库漏了」,这是数据不一致最隐蔽的来源之一。
过滤规则与切换方向强相关:主从互换后过滤可能反向作用,原本被忽略的数据缺口会暴露;使用过滤的拓扑必须在预案里写明过滤清单与切换时的调整步骤。

易错点

  • 库级过滤配 ROW 格式:按表名判断而不是默认库,实际效果与配置意图不符
  • 规则写在 my.cnf 但复制线程动态参数里也有旧值:重启后行为跳变,需统一下发配置
  • 用忽略表掩盖写冲突:数据缺口长期累积,切换时才发现从库数据不可信
  • 过滤掉审计表却仍要求审计可查:合规要求与实现冲突,应在评审阶段暴露
  • 拓扑变更(新增级联从库)后未同步过滤规则:各级从库数据不一致且难以排查

数据来源与参考

  • MySQL 8.0 Reference Manual: Replication Filtering Rules

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌