如何配置MySQL的主从过滤规则(Replicate-Do-DB)?

大静吖_1870

大静吖_1870

2026-07-13

303人浏览

原创

replicate-do-db必须配置在从库my.cnf的[mysqld]段并重启mysql进程才生效,它依赖use语句或显式库名前缀匹配,不检查sql实际操作的库,跨库操作易失效;更可靠的替代方案是replicate-wild-do-table,按表名通配匹配且不受use影响。

如何配置mysql的主从过滤规则(replicate-do-db)?

replicate-do-db 配置必须写在从库的 my.cnf 里

这个参数只在从库生效,主库上配了也没用。它不是运行时动态参数,必须在从库启动前写入配置文件,否则启动后修改再 SET GLOBAL 是无效的。很多同学试过改完 reload 或 restart mysqld 却没效果,就是因为没重启整个 MySQL 进程(仅 reload config 不触发复制过滤重载)。

常见错误现象:SHOW SLAVE STATUS\G 中 Replicate_Do_DB 字段为空,或同步了不该同步的库(比如 mysql 系统库),基本就是配置没生效或没重启。

  • 配置位置:必须在从库的 /etc/my.cnf 或 /etc/mysql/my.cnf 的 [mysqld] 段下
  • 语法:每行一个 replicate-do-db = db_name,支持多行,不支持逗号分隔
  • 重启要求:改完必须执行 systemctl restart mysql(或对应服务名),不能只 mysqladmin reload

replicate-do-db 匹配逻辑依赖 USE 语句或显式库名前缀

它不是按 SQL 执行时实际影响的库来判断,而是看语句是否“属于”该库——即是否在 USE app_db 后执行,或语句中写了 app_db.table_name。如果直接执行 INSERT INTO users(没 USE、也没库名前缀),哪怕表在 app_db 里,这条语句也不会被匹配。

这意味着:跨库操作(如 INSERT INTO order_db.orders SELECT * FROM app_db.users)可能被漏掉或误同步,取决于哪边用了前缀、哪边用了 USE。

  • 安全做法:所有业务 SQL 显式带上库名前缀,避免依赖 USE
  • 慎用混搭:不要和 replicate-ignore-db 同时配置,两者规则冲突时行为不可靠
  • 验证方式:在主库执行 USE app_db; INSERT INTO t1 ...,再查从库是否同步;再试 INSERT INTO app_db.t1 ...,确认都生效

replicate-wild-do-table 更可靠,尤其用于按表过滤

当你要同步 app_db 下的 users 和 orders 表,但不想同步 app_db.log_2025 这类历史表,replicate-do-db 就力不从心了——它只能控制库级,没法筛表。这时候 replicate-wild-do-table 是更优解。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

它用通配符匹配 db_name.table_pattern,不依赖 USE,只要语句里出现匹配的库表组合就生效,包括 JOIN、子查询、跨库引用等复杂场景。

  • 示例:replicate-wild-do-table = app_db.users(精确匹配)、replicate-wild-do-table = app_db.order%(匹配 order 开头的所有表)
  • 注意:% 匹配任意字符(含零个),_ 匹配单个字符,不支持正则
  • 优先级:多个 replicate-wild-do-table 规则是“任一匹配即同步”,不是“全匹配”,所以白名单思维更稳

配置后必须重置复制位点才能生效

即使你正确配置并重启了从库,已有的复制关系不会自动应用新规则。MySQL 会继续按旧的 relay log 位置执行,而旧日志里可能包含已被过滤掉的库/表操作,导致从库数据错乱或报错。

正确做法是:停复制 → 清空 relay log → 重设 master position(通常用 CHANGE MASTER TO ... MASTER_LOG_FILE='xxx', MASTER_LOG_POS=yyy)→ 再启动复制。这一步常被跳过,结果就是“配置写了,但没起作用”。

  • 关键命令:STOP SLAVE; → RESET SLAVE;(清 relay log + info)→ CHANGE MASTER TO ... → START SLAVE;
  • 位点来源:需从主库 SHOW MASTER STATUS 获取最新 File 和 Position,不能沿用旧值
  • 风险提示:重置前确保主从数据一致,或已做好备份;否则可能丢数据

实际线上环境里,replicate-do-db 看似简单,但真正跑稳需要同时踩对配置位置、重启动作、SQL 编写习惯、复制重置四步。最容易被忽略的是最后一步——很多人以为改完配置重启 mysqld 就万事大吉,结果同步还在跑老日志。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2093

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1279

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

755

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2812

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4688

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1079

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4951

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4422

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5774

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
mysql8主从复制原理底层详解
mysql8主从复制原理底层详解

共1课时 | 704人学习

SQL优化与排查(MySQL版)
SQL优化与排查(MySQL版)

共26课时 | 3.2万人学习