复制过滤规则是什么
复制过滤在从库侧生效,决定哪些改动会被执行或忽略: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 | 库名改写 | 把源库改写成从库上的另一个库名 |
跨库语句在库级过滤下行为反直觉:一条语句同时动了多个库时,判定只看默认库,可能出现「该忽略的库被写了」或「该同步的库漏了」,这是数据不一致最隐蔽的来源之一。
过滤规则与切换方向强相关:主从互换后过滤可能反向作用,原本被忽略的数据缺口会暴露;使用过滤的拓扑必须在预案里写明过滤清单与切换时的调整步骤。