主從復制是 MySQL 高可用與讀寫分離的基石。本文基於 Debian 5 + MySQL 5.0 + InnoDB 環境,詳細記錄搭建步驟、關鍵參數解析,並深度剖析 Slave_IO_Running: No、Error 1236 等經典故障的根因與修復方案。
--single-transaction 熱備[mysqld] log-bin = /opt/log.bin/45 server-id = 45
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.1.1.43' IDENTIFIED BY 'replpass';
注意:使用 GRANT 語句無需手動 FLUSH PRIVILEGES,權限即時生效。
mysqldump -uroot -p --single-transaction --flush-logs --master-data --all-databases > all.sql
關鍵參數解析:
--single-transaction:InnoDB 熱備核心,利用 MVCC 獲得一致性視圖,不阻塞寫入。--flush-logs:備份前滾動 binlog,新日誌檔對應備份時間點。--master-data:在 dump 檔頭部寫入 CHANGE MASTER TO 語句,自動記錄 MASTER_LOG_FILE 與 MASTER_LOG_POS。[mysqld] server-id = 43
cat all.sql | mysql -uroot -p
從 dump 檔頭部提取位點資訊(或手動指定):
CHANGE MASTER TO
MASTER_HOST='10.1.1.45',
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='45.000064',
MASTER_LOG_POS=98;
START SLAVE;
SHOW SLAVE STATUS\G;
確認 Slave_IO_Running: Yes、Slave_SQL_Running: Yes、Seconds_Behind_Master: 0。
replicate-do-db=test replicate-wild-do-table=test.dave replicate-wild-do-table=test.davehe
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; -- 事務類型可能需執行多次 START SLAVE;
或單獨控制 IO/SQL 線程:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; STOP SLAVE SQL_THREAD; START SLAVE SQL_THREAD;
現象:主機宕機重啟後,從庫報錯:
Error reading packet from server: Client requested master to start replication from impossible position (server_errno=1236)
根因分析:
sync_binlog=0,事務提交不強制 fsync,binlog 留在 OS cache。驗證步驟:
# 主庫檢視實際 binlog 末尾位點 mysqlbinlog 99.000302 > /tmp/test tail -n 10 /tmp/test # 發現實際位點 165111351 < 從庫記錄的 165112917
修復方案:
CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_PORT=3306,
MASTER_LOG_FILE='99.000303', -- 指向下一個 binlog 檔
MASTER_LOG_POS=98; -- 新檔案起始位點
[mysqld] sync_binlog=1 -- 每次事務提交強制 fsync,犧牲約 5 倍寫入效能,換取零數據丟失
若效能敏感,可妥協設 sync_binlog=100 或配合電池備援寫入快取(BBWC)控制器。
Seconds_Behind_Master,設定告警閾值(如 > 300 秒)Slave_IO_Running、Slave_SQL_Running 狀態pt-table-checksum)master.info、relay-log.info 以便災難恢復主從復制看似簡單,細節決定成敗。掌握 binlog 機制、事務提交與 fsync 的關係,才能在故障發生時精準定位、快速恢復,守住資料的最後一道防線。