MySQL 主從複制是實現資料庫高可用、讀寫分離、災備備份的核心技術。本文深入解析其運作原理、Binlog 格式選擇,並提供完整的配置步驟與驗證方法。
主從複制的本質是「主庫寫入,從庫重放」:
整過程需主庫建立具備 REPLICATION SLAVE 權限的專用帳號,從庫配置主庫連接資訊(IP、Port、User、Password、Binlog 文件名及 Position)。
binlog_format 參數決定 Binlog 記錄內容,直接影響複制的一致性與效能:
| 格式 | 記錄內容 | 適用場景 | 優缺點 |
|---|---|---|---|
| ROW | 記錄每一行數據的實際變更 | 需嚴格一致性、複雜 SQL、含非確定性函數 | 最安全,但 Binlog 體積大,磁碟 IO 較高 |
| STATEMENT | 記錄執行的 SQL 語句原文 | 簡單 SQL、頻繁更新大量行、關注 Binlog 體積 | 體積小,但某些函數(如 UUID、NOW())可能導致主從不一致 |
| MIXED | 系統自動判斷:一般用 STATEMENT,特定情況切換 ROW | 大多數生產環境 | 平衡體積與安全,MySQL 5.1.5+ 預設值 |
建議:生產環境優先使用 MIXED 或 ROW,確保數據一致性。
編輯 /etc/my.cnf(或 my.ini),在 [mysqld] 區塊添加:
[mysqld] log-bin=mysql-bin # 啟用 Binlog,指定檔案前綴 server-id=1 # 唯一識別 ID,主從必須不同 binlog_format=ROW # 推薦 ROW 或 MIXED # 可選:只同步特定庫 # binlog-do-db=your_db # binlog-ignore-db=mysql
重啟 MySQL 服務使配置生效。
CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 120 | | | +------------------+----------+--------------+------------------+
記下 File 與 Position,從庫配置時需用到。
編輯 /etc/my.cnf:
[mysqld] server-id=2 # 唯一 ID,不可與主庫重複 relay-log=relay-bin # 指定 Relay Log 前綴 read-only=1 # 建議開啟,防止從庫誤寫入
重啟從庫 MySQL 服務。
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='StrongPassword123!', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=120, MASTER_CONNECT_RETRY=10;
START SLAVE; SHOW SLAVE STATUS\G
重點檢查兩個關鍵指標必須為 Yes:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
若均為 Yes,代表複制已正常運行。Seconds_Behind_Master: 0 表示無延遲。
主從搭建完成後,可在應用層或中間件(如 MyCat、ProxySQL、MaxScale)配置:寫操作導向主庫,讀操作分發至從庫,顯著提升系統吞吐量。
Last_SQL_Error,常見於主從表結構不一致、主鍵衝突、非確定性函數導致數據差異。slave_parallel_workers(多線程複制)、檢查長事務、考慮升級網路頻寬。MySQL 主從複制是架構演進的基石。掌握其原理、合理選擇 Binlog 格式、規範配置流程、建立監控告警,才能構建穩定可靠的資料庫叢集。