如何配置 MySQL 主从复制过滤特定数据库同步

文章导读
配置 MySQL 主从复制过滤特定数据库同步,推荐在从库配置文件 my.cnf 中设置 replicate-do-db 或 replicate-wild-do-table 参数。该方案适合需要减少从库存储压力或隔离非业务数据的场景,但需注意 binlog_format 为 ROW 时部分库级过滤参数可能失效。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

配置 MySQL 主从复制过滤特定数据库同步,推荐在从库配置文件 my.cnf 中设置 replicate-do-db 或 replicate-wild-do-table 参数。该方案适合需要减少从库存储压力或隔离非业务数据的场景,但需注意 binlog_format 为 ROW 时部分库级过滤参数可能失效。

先说结论:从库配置过滤规则是安全且灵活的标准做法,主库过滤会导致 binlog 不完整。

  • 适合:多租户架构、数据隔离或特定业务场景,需减少从库磁盘空间和网络传输压力。
  • 先准备:确认从库 MySQL 版本及 binlog_format 格式,ROW 格式下优先使用表级通配符过滤。
  • 验收:修改配置后重启从库服务,通过 SHOW SLAVE STATUS 确认过滤规则已加载且无同步延迟。

命令速用版

[mysqld]
replicate-do-db = app_db
replicate-wild-do-table = order_db.order_%

保存后执行 systemctl restart mysqld 重启服务。

为什么会这样

主库过滤会限制 binlog 完整性,从库过滤允许不同从库同步不同数据。主库设置 binlog-do-db 会导致所有从库只能同步指定库,且 binlog 不完整无法用于全量恢复;从库设置 replicate-do-db 仅影响本地 SQL 线程应用,主库 binlog 保持完整,支持灵活扩展。

分步处理

1. 编辑从库配置文件 my.cnf 或 my.ini,在 [mysqld] 段添加过滤参数。

2. 停止从库复制线程:STOP SLAVE;。

如何配置 MySQL 主从复制过滤特定数据库同步

3. 重启 MySQL 服务使配置生效:systemctl restart mysqld。

4. 启动复制线程:START SLAVE;。

5. 检查状态:SHOW SLAVE STATUS\G。

怎么验证是否生效

执行 SHOW SLAVE STATUS\G,查看 Replicate_Do_DB 或 Replicate_Wild_Do_Table 字段是否显示配置的规则。在主库对目标库和非目标库分别写入数据,观察从库是否仅同步了目标库数据。

常见坑

1. 动态设置无效:replicate-ignore-table 等参数不支持 SET GLOBAL 动态修改,必须写配置文件并重启。

2. ROW 格式限制:binlog_format 为 ROW 时,replicate-ignore-db 基于库名的过滤可能失效,建议改用 replicate-wild-ignore-table。

如何配置 MySQL 主从复制过滤特定数据库同步

3. 历史数据残留:过滤规则仅对新事件生效,不会自动删除从库已同步的非目标数据,需手动清理。

4. 跨库语句风险:基于库名的过滤依赖 USE 数据库上下文,跨库操作可能导致意外过滤或同步。

常见问题

能否在不重启 MySQL 的情况下生效过滤规则?

不能。复制过滤参数属于只读变量,修改 my.cnf 后必须重启 MySQL 进程或重置复制链路才能加载新规则。

过滤配置会自动删除从库已存在的非同步表吗?

不会。过滤规则只拦截新同步的事件,已存在于从库的非目标表数据需手动执行 DROP TABLE 清理。

主库需要配合修改配置吗?

不需要。主库只需开启 binlog 并允许从库连接,过滤逻辑完全由从库自主控制,主库无需特殊设置。

参考来源

  • 数据库主从复制过滤:如何只同步关键业务数据
  • mysql 主从复制如何只同步部分库_mysql 复制过滤配置
  • 3、主从复制实现同步数据过滤
  • 如何设置主从同步时忽略特定的表_复制过滤规则排查
  • mysql 通过复制排除数据库与表的同步