萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從同步過濾指定數據庫:replicate-wild-ignore-table 實戰與坑點避雷

業務場景

主庫包含業務庫、系統庫、測試庫,但從庫只需同步業務庫,需過濾 mysql、test、sys 等系統庫及臨時庫。

過濾參數對比

參數作用範圍匹配方式推薦度
replicate-do-db僅同步指定庫精確匹配⚠️ 易誤用
replicate-ignore-db忽略指定庫精確匹配⚠️ 有陷阱
replicate-wild-do-table同步匹配的表通配符✅ 推薦
replicate-wild-ignore-table忽略匹配的表通配符✅ 最推薦

核心陷阱:replicate-ignore-db 的「當前庫」陷阱

-- 主庫執行
USE db1;
INSERT INTO db2.tbl VALUES (1);  -- 未指定默認庫時,replicate-ignore-db=db2 可能失效!

官方文檔明確警告:replicate-ignore-db 判斷依據是當前默認庫,而非操作對象庫。跨庫操作極易導致同步不一致。

最佳實踐:使用通配符過濾表級

從庫配置

[mysqld]
# 忽略 mysql 系統庫所有表
replicate-wild-ignore-table = mysql.%
# 忽略 test 庫
replicate-wild-ignore-table = test.%
# 忽略 sys 庫(MySQL 5.7+)
replicate-wild-ignore-table = sys.%
# 忽略以 _tmp 結尾的臨時庫
replicate-wild-ignore-table = \_tmp\%.%

驗證過濾效果

-- 主庫操作
CREATE DATABASE ignored_db;
USE ignored_db;
CREATE TABLE t (id INT);
INSERT INTO t VALUES (1);

GRANT SELECT ON *.* TO 'app'@'%';  -- 權限操作也會進 binlog

-- 從庫檢查
SHOW DATABASES LIKE 'ignored_db';  -- 應無結果
SHOW GRANTS FOR 'app'@'%';         -- 權限同步是否被過濾?

實測發現:權限語句的特殊行為

實測顯示:配置 replicate-wild-ignore-table=mysql.% 後:

  • ✅ CREATE DATABASE 正常同步(庫級操作不受表過濾影響)
  • ❌ GRANT、CREATE USER 等權限語句被過濾(因涉及 mysql.user 表)
  • ✅ 業務庫 DML/DDL 正常同步

解決方案:分離系統庫同步

若需同步賬號權限,建議:

  1. 不忽略 mysql.%,改用 replicate-ignore-db=mysql(需注意跨庫陷阱)
  2. 或使用 pt-table-sync 定期同步權限表
  3. 或採用「主庫不建業務賬號,統一由配置管理工具分發」架構

動態調整不重啟(MySQL 8.0.26+)

-- 運行時修改(需 SUPER 權限)
SET GLOBAL replicate_wild_ignore_table = 'mysql.%,test.%,sys.%';

-- 持久化到配置文件
SET PERSIST replicate_wild_ignore_table = 'mysql.%,test.%,sys.%';

故障排查清單

  • 配置修改後 必須重啟從庫 SQL 線程:STOP SLAVE; START SLAVE;
  • 檢查 SHOW SLAVE STATUS\G 中 Replicate_Wild_Ignore_Table 是否生效
  • 使用 mysqlbinlog 對比主從 Relay Log 確認過濾行為
  • 注意:修改過濾規則不會追溯已同步數據,歷史差異需手動修復
copyright © 萬盛學電腦網 all rights reserved