3、主从复制实现同步数据过滤
在 MySQL 8 主从复制中指定数据库同步有两种方案主库过滤binlog-do-db和从库过滤replicate-do-db / replicate-wild-*。推荐在从库配置更灵活、更安全。一、核心参数说明1. 主库Master过滤不推荐在主库my.cnf/my.ini[mysqld]下配置# 只将以下库的变更写入 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]下配置# 白名单只同步这些库 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 已弃用部分库级过滤优先用表级通配符二、完整配置步骤推荐从库过滤 GTID1. 主库配置my.cnf[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 # 日志自动清理重启主库systemctl restart mysqld2. 主库创建复制账号CREATE USER repl192.168.1.% IDENTIFIED WITH mysql_native_password BY Repl123; GRANT REPLICATION SLAVE ON *.* TO repl192.168.1.%; FLUSH PRIVILEGES;3. 从库配置my.cnf[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 结尾的表重启从库systemctl restart mysqld4. 从库建立主从关系GTID 模式STOP REPLICA; CHANGE REPLICATION SOURCE TO SOURCE_HOST192.168.1.100, SOURCE_USERrepl, SOURCE_PASSWORDRepl123, SOURCE_AUTO_POSITION1; -- GTID 自动定位 START REPLICA;5. 验证SHOW REPLICA STATUS\G查看Slave_IO_Running和Slave_SQL_Running均为Yes查看Replicate_Do_DB、Replicate_Wild_Do_Table是否已加载三、动态修改过滤规则无需重启MySQL 8 支持在线修改STOP REPLICA; -- 只同步 db1、db2 CHANGE REPLICATION FILTER REPLICATE_DO_DB (db1, db2), REPLICATE_WILD_IGNORE_TABLE (db1.%_log); START REPLICA;查看规则SHOW VARIABLES LIKE %replicate%;四、常见坑与最佳实践不要混用主库 从库过滤主库binlog-do-db 从库replicate-do-db容易出现“双重过滤”导致数据丢失跨库语句问题USE db1; INSERT INTO db2.tbl VALUES(...);库级过滤replicate-do-db只看当前库db1可能误判表级通配符replicate-wild-do-tabledb2.*稳定生效推荐组合binlog_format ROW replicate-wild-do-table 目标库.* replicate-wild-ignore-table %.日志表五、总结主库过滤简单但不灵活不推荐从库库级过滤replicate-do-db简单场景可用从库通配符首选replicate-wild-do-table稳定、灵活、不受跨库影响