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-dbROW 模式下按表所属库判断,较可靠
  • 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_RunningSlave_SQL_Running 均为 Yes
  • 查看 Replicate_Do_DBReplicate_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稳定、灵活、不受跨库影响
相关推荐
A小辣椒20 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式