主從復制是 MySQL 高可用、讀寫分離、備份卸載的基石。本文以雙節點(Master 192.168.10.1 / Slave 192.168.10.2)為例,完整演示授權、Binlog 啟用、數據基線同步、從庫配置、狀態驗證及常見錯誤修復全流程。
mysqldump/xtrabackup,不影響主庫服務。-- 僅授予 REPLICATION SLAVE 權限,最小化風險 GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'192.168.10.%' IDENTIFIED BY 'repl_pass'; FLUSH PRIVILEGES;
# /etc/my.cnf [mysqld] 區段 server-id = 1 log-bin = /var/log/mysql/mysql-bin.log binlog_format = ROW -- 推薦 ROW 格式,避免非確定性函數導致不一致 expire_logs_days = 7 -- 自動清理 7 天前舊日誌 max_binlog_size = 500M
重啟後驗證:
SHOW VARIABLES LIKE 'log_bin'; -- ON SHOW MASTER STATUS; -- 記錄 File/Position,後續同步基線
# Master:刷新日誌並鎖表導出(-F 產生新 binlog,-l 鎖表) mysqldump -uroot -p -F -l --all-databases > /tmp/full.sql scp /tmp/full.sql 192.168.10.2:/tmp/ # Slave:清空舊數據並導入 mysql -uroot -p -e "RESET MASTER;" mysql -uroot -p < /tmp/full.sql
# /etc/my.cnf [mysqld] server-id = 2 relay-log = /var/log/mysql/mysql-relay-bin log-slave-updates = 1 -- 若 Slave 還做他庫的 Master read-only = 1 -- 防止誤寫入
登錄 Slave 實例執行:
CHANGE MASTER TO MASTER_HOST='192.168.10.1', MASTER_USER='repl_user', MASTER_PASSWORD='repl_pass', MASTER_LOG_FILE='mysql-bin.000002', -- 取自 Master SHOW MASTER STATUS MASTER_LOG_POS=107; START SLAVE;
SHOW SLAVE STATUS\G # 關鍵指標均為 Yes 即正常 Slave_IO_Running: Yes -- IO 線程正常拉取 Binlog Slave_SQL_Running: Yes -- SQL 線程正常重放 Seconds_Behind_Master: 0 -- 延遲 0 秒
| 現象 | 原因 | 修復方案 |
|---|---|---|
| Slave_SQL_Running=No | 從庫誤寫入/事務回滾導致數據衝突 | 方案一:STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; 跳過 1 事務方案二:重新指定 Master Log File/Position 同步 |
| Seconds_Behind_Master=NULL | IO 線程異常/網絡中斷 | 檢查網絡、防火牆、Master 是否正常;SHOW SLAVE STATUS 看 Last_IO_Error |
| Duplicate entry 錯誤 | 主鍵衝突 | 同方案一跳過,或修正數據後重啟 |
pt-table-checksum 校驗主從一致性。Seconds_Behind_Master 告警閾值(如 > 300s 觸發)。掌握上述全流程,即可在生產環境穩健落地 MySQL 主從架構,為高可用與讀寫分離奠定堅實基礎。