面試高頻題:描述 MySQL Replication 實現原理,如何在不停主庫的情況下恢復數據不一致的 Slave? 本文拆解「基於 Binlog 的單線程異步複製」核心機制,給出標準修復流程與工具化方案。
關鍵特性:異步、單線程重放(5.6 前)、Binlog 格式(STATEMENT/ROW/MIXED)影響一致性。
CHANGE MASTER TO MASTER_LOG_FILE='xxx', MASTER_LOG_POS=yyy 指定起始位點。master.info 記錄下次請求位點。-- 1. 主庫:獲取當前 Binlog 位點(加鎖保證一致性快照)
mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000015 | 123456 | | |
+------------------+----------+--------------+------------------+
-- 記錄 File + Position,隨即 UNLOCK TABLES(或用 mysqldump --master-data=2 獲取)
-- 2. 從庫:停止複製、重新定位、啟動
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000015',
MASTER_LOG_POS=123456;
mysql> START SLAVE;
-- 3. 驗證
mysql> SHOW SLAVE STATUS\G
-- 關鍵指標:Slave_IO_Running=Yes, Slave_SQL_Running=Yes, Seconds_Behind_Master=0
| 方案 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| 重新 CHANGE MASTER (上述) | Slave 輕微漂移、位點可追溯 | 操作簡單、無需備份文件 | Binlog 已輪轉丟失則不可用 |
| 主庫全量備份 + Binlog 恢復 | Slave 嚴重損壞、Binlog 不全 | 徹底重建、數據最乾淨 | 耗時長、主庫有鎖/負載影響 |
| Percona XtraBackup 流式備份 | 大數據量、低 RTO | 熱備、不鎖主庫、速度快 | 需額外存儲/網路帶寬 |
| pt-table-checksum + pt-table-sync | 定期一致性檢查、自動修復 | 工具化、可定時任務 | 需理解工具參數、可能產生負載 |
| GTID 復制 (5.6+) | 新架構部署 | 自動定位、故障轉移簡單 | 需 5.6+、配置較複雜 |
Seconds_Behind_Master:SQL Thread 落後 Master 的秒數(不準,受長事務影響)。Relay_Log_Space:Relay Log 總大小,暴增說明 SQL Thread 卡頓。Exec_Master_Log_Pos vs Read_Master_Log_Pos:重放位點 vs 接收位點,差距大 = 延遲。log_slave_updates,支援級聯複製與備份。掌握複製原理與修復 SOP,是 DBA 從「會用」進階到「敢用、善用」的分水嶺。