| 現象 | 典型錯誤碼 | 核心原因 |
|---|---|---|
| Slave_IO_Running: No | 1236, 1045, 2003 | 網絡不通、認證失敗、Binlog 位點無效、主庫 Binlog 已清理 |
| Slave_SQL_Running: No | 1062, 1032, 1053 | 主鍵衝突(1062)、行不存在(1032)、主庫語句執行錯誤(1053) |
SHOW SLAVE STATUS\G 記錄 Last_IO_Error / Last_SQL_Error、Master_Log_File、Read_Master_Log_PosSHOW MASTER STATUS 對比主庫當前 Binlog 文件/位點tail -f /var/log/mysqld.log(或 Windows 事件查看器)telnet master_ip 3306錯誤日志:Client requested master to start replication from impossible position (errno=1236)
-- 1. 停止 Slave
STOP SLAVE;
-- 2. 獲取主庫最新 Binlog 位點
SHOW MASTER STATUS;
-- 假設返回: mysql-bin.000080, 0
-- 3. 重新指向(從新文件開頭開始)
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000080',
MASTER_LOG_POS=0;
-- 4. 啟動
START SLAVE;
注意:若中間有數據未同步,將導致數據不一致。生產環境需結合備份恢復。
SELECT User, Host FROM mysql.user WHERE User='repl_user';mysql -h master_ip -u repl_user -p對策:
1. 從備份恢復 Slave 全量數據
2. 記錄備份時刻對應的 Master Binlog 位點
3. 按場景 A 步驟重新建立同步
原因:Slave 端有獨立寫入、或並行復制衝突。
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
原理:跳過當前報錯的事件(一條 SQL 或一個事務),繼續執行後續事件。
SHOW SLAVE STATUS\G 獲取報錯 SQL(Last_SQL_Error)原因:UPDATE/DELETE 目標行在 Slave 不存在。
-- 手動補齊缺失行(從 Master 查詢對應數據)
INSERT INTO tbl (...) VALUES (...); -- 或 UPDATE 修正
-- 然後跳過
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
現象:Query partially completed on the master (error on master: 1053) and was aborted.
STOP SLAVE;
-- 手動在 Slave 執行報錯的那條 SQL(從 Last_SQL_Error 獲取)
INSERT INTO hx_stat_record ...;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE;
-- 重置 GTID 執行歷史
STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
START SLAVE;
優勢:無需手動管理 Binlog 位點,自動定位斷點續傳。
read_only=1、super_read_only=1(5.7.8+)expire_logs_days >= 7,配合備份週期Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master 全量納入監控log_error_verbosity=3 記錄完整錯誤上下文#!/bin/bash
# check_slave_status.sh
STATUS=$(mysql -e "SHOW SLAVE STATUS\G" | grep -E 'Slave_(IO|SQL)_Running|Last_.*_Error|Seconds_Behind_Master')
IO=$(echo "$STATUS" | grep Slave_IO_Running | awk '{print $2}')
SQL=$(echo "$STATUS" | grep Slave_SQL_Running | awk '{print $2}')
BEHIND=$(echo "$STATUS" | grep Seconds_Behind_Master | awk '{print $2}')
if [ "$IO" != "Yes" ] || [ "$SQL" != "Yes" ]; then
echo "ALERT: Slave status abnormal!"
echo "$STATUS"
exit 1
elif [ "$BEHIND" -gt 300 ]; then
echo "WARN: Slave lag ${BEHIND}s > 5min"
exit 2
else
echo "OK: Slave running normally, lag ${BEHIND}s"
fi
IO 線程斷 = 連不上/找不到日志 → 檢查網絡/認證/位點重置
SQL 線程斷 = 執行出錯 → 看錯誤碼:1062/1032 跳過或修數據,1053 手執行再跳過
核心原則:先診斷再動手,跳過前必備份,修復後必驗證數據一致性。