主庫包含業務庫、系統庫、測試庫,但從庫只需同步業務庫,需過濾 mysql、test、sys 等系統庫及臨時庫。
| 參數 | 作用範圍 | 匹配方式 | 推薦度 |
|---|---|---|---|
| replicate-do-db | 僅同步指定庫 | 精確匹配 | ⚠️ 易誤用 |
| replicate-ignore-db | 忽略指定庫 | 精確匹配 | ⚠️ 有陷阱 |
| replicate-wild-do-table | 同步匹配的表 | 通配符 | ✅ 推薦 |
| replicate-wild-ignore-table | 忽略匹配的表 | 通配符 | ✅ 最推薦 |
-- 主庫執行
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 表)若需同步賬號權限,建議:
mysql.%,改用 replicate-ignore-db=mysql(需注意跨庫陷阱)pt-table-sync 定期同步權限表-- 運行時修改(需 SUPER 權限)
SET GLOBAL replicate_wild_ignore_table = 'mysql.%,test.%,sys.%';
-- 持久化到配置文件
SET PERSIST replicate_wild_ignore_table = 'mysql.%,test.%,sys.%';
STOP SLAVE; START SLAVE;SHOW SLAVE STATUS\G 中 Replicate_Wild_Ignore_Table 是否生效mysqlbinlog 對比主從 Relay Log 確認過濾行為