3、主从复制实现同步数据过滤

在 MySQL 8 主从复制中,指定数据库同步 有两种方案:主库过滤(binlog-do-db) 和 从库过滤(replicate-do-db / replicate-wild-*) 。推荐在从库配置,更灵活、更安全。

一、核心参数说明

1. 主库(Master)过滤(不推荐)

在主库 my.cnf / my.ini [mysqld] 下配置:

TOML 复制代码
# 只将以下库的变更写入 binlog
binlog-do-db = db1
binlog-do-db = db2

# 不写入 binlog(黑名单)
binlog-ignore-db = mysql
binlog-ignore-db = test
  • 缺点 :
    • 一旦设置,所有从库都只能同步这几个库,不灵活
    • 依赖 USE 数据库 上下文,跨库语句容易漏同步
    • 主库 binlog 不完整,无法用于全量恢复

2. 从库(Replica)过滤(推荐)

在从库 my.cnf [mysqld] 下配置:

TOML 复制代码
# 白名单:只同步这些库
replicate-do-db = db1
replicate-do-db = db2

# 黑名单:不同步这些库
replicate-ignore-db = mysql
replicate-ignore-db = test

# 通配符(推荐):同步 db_ 开头的所有库
replicate-wild-do-table = db\_%.*
# 忽略 log_ 开头的所有表
replicate-wild-ignore-table = %.log\_%
  • 优点 :
    • 每个从库可独立控制同步范围
    • replicate-wild-* 支持通配符,不受 USE 影响
    • 主库保留完整 binlog,可恢复

⚠️ 注意:

  • replicate-do-db 在 ROW 模式下按表所属库判断,较可靠
  • MySQL 8.0.26+ 已弃用部分库级过滤,优先用表级通配符

二、完整配置步骤(推荐:从库过滤 + GTID)

1. 主库配置(my.cnf)

TOML 复制代码
[mysqld]
server-id = 1                  # 必须唯一
log-bin = mysql-bin            # 开启 binlog
binlog-format = ROW            # 强烈推荐 ROW 模式
gtid_mode = ON
enforce_gtid_consistency = ON
sync_binlog = 1
binlog_expire_logs_seconds = 864000  # 日志自动清理

重启主库:

Bash 复制代码
systemctl restart mysqld

2. 主库创建复制账号

SQL 复制代码
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;

3. 从库配置(my.cnf)

TOML 复制代码
[mysqld]
server-id = 2                  # 必须不同
read_only = 1
super_read_only = 1
relay-log = relay-bin
gtid_mode = ON
enforce_gtid_consistency = ON

# ========== 关键:指定同步库 ==========
# 方案A:精确库名
# replicate-do-db = order_db
# replicate-do-db = user_db

# 方案B:通配符(推荐)
replicate-wild-do-table = order\_%.*   # 同步 order_ 开头的所有库
replicate-wild-do-table = user\_%.*
replicate-wild-ignore-table = %.%_log  # 忽略所有以 _log 结尾的表

重启从库:

Bash 复制代码
systemctl restart mysqld

4. 从库建立主从关系(GTID 模式)

SQL 复制代码
STOP REPLICA;

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.1.100',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='Repl@123',
  SOURCE_AUTO_POSITION=1;  -- GTID 自动定位

START REPLICA;

5. 验证

SQL 复制代码
SHOW REPLICA STATUS\G
  • 查看 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes
  • 查看 Replicate_Do_DB、Replicate_Wild_Do_Table 是否已加载

三、动态修改过滤规则(无需重启)

MySQL 8 支持在线修改:

SQL 复制代码
STOP REPLICA;

-- 只同步 db1、db2
CHANGE REPLICATION FILTER
  REPLICATE_DO_DB = (db1, db2),
  REPLICATE_WILD_IGNORE_TABLE = (db1.%_log);

START REPLICA;

查看规则:

SQL 复制代码
SHOW VARIABLES LIKE '%replicate%';

四、常见坑与最佳实践

  1. 不要混用主库 + 从库过滤
    1. 主库 binlog-do-db + 从库 replicate-do-db 容易出现"双重过滤"导致数据丢失
  2. 跨库语句问题
    1. USE db1; INSERT INTO db2.tbl VALUES(...);
    2. 库级过滤 (replicate-do-db):只看当前库 db1,可能误判
    3. 表级通配符 (replicate-wild-do-table=db2.*):稳定生效
  3. 推荐组合
    1. binlog_format = ROW replicate-wild-do-table = 目标库.* replicate-wild-ignore-table = %.日志表

五、总结

  • 主库过滤 :简单但不灵活,不推荐
  • 从库库级过滤 :replicate-do-db,简单场景可用
  • 从库通配符(首选) :replicate-wild-do-table,稳定、灵活、不受跨库影响
相关推荐
艺杯羹36 分钟前
1Panel 装好后 ufw 仍是 inactive:一次服务器安全盲区复盘
服务器·数据库·安全·网络安全·系统架构·实战·1panel
陈希12337 分钟前
负载均衡与高可用:LVS、HAProxy、Keepalived 实战
运维·负载均衡·lvs
一条破秋裤1 小时前
【1114】【并发控制】【笔记】
linux
2035去旅行3 小时前
ADB的底层原理
linux·adb·嵌入式·arm·soc
武子康3 小时前
单卡 A6000 跑 Qwen-Drive:怎样留下可比较的第一条基线?
linux·人工智能·深度学习
女神下凡3 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
落羽的落羽3 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
SQL774 小时前
IT运维发展史,一部宏伟史诗
运维·运维发展史
分布式存储与RustFS5 小时前
Terraform 状态文件老在本地丢、并发还撞锁:把 state 锁进 RustFS
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
csdn_aspnet6 小时前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac