MySQL主从复制过滤配置的完整方案

 更新时间:2026年03月03日 08:48:30   作者:·云扬·  
在实际生产环境中,MySQL 主从复制架构几乎是标配,但默认的全量同步往往会带来不必要的资源消耗,所以本文整理了一套完整的过滤配置实验方案,从环境准备到六种核心场景测试,需要的朋友可以参考下

前言:为什么需要主从复制过滤?

在实际生产环境中,MySQL 主从复制架构几乎是标配,但默认的全量同步往往会带来不必要的资源消耗 —— 比如日志表、测试表的数据同步,不仅占用从库磁盘空间,还会增加网络传输压力。因此,精细化控制同步范围(只同步核心数据、忽略非必要表 / 库)就显得尤为重要。

最近刚好在优化公司的主从架构,整理了一套完整的过滤配置实验方案,从环境准备到六种核心场景测试,全程实操验证,今天就把这些干货分享给大家~

一、实验环境准备(基础铺垫不能少)

首先得有一个正常运行的 MySQL 主从架构(主从已实现基础同步),我这里用的是 MySQL 8.0 版本,操作系统是 CentOS 7。

1.1 主库:创建测试数据

为了验证不同过滤规则,我特意创建了 2 个库、4 张表,包含业务表、日志表,方便后续区分测试:

-- 创建测试库

create database db1;

create database db2;

-- db1库:业务表+日志表(模拟真实场景)

use db1;

create table table_01(id int not null auto_increment primary key, name varchar(10));

create table table_02(id int not null auto_increment primary key, name varchar(10));

create table log_01(id int not null auto_increment primary key, name varchar(10)); -- 拟忽略的日志表

-- db2库:普通测试表

use db2;

create table test_01(id int not null auto_increment primary key, name varchar(10));

然后插入随机测试数据(用 MD5 生成随机字符串,不用手动造数据,效率超高):

insert into db1.table_01(name) values (SUBSTRING(MD5(RAND()), 1, 10));

insert into db1.table_02(name) values (SUBSTRING(MD5(RAND()), 1, 10));

insert into db1.log_01(name) values (SUBSTRING(MD5(RAND()), 1, 10));

insert into db2.test_01(name) values (SUBSTRING(MD5(RAND()), 1, 10));

1.2 从库:验证初始同步

这一步很关键!必须先确认主从基础同步正常,不然后续过滤测试就没意义了。在从库执行查询:

select * from db1.table_01;

select * from db1.table_02;

select * from db1.log_01;

select * from db2.test_01;

如果都能查到数据,说明主从架构没问题,可以开始过滤配置了~

二、六种核心过滤方案(场景化实操)

所有过滤规则都在从库配置,记住一个通用流程:停止SQL线程 → 配置规则 → 重启SQL线程 → 测试效果 → 清理规则,避免规则残留影响后续测试。

2.1 方案 1:只复制某一个库(REPLICATE_DO_DB)

适用场景:只需要同步核心业务库(比如 db1),非核心库(如 db2)无需同步。

-- 临时配置(不用重启,测试用超方便)

STOP SLAVE SQL_THREAD;

CHANGE REPLICATION FILTER REPLICATE_DO_DB=(db1);

start slave sql_thread;

show slave status\G; -- 查看Filter参数是否生效

如果需要长期生效,就要改配置文件(记得重启服务):

vim /data/mysql/conf/my.cnf

replicate-do-db=db1  # 新增配置

systemctl restart mysqld

测试结果:主库往 db1 插数据同步成功,db2 插数据从库无反应,符合预期~

2.2 方案 2:忽略某个库(REPLICATE_IGNORE_DB)

适用场景:除了某个库(比如日志库 db1),其他库都要同步。

STOP SLAVE SQL_THREAD;

CHANGE REPLICATION FILTER REPLICATE_IGNORE_DB=(db1);

start slave sql\_thread;

测试感悟:这个规则适合把测试库、日志库排除在外,减少从库压力,亲测好用!

2.3 方案 3:只复制指定表(REPLICATE_DO_TABLE)

适用场景:同一库下只需要同步核心表(比如 db1.table_01),其他表忽略。

STOP SLAVE SQL_THREAD;

CHANGE REPLICATION FILTER REPLICATE_DO_TABLE=(db1.table_01); -- 必须写"库名.表名"

start slave sql_thread;

注意:如果只写表名会失效!之前踩过这个坑,大家一定要注意~

2.4 方案 4:忽略指定表(REPLICATE_IGNORE_TABLE)

适用场景:同步某库大部分表,但忽略日志表、临时表(比如 db1.log_01)。

STOP SLAVE SQL_THREAD;

CHANGE REPLICATION FILTER REPLICATE_IGNORE_TABLE=(db1.log_01);

start slave sql_thread;

实操心得:日志表数据量大且无需备份,用这个规则能节省大量磁盘空间~

2.5 方案 5:通配符匹配同步表(REPLICATE_WILD_DO_TABLE)

适用场景:同步某库下符合前缀 / 后缀规则的表(比如 db1 下所有 table 开头的表)。

STOP SLAVE SQL_THREAD;

CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('db1.table%'); -- 通配符%匹配任意字符

start slave sql_thread;

配置文件持久化(不用加引号):

replicate-wild-do-table=db1.table%

测试效果:table_01、table_02 都能同步,log_01 被忽略,批量匹配超高效!

2.6 方案 6:通配符忽略表(REPLICATE_WILD_IGNORE_TABLE)

适用场景:忽略某库下符合规则的表(比如 db1 下所有 table 开头的表)。

STOP SLAVE SQL_THREAD;

CHANGE REPLICATION FILTER REPLICATE_WILD_IGNORE_TABLE=('db1.table%');

start slave sql_thread;

使用建议:如果需要批量排除同类表,这个规则比逐个写 REPLICATE_IGNORE_TABLE 更方便。

三、实验总结(快速选型指南)

整理了一张对比表,大家可以根据业务场景直接选型:

配置方案核心参数控制粒度适用场景
只复制某库REPLICATE_DO_DB库级仅同步核心业务库
忽略某库REPLICATE_IGNORE_DB库级排除测试库、日志库
只复制指定表REPLICATE_DO_TABLE表级仅同步单库下核心表
忽略指定表REPLICATE_IGNORE_TABLE表级排除单库下非必要表(如日志表)
通配符匹配同步表REPLICATE_WILD_DO_TABLE通配符级同步符合前缀 / 后缀规则的表(批量匹配)
通配符忽略表REPLICATE_WILD_IGNORE_TABLE通配符级排除符合前缀 / 后缀规则的表(批量忽略)

四、避坑指南(实操经验分享)

  1. 配置优先级:临时配置(CHANGE REPLICATION FILTER)比配置文件优先级高,测试时用临时配置,确定后再写配置文件。
  2. 规则冲突:如果同时配置 “只复制” 和 “忽略”,忽略规则优先级更高!比如既配置了 REPLICATE_DO_DB=db1,又配置了 REPLICATE_IGNORE_TABLE=db1.table_01,那么 table_01 会被忽略。
  3. 大小写问题:Linux 环境下 MySQL 默认区分表名大小写,配置时要和实际表名一致(比如 table_01 不能写成 Table_01),否则规则失效!
  4. 重启影响:临时配置重启从库后会丢失,生产环境一定要用配置文件持久化。
  5. 数据清理:实验结束后记得在主从库同时删除测试库(drop database db1; drop database db2;),避免残留数据干扰。

最后

以上就是 MySQL 主从复制过滤配置的全部实操内容啦~ 其实过滤规则不难,关键是根据业务场景选对方案,并且注意避坑。如果大家有其他场景的过滤需求,或者在实操中遇到问题,欢迎在评论区交流探讨!

以上就是MySQL主从复制过滤配置的完整方案的详细内容,更多关于MySQL主从复制过滤配置的资料请关注脚本之家其它相关文章!

相关文章

  • mysql修改记录时update操作 字段=字段+字符串

    mysql修改记录时update操作 字段=字段+字符串

    这篇文章主要介绍了mysql修改记录时update操作 字段=字段+字符串,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • MySQL之JSON类型字段的使用技巧分享

    MySQL之JSON类型字段的使用技巧分享

    这篇文章主要介绍了MySQL之JSON类型字段的使用技巧,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • MySQL运维实战使用RPM进行安装部署

    MySQL运维实战使用RPM进行安装部署

    这篇文章主要为大家介绍了MySQL运维实战使用RPM进行安装部署实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • MySQL系列之六 用户与授权

    MySQL系列之六 用户与授权

    做为Mysql数据库管理员管理用户账户,是一件很重要的事,指出哪个用户可以连接服务器,从哪里连接,连接后能做什么,这篇文章主要介绍了MySQL用户与授权的相关资料,需要的朋友可以参考下
    2021-07-07
  • Mysql表的约束超详细讲解

    Mysql表的约束超详细讲解

    MySQL唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况
    2022-09-09
  • Mysql实战练习之简单图书管理系统

    Mysql实战练习之简单图书管理系统

    由于课设需要做这个,于是就抽了点闲余时间,写了下,用Mysql与Java,基本全部都涉及到,包括借书/还书,以及书籍信息的更新,查看所有的书籍。需要的朋友可以参考下
    2021-09-09
  • MySQL中存储过程性能优化的完整指南

    MySQL中存储过程性能优化的完整指南

    这篇文章主要为大家详细介绍了MySQL中存储过程性能优化的相关方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-08-08
  • MySQL 如何查询当前最新事务ID

    MySQL 如何查询当前最新事务ID

    这篇文章主要介绍了MySQL 如何查询当前最新事务ID,帮助大家更好的理解和学习MySQL,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL中ifnull和isnull的用法及其平替方法

    MySQL中ifnull和isnull的用法及其平替方法

    ifnull和isnull都是MySQL的函数,用于对NULL值进行处理,本文就来介绍MySQL中ifnull和isnull的用法及其平替方法,感兴趣的可以了解一下
    2023-12-12
  • 一次Mysql死锁排查过程的全纪录

    一次Mysql死锁排查过程的全纪录

    在测试环境测试给用户并发发送卡券时,出现了死锁,通过查找相关的资料解决了这个,所以想着总结出来,所以下面这篇文章主要是关于一次Mysql死锁排查过程的全纪录,需要的朋友可以参考下,希望大家从中能有所帮助。
    2017-02-02

最新评论