萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從同步常見故障排查手冊:主鍵衝突跳過、Binlog 找不到、啟動失敗實戰解決

故障一:主鍵衝突導致 SQL 線程停止

現象

Last_Error: Error 'Duplicate entry '14772680-15' for key 'PRIMARY' ...
Query: 'UPDATE pre_forum_post SET position=position+14 WHERE tid IN('14772680','14773058')'

解決:跳過衝突事件

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 2;  -- 跳過 2 個事件(視具體事件數)
START SLAVE;
SHOW SLAVE STATUS\G;  -- 確認 Slave_SQL_Running: Yes

注意:GTID 模式下不可用此法,需用「空交易跳過」法(見文章 179471)。

故障二:IO 線程啟動失敗,Binlog 找不到

現象

Slave_IO_Running: No
Last_IO_Error: Got fatal error 1236: 'Could not find first log file name in binary log index file' from master

原因

主庫已清理/輪轉掉從庫需要的 Binlog(expire_logs_days 過短或手動 PURGE BINARY LOGS)。

解決:重新定位到現有最早 Binlog

# 主庫查看現有最早 binlog
SHOW BINARY LOGS;
-- 或
SHOW MASTER STATUS\G;

# 從庫重新指定
STOP SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.002323', MASTER_LOG_POS=121077462;
START SLAVE;

若主庫已無足夠 Binlog,需**重新做全量備份+建立複寫**。

故障三:MySQL 啟動失敗 "Manager of pid-file quit without updating file"

現象

service mysql start
Starting MySQL. ERROR! Manager of pid-file quit without updating file.

排查步驟

  1. 查錯誤日誌:tail -f /var/log/mysqld.log(或 /data/mysql/mysql-error.log)。
  2. 常見原因:
    • 資料目錄權限錯誤(chown -R mysql:mysql /data/mysql)。
    • innodb_log_file_size 修改後未刪除舊 ib_logfile*。
    • 配置語法錯誤(mysqld --help --verbose 驗證)。
    • 磁碟空間耗盡(df -h)。
    • 殘留進程未清理(pkill -9 mysqld)。

臨時繞過:安全模式啟動

/usr/bin/mysqld_safe --user=mysql &
# 觀察是否正常啟動,正常則 Ctrl+C,再嘗試標準啟動

故障四:Seconds_Behind_Master 持續增長(延遲)

參考文章 179495 多維度優化方案。

日常巡檢腳本(納入監控)

#!/bin/bash
# check_slave.sh
STATUS=$(mysql -uroot -p'pass' -e "SHOW SLAVE STATUS\G" 2>/dev/null)
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 IO/SQL not running!" | mail -s "MySQL Slave Down" admin@example.com
fi
if [[ "$BEHIND" -gt 300 ]]; then
    echo "WARN: Slave lag $BEHIND seconds" | mail -s "MySQL Slave Lag" admin@example.com
fi
copyright © 萬盛學電腦網 all rights reserved