主從複制解決讀寫分離、資料分發、負載均衡、備份與高可用。本文系統梳理複制原理、三線程模型、配置步驟與常見坑點。
關鍵限制:Slave 重放為串行(單 SQL 線程),Master 並行寫入在 Slave 端順序執行,可能成為瓶頸(MySQL 5.7+ 多線程複制緩解)。
[mysqld] log-bin = mysql-bin server-id = 1 binlog-do-db = test binlog-ignore-db = mysql sync_binlog = 1 # 事務提交即刷盤,最高持久性
建立複制帳號:
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'192.168.104.%' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;
[mysqld] server-id = 2 replicate-do-db = test replicate-ignore-db = mysql replicate-ignore-db = information_schema replicate-ignore-db = performance_schema # MySQL 5.1+ 不再支援 my.cnf 內 master_* 參數,改用 CHANGE MASTER TO
# 1. 主從同步停止/重置 STOP SLAVE; RESET SLAVE; RESET MASTER; # 2. 主庫鎖表備份(或用 xtrabackup 熱備) FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; -- 記錄 File, Position # 複製資料目錄到從庫 UNLOCK TABLES; # 3. 從庫設定主庫資訊 CHANGE MASTER TO MASTER_HOST='192.168.104.9', MASTER_USER='backup', MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=106; # 4. 啟動並驗證 START SLAVE; SHOW SLAVE STATUS\G # 確認: Slave_IO_Running: Yes Slave_SQL_Running: Yes Master_Log_File = Relay_Master_Log_File Read_Master_Log_Pos ≈ Exec_Master_Log_Pos
server-id、互為 Master/Slave。auto_increment_increment=2、auto_increment_offset=1/2 錯開 ID。| 現象 | 原因 | 對策 |
|---|---|---|
| IO_Running=No | 網路不通/帳號密碼錯/防火牆 | telnet 3306、檢查 GRANT、關閉防火牆 |
| SQL_Running=No | 重放報錯(鍵衝突/結構不一致) | SHOW SLAVE STATUS\G 看 Last_Error、手動修復或跳過 |
| Seconds_Behind_Master 偏大 | 從庫硬體弱/長事務/大量寫入 | 升級從庫、優化慢查詢、開啟多線程複制 |
| 主庫宕機資料未同步 | sync_binlog!=1 / 半同步未開啟 | 設定 sync_binlog=1、rpl_semi_sync_master=ON |