MySQL 複制為非同步,涉及三個線程協作:
| 線程 | 位置 | 職責 |
|---|---|---|
| Binlog Dump 線程 | Master | 讀取 Master Binlog,發送給 Slave I/O 線程 |
| I/O 線程 | Slave | 連接 Master,請求 Binlog,寫入本地 Relay Log |
| SQL 線程 | Slave | 讀取 Relay Log,解析並重放執行 |
關鍵流程:
master.info 記錄下次請求位置。演進歷程:早期版本單線程處理 I/O + SQL,存在效能瓶頸與資料遺失風險;Yahoo! 工程師 Jeremy Zawodny 提出雙線程分離方案,大幅降低延遲與風險。
原理:記錄修改資料的 SQL 語句本身,Slave 重新執行。
| 優點 | 缺點 |
|---|---|
| Binlog 體積小,IO 開銷低 | 非確定性函數(NOW()、UUID()、RAND())導致主從不一致 |
| 易閱讀、審計、手工回放 | LAST_INSERT_ID()、存儲過程、觸發器在特定情境下復制錯誤 |
| 不記錄逐行變更,ALTER TABLE 效能佳 | 需記錄完整上下文資訊(使用者變數、暫存表、自增值等) |
原理:記錄每行資料的實際變更(前後映像),Slave 套用行級變更。
| 優點 | 缺點 |
|---|---|
| 完全確定性,避免函數/觸發器問題 | 大量更新(如無 WHERE 的 UPDATE、ALTER TABLE)產生海量 Binlog |
| Binlog 內容清晰,易於解析、稽核 | 跨資料庫/跨表的複雜關聯更新難以優化 |
| 不依賴上下文,Slave 重放更安全 | 無法直接從 Binlog 看出原始 SQL 語句 |
原理:預設使用 SBR,遇到不安全語句自動切換 RBR。現代 MySQL(5.7/8.0)預設即為 MIXED。
CREATE/ALTER/DROP)→ SBRauto_increment_offset/increment 避免主鍵衝突,嚴禁雙向同步寫入。log-slave-updates。Seconds_Behind_Master:延遲秒數,持續 > 0 需排查。Slave_IO_Running / Slave_SQL_Running:任一為 No 即異常。Last_IO_Error / Last_SQL_Error:具體錯誤訊息。Relay_Log_Space:Relay Log 佔用空間,防止磁碟滿。常見錯誤處理:
STOP SLAVE SQL_THREAD → 修正資料/跳過錯誤(SET GLOBAL sql_slave_skip_counter=1) → START SLAVE SQL_THREAD。MASTER_LOG_FILE/MASTER_LOG_POS 是否正確。