MySQL 復制自 3.23.15 引入,採用經典的 單向異步復制 架構。本文深度解析 核心概念、三線程協作模型、Binlog/Relay Log 文件管理、進程狀態機、狀態文件持久化,構建對復制機制的系統性認知。
FLUSH TABLES WITH READ LOCK + 拷貝,Master 業務零干擾⚠️ 核心約束:所有同步更新必須在 Master 執行,雙邊寫入將導致數據發散。
--log-bin(Binlog)LOAD DATA FROM MASTER(4.0+,僅 MyISAM,需全局讀鎖,~1MB/s)mysqldump --master-data + 導入(通用,較慢)relay-log.info)--master-connect-retry(默認 60s)定期重試MySQL 4.0.2+ 採用 1 Master 線程 + 2 Slave 線程 解耦讀取與執行:
| 線程 | 所在端 | 職責 | SHOW PROCESSLIST 顯示 |
|---|---|---|---|
| Binlog Dump | Master | 為每個 Slave 連接創建,讀取 Binlog 發送事件 | Command=Binlog Dump |
| I/O Thread | Slave | 連接 Master,請求 Binlog,寫入本地 Relay Log | Command=Connect, State=Waiting for master to send event |
| SQL Thread | Slave | 讀取 Relay Log,解析並執行 SQL 事件 | Command=Connect, State=Reading event from the relay log |
Sending binlog event to slave:正常發送中Finished reading one binlog; switching to next binlog:輪轉Has sent all binlog to slave; waiting for binlog to be updated:空閒等待新寫入Waiting to finalize termination:停止中Connecting to master / Checking master version / Registering slave on master / Requesting binlog dump:建連階段Waiting for master to send event:正常等待(Master 閒置時長時間)Queueing master event to the relay log:寫入 Relay LogWaiting to reconnect after a failed binlog dump request:重試間隔中Waiting for the slave SQL thread to free enough relay log space:relay_log_space_limit 觸發背壓Reading event from the relay log:正常讀取Has read all relay log; waiting for the slave I/O thread to update it:追上進度,等待新事件Waiting for slave mutex on exit:停止中host_name-relay-bin.nnnnnn(4.0+ 6 位序號,舊版 3 位)host_name-relay-bin.index--relay-log、--relay-log-index 自定義路徑FLUSH LOGS / mysqladmin flush-logs(4.0.14+)max_relay_log_size(>0)或 max_binlog_size(=0 或舊版)| 文件 | 更新者 | 關鍵內容 | 用途 |
|---|---|---|---|
master.info | I/O Thread | Master_Host, User, Password, Port, Log_File, Log_Pos, Connect_Retry, SSL 選項 (4.1+) | Slave 啟動時知從何處拉取 Binlog |
relay-log.info | SQL Thread | Relay_Log_File, Relay_Log_Pos, Relay_Master_Log_File, Exec_Master_Log_Pos | SQL Thread 知從何處繼續執行 |
備份 Slave 時必備份:數據目錄 + 兩狀態文件 + Relay Log + SQL_LOAD-* 臨時文件(LOAD DATA INFILE 斷點續傳)。
FLUSH LOGS 輪轉 Relay Log;復制 FOREIGN_KEY_CHECKSmaster.info 增加 SSL 字段# Master 端
SHOW PROCESSLIST\G -- 關注 Binlog Dump 線程 State
SHOW MASTER STATUS; -- 當前 Binlog 文件/位點
# Slave 端
SHOW SLAVE STATUS\G -- 核心:Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master
SHOW PROCESSLIST\G -- 關注 I/O、SQL 線程 State
SHOW RELAYLOG EVENTS; -- 解析 Relay Log 內容(類似 mysqlbinlog)
MySQL 復制的靈魂在於 Binlog 為源、Relay Log 為緩衝、三線程解耦讀執、狀態文件持久化斷點。理解這套機制,即可從容應對:搭建新 Slave、診斷同步延遲/卡頓、設計故障切換腳本、規劃跨版本升級、排查數據不一致 等所有復制運維場景。