mysql的复制过滤器是在主从复制架构中,用来筛选需要同步到从库的数据对象的功能,通过配置过滤规则,可以只同步指定的数据库、数据表,或者排除不需要同步的内容,减少从库的存储压力和同步延迟。

复制过滤器的分类
mysql的复制过滤器分为两类,分别是主库端过滤和从库端过滤,两者的生效时机和作用范围有明显区别。
主库端过滤
主库端过滤是在主库生成binlog日志时就进行筛选,只有符合规则的操作才会被记录到binlog中,从库只能获取到这些被选中的日志内容。主库端过滤的配置参数是binlog_do_db和binlog_ignore_db。
配置说明
binlog_do_db:指定需要记录binlog的数据库,只有针对该数据库的操作才会被写入binlog,多个数据库可以重复配置该参数。binlog_ignore_db:指定不需要记录binlog的数据库,针对该数据库的操作不会被写入binlog,多个数据库可以重复配置该参数。
主库端过滤的生效逻辑和当前使用的binlog格式有关,如果是STATEMENT格式,过滤规则基于当前默认数据库判断;如果是ROW格式,过滤规则基于操作的实际数据库判断,这也是很多用户配置后不生效的常见原因。
从库端过滤
从库端过滤是主库把所有binlog都发送给从库,从库的SQL线程在回放日志时,根据规则筛选需要执行的操作,不符合规则的操作会被直接跳过。从库端过滤的配置参数更多,覆盖的粒度也更细。
replicate_do_db:只回放指定数据库的操作,多个数据库可重复配置。replicate_ignore_db:跳过指定数据库的操作,多个数据库可重复配置。replicate_do_table:只回放指定数据表的操作,格式为数据库名.表名。replicate_ignore_table:跳过指定数据表的操作,格式为数据库名.表名。replicate_wild_do_table:通过通配符匹配需要回放的表,比如test.%表示test库下所有表。replicate_wild_ignore_table:通过通配符匹配需要跳过的表,比如test.tmp_%表示test库下所有tmp开头的表。
复制过滤器的具体配置方法
复制过滤器的配置需要修改mysql的配置文件,修改完成后重启服务生效,也可以通过动态命令临时修改,但是重启后会失效,建议同时修改配置文件和动态设置。
主库端过滤配置示例
假设我们需要主库只记录test_db和order_db两个数据库的操作,其他数据库的操作不写入binlog,配置步骤如下:
1. 修改主库配置文件my.cnf的[mysqld]模块:
[mysqld] # 启用binlog log_bin=mysql-bin # 指定需要记录binlog的数据库 binlog_do_db=test_db binlog_do_db=order_db # binlog格式建议设置为ROW,避免过滤规则判断异常 binlog_format=ROW
2. 动态修改配置(可选,用于临时生效不需要重启):
-- 查看当前binlog过滤配置 SHOW MASTER STATUS; -- 动态设置需要记录binlog的数据库,注意动态设置会覆盖之前的配置 SET GLOBAL binlog_do_db='test_db'; SET GLOBAL binlog_do_db='order_db';
从库端过滤配置示例
假设从库需要同步主库的test_db库下所有表,以及order_db库下user_order表,其他内容都跳过,配置步骤如下:
1. 修改从库配置文件my.cnf的[mysqld]模块:
[mysqld] # 从库开启中继日志 relay_log=mysql-relay # 指定需要回放的数据库 replicate_do_db=test_db replicate_do_db=order_db # 指定需要回放的表,覆盖更细粒度 replicate_do_table=order_db.user_order # 跳过test_db库下的临时表 replicate_wild_ignore_table=test_db.tmp_%
2. 动态修改从库过滤配置:
-- 停止从库SQL线程
STOP SLAVE SQL_THREAD;
-- 设置过滤规则
CHANGE REPLICATION FILTER REPLICATE_DO_DB=(test_db,order_db);
CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(order_db.user_order);
CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE=('test_db.tmp_%');
-- 启动从库SQL线程
START SLAVE SQL_THREAD;
配置验证与常见问题
配置完成后需要验证过滤规则是否生效,同时要注意一些常见的配置误区。
验证方法
可以通过在主库执行对应操作,然后查看从库的数据是否同步来验证:
-- 主库执行,测试test_db库的同步 CREATE TABLE test_db.test_table(id INT PRIMARY KEY); INSERT INTO test_db.test_table VALUES(1); -- 从库查询,确认数据存在 SELECT * FROM test_db.test_table; -- 主库执行,测试其他库的过滤 CREATE TABLE other_db.other_table(id INT PRIMARY KEY); -- 从库查询,确认other_db库没有同步 SHOW DATABASES LIKE 'other_db';
常见问题说明
- 主库使用
binlog_do_db时,如果执行跨库操作,比如USE other_db; INSERT INTO test_db.test_table VALUES(2);,在STATEMENT格式下该操作不会被记录,因为默认数据库是other_db,不符合过滤规则,建议主库过滤优先使用ROW格式binlog。 - 从库的
replicate_do_db和replicate_do_table是同时生效的,只要满足其中一个规则,操作就会被回放,不需要同时满足。 - 过滤规则修改后,只对新生成的binlog或者新的中继日志生效,已经存在的日志不会重新过滤,如果需要重新过滤历史数据,需要重新搭建从库或者手动同步数据。
- 不要同时配置
replicate_do_db和replicate_ignore_db针对同一个数据库,也不要同时配置replicate_do_table和replicate_ignore_table针对同一个表,避免规则冲突导致不可预期的结果。
使用建议
如果只需要控制少量数据库的同步,优先使用从库端过滤,因为主库端过滤会减少binlog的内容,影响基于binlog的其他功能比如增量备份、数据恢复。如果需要严格控制主库的binlog大小,减少网络传输量,再考虑使用主库端过滤。生产环境配置前建议先在测试环境验证规则是否符合预期,避免误过滤导致数据不一致。
mysql复制过滤器主从复制binlog_do_dbreplicate_do_db修改时间:2026-07-03 08:15:40