| 參數 | 說明 | 預設值 |
--master-host | Master 主機名/IP | 無 (必填) |
--master-user | 複寫帳號 | test |
--master-password | 複寫密碼 | 空字串 |
--master-port | Master 連接埠 | 3306 |
--master-connect-retry | 重連間隔秒數 | 60 |
--master-ssl* | SSL 連線參數 (ca/capath/cert/cipher/key) | 無 |
版本注意:4.1.1 起 master.info 格式變更 (首行加行數、含 SSL 參數),升級自動轉換,降級需手工刪除首行。
運行時可動態修改參數 (CHANGE MASTER TO)
大多數連線參數可用 CHANGE MASTER TO 熱修改,**強烈建議僅用此語句管理複寫設定**,不在啟動參數指定。
僅啟動時生效參數 (--replicate-* 過濾規則)
以下過濾規則**無法熱修改**,需修改配置檔後重啟 Slave:
--replicate-do-db
--replicate-ignore-db
--replicate-do-table
--replicate-ignore-table
--replicate-wild-do-table
--replicate-wild-ignore-table
--replicate-rewrite-db
--replicate-same-server-id
關鍵功能參數詳細說明
--log-slave-updates:複寫鏈關鍵
Slave 執行來自 Master 的更新後,**將其寫入自身二進位日誌**。啟用條件:同時開啟 --log-bin。
適用架構:A (Master) → B (Slave+Master) → C (Slave)。B 需同時開啟 log-bin 與 log-slave-updates。
--log-warnings:擴充錯誤日誌
記錄重連成功、Slave 執行緒啟動細節。4.0.19/4.1.12+ 預設開啟。--skip-log-warnings 關閉。4.0.21/4.1.3+ 僅 log_warnings > 1 才記錄放棄連線。
--master-connect-retry=sec
連線失敗後休眠秒數再重試。master.info 優先。預設 60 秒。
--master-info-file=path
自訂 master.info 路徑。預設資料目錄下。
--max-relay-log-size=# (4.0.14+)
中繼日誌單檔最大值,觸發輪轉。詳見系統變數 max_relay_log_size。
--read-only (4.0.14+)
Slave 僅允許 Slave 執行緒與 SUPER 權限用戶寫入,防止應用誤寫導致主從不一致。
--relay-log=name / --relay-log-index=name
自訂中繼日誌與索引檔名稱/路徑。用途:非主機名相依、磁碟負載分散、大檔案管理。
--relay-log-purge={0|1} (4.1.1+)
自動清除無用中繼日誌。全域變數,可 SET GLOBAL relay_log_purge=0 動態關閉。預設 1 (開啟)。
--relay-log-space-limit=#
中繼日誌總大小上限 (0=無限)。Slave 磁碟有限時有用。達限制時 I/O 執行緒暫停,直到 SQL 執行緒清理釋放空間。注意:不可設小於 2 × max_relay_log_size,否則易死結。
複寫過濾規則完整語法與陷阱
資料庫級過濾 (--replicate-do-db/ignore-db)
核心限制:只判斷「預設資料庫」 (USE 選中的),不解析跨庫語句。
-- 啟動參數
--replicate-do-db=sales
-- Master 執行
USE prices;
UPDATE sales.january SET amount=amount+1000; -- 不會複寫!預設庫是 prices
-- 解決:用表級通配符
--replicate-wild-do-table=sales.%
表級過濾 (--replicate-do-table/ignore-table)
支援跨庫操作,精確匹配 db.tbl。多次指定多表。
通配符表級過濾 (--replicate-wild-do-table/wild-ignore-table)
- 支援
% (任意字串)、_ (單字元),語意同 LIKE
--replicate-wild-do-table=foo%.bar%:foo 開頭庫下 bar 開頭表
- 模式為
% 時匹配所有表,**並套用至庫級 DDL** (CREATE/DROP/ALTER DATABASE)
- 字面萬用字元需轉義:
my\_own\%db,命令列可能需雙轉義 my\\_own\\%db
資料庫改名 (--replicate-rewrite-db=from->to)
將 Master 預設庫 from 改寫為 to。僅影響表級 DML,不含 DDL。優先於 replicate-* 規則生效。命令列需引號:--replicate-rewrite-db="olddb->newdb"。
--replicate-same-server-id
預設 0 (忽略同 server-id 事件,防無限迴圈)。設 1 允許處理。**不可與 log-slave-updates 共用**。4.1+ I/O 執行緒預設不寫入自身 server-id 事件,若需用此選項必在啟動時指定。
--report-host/port
Slave 向 Master 註冊顯示資訊,SHOW SLAVE HOSTS 可見。NAT 環境下 IP 不一定可直連。
--skip-slave-start
啟動不自動啟動 Slave 執行緒,需手動 START SLAVE。適合維護窗口、檢查點恢復。
--slave-compressed-protocol
Master/Slave 皆支援時啟用壓縮傳輸,減少網路頻寬。
--slave-load-tmpdir=path
LOAD DATA INFILE 複寫時臨時檔目錄。大檔案需大空間磁碟,**不可用記憶體檔案系統** (重啟後檔案消失)。建議同步設定 --relay-log 同目錄。
--slave-net-timeout=sec
Slave 等待 Master 資料逾時秒數。逾時後立即重試,間隔由 master-connect-retry 控制。
--slave-skip-errors=[codes|all]
極度危險,除非完全理解錯誤原因。忽略指定錯誤碼 (如 1062 主鍵衝突、1053 伺服器關閉) 繼續複寫。all 忽略所有錯誤 → **資料必然不一致,不可用於生產**。錯誤碼見 SHOW SLAVE STATUS、錯誤日誌、手冊 22 章。
過濾規則決策邏輯 (優化器內部流程)
- 有
replicate-do/ignore-db 規則?
- 是 → 測試
binlog-do/ignore-db → 忽略則跳過,執行則延後判斷
- 否 → 進入表級規則
- 有
replicate-*-table 規則?
- 無 → **執行並結束**
- 有 → 依序檢查被更新表 (多表語句只檢查第一匹配表)
do-table 匹配 → 執行
ignore-table 匹配 → 忽略
wild-do-table 匹配 → 執行
wild-ignore-table 匹配 → 忽略
- 所有表檢查完無匹配 → 有
do/wild-do 規則則忽略,否則執行
配置範例
[mysqld]
server-id=2
master-host=db-master.mycompany.com
master-port=3306
master-user=repl_user
master-password=StrongPassw0rd!
master-connect-retry=60
report-host=db-slave.mycompany.com
log-slave-updates
relay-log=/var/log/mysql/relay-bin
relay-log-space-limit=1G
replicate-wild-do-table=prod_%.%
replicate-wild-ignore-table=%.tmp_%
read-only
最佳實踐總結
- 唯一 server-id 是複寫拓撲基石
- 棄用啟動參數管理連線資訊,全面改用
CHANGE MASTER TO
- 過濾規則謹慎設計:優先用
wild-do-table 白名單,避免 do-db 跨庫陷阱
- 監控關鍵指標:
Seconds_Behind_Master、Slave_IO_Running/Slave_SQL_Running、中繼日誌堆積
- 禁用
slave-skip-errors,錯誤即停機修復,保證資料一致性
- 定期演練故障切換:Master 宕機 → Slave 升級 → 應用切換 → 新 Slave 掛載
- 上一篇文章: MySQL 5.0 官方手冊深度解讀:優化總論與系統瓶頸分析 (第一篇)
- 下一篇文章: MySQL 5.0 官方手冊深度解讀:複寫部署標準流程與拓撲實戰 (第二篇)
Copyright ©
程式碼之家 All Rights Reserved