在 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%';
四、常见坑与最佳实践
- 不要混用主库 + 从库过滤
- 主库
binlog-do-db+ 从库replicate-do-db容易出现"双重过滤"导致数据丢失
- 主库
- 跨库语句问题
USE db1; INSERT INTO db2.tbl VALUES(...);- 库级过滤 (
replicate-do-db):只看当前库db1,可能误判 - 表级通配符 (
replicate-wild-do-table=db2.*):稳定生效
- 推荐组合
binlog_format = ROW replicate-wild-do-table = 目标库.* replicate-wild-ignore-table = %.日志表
五、总结
- 主库过滤 :简单但不灵活,不推荐
- 从库库级过滤 :
replicate-do-db,简单场景可用 - 从库通配符(首选) :
replicate-wild-do-table,稳定、灵活、不受跨库影响