MySQL 主從複製可實現讀寫分離、即時備份、離線分析等。本文提供從「零」建立從庫的標準化步驟、關鍵參數、驗證指令與常見故障處理。
log_bin,設定唯一 server-id。[mysqld] server-id = 100 log_bin = mysql-bin binlog_format = ROW -- 推薦 ROW 格式,避免非確定性函數導致從庫不一致 expire_logs_days = 7 max_binlog_size = 500M sync_binlog = 1 -- 最高持久性,效能略有影響 innodb_flush_log_at_trx_commit = 1
重啟主庫:systemctl restart mysqld。
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY 'StrongReplPass!'; FLUSH PRIVILEGES;
mysql> SHOW MASTER STATUS\G *************************** 1. row *************************** File: mysql-bin.000005 Position: 251651 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
記錄 File 與 Position,從庫配置需用到。
[mysqld] server-id = 101 -- 必須與主庫不同 relay_log = mysql-relay-bin log_slave_updates = 1 -- 若從庫再做從庫必開 read_only = 1 -- 防止誤寫入 skip_slave_start = 1 -- 手動啟動,避免配置前自動連線報錯
重啟從庫。
CHANGE MASTER TO MASTER_HOST = '192.168.0.232', MASTER_USER = 'repl', MASTER_PASSWORD = 'StrongReplPass!', MASTER_LOG_FILE = 'mysql-bin.000005', MASTER_LOG_POS = 251651; START SLAVE;
SHOW SLAVE STATUS\G
關鍵指標:
Slave_IO_Running: Yes — I/O 執行緒正常接收 Binlog。Slave_SQL_Running: Yes — SQL 執行緒正常重放。Seconds_Behind_Master: 0 — 延遲秒數,0 表示即時同步。Last_IO_Error / Last_SQL_Error — 為空表示無錯誤。| 現象 | 原因 | 處理 |
|---|---|---|
| IO_Running=No, Connect_Error | 網路/防火牆/帳號密碼錯誤 | 檢查 3306 通達性、GRANT IP 段、密碼 |
| SQL_Running=No, Duplicate entry | 主鍵衝突/手動寫入從庫 | STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; (謹慎使用) |
| Seconds_Behind_Master 偏大 | 大事務/慢查詢/硬體瓶頸 | 優化慢 SQL、提升從庫硬體、改用並行複制 (5.6+ slave_parallel_workers) |
| Binlog 格式不匹配 | 主庫 ROW,從庫 STATEMENT | 統一設定 binlog_format=ROW |
[mysqld] gtid_mode = ON enforce_gtid_consistency = ON log_slave_updates = 1
啟動後無需指定 MASTER_LOG_FILE/POS,改用 MASTER_AUTO_POSITION=1,自動定位,支援自動容錯移轉 (MHA/Orchestrator)。