首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 5.0 官方手冊深度解讀:複寫啟動參數完整指南 (第四篇)

     編輯:MySQL 資料庫相關知識

核心前置條件:server-id

Master 與 Slave 必須各自設定唯一的 server-id (1 ~ 2³²-1 正整數),否則複寫無法建立。例:server-id=3。

Master 端二進位日誌控制參數

詳見手冊 5.9.4 節「The Binary Log」,核心參數:

  • log-bin[=base_name]:啟用二進位日誌
  • binlog_format:STATEMENT/ROW/MIXED (5.1+)
  • expire_logs_days:自動清理天數
  • max_binlog_size:單檔最大值,觸發輪轉
  • sync_binlog:同步頻率 (1=最安全,N=效能折衷)

Slave 端啟動參數完整分類

特殊處理參數 (存在 master.info 時忽略命令列/配置檔值)

以下參數在 master.info 存在時以檔案值為準,修改配置檔不生效,需用 CHANGE MASTER TO 或刪除 master.info 重啟:

版本注意: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 章。

過濾規則決策邏輯 (優化器內部流程)

  1. 有 replicate-do/ignore-db 規則?
  2. 是 → 測試 binlog-do/ignore-db → 忽略則跳過,執行則延後判斷
  3. 否 → 進入表級規則
  4. 有 replicate-*-table 規則?
  5. 無 → **執行並結束**
  6. 有 → 依序檢查被更新表 (多表語句只檢查第一匹配表)
  7. do-table 匹配 → 執行
  8. ignore-table 匹配 → 忽略
  9. wild-do-table 匹配 → 執行
  10. wild-ignore-table 匹配 → 忽略
  11. 所有表檢查完無匹配 → 有 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

最佳實踐總結

  1. 唯一 server-id 是複寫拓撲基石
  2. 棄用啟動參數管理連線資訊,全面改用 CHANGE MASTER TO
  3. 過濾規則謹慎設計:優先用 wild-do-table 白名單,避免 do-db 跨庫陷阱
  4. 監控關鍵指標:Seconds_Behind_Master、Slave_IO_Running/Slave_SQL_Running、中繼日誌堆積
  5. 禁用 slave-skip-errors,錯誤即停機修復,保證資料一致性
  6. 定期演練故障切換:Master 宕機 → Slave 升級 → 應用切換 → 新 Slave 掛載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
參數說明預設值
--master-hostMaster 主機名/IP無 (必填)
--master-user複寫帳號test
--master-password複寫密碼空字串
--master-portMaster 連接埠3306
--master-connect-retry重連間隔秒數60
--master-ssl*SSL 連線參數 (ca/capath/cert/cipher/key)無