首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Shell 腳本監控 MySQL 主從複制:自動檢測異常、記錄日誌、嘗試修復同步

     編輯:MySQL 綜合教學

一、核心監控邏輯

  1. 定時 (crontab) 執行腳本
  2. 檢查 Slave_IO_Running 和 Slave_SQL_Running 均為 Yes
  3. 異常時:記錄時間/IP/錯誤狀態 → 嘗試 SLAVE STOP; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; SLAVE START; 跳過錯誤事務
  4. 正常時:可選記錄心跳日誌

二、基礎監控腳本 (每 10 分鐘)

#!/bin/bash
# /home/crontab/check_mysql_slave.sh

IP_INTERFACE="eth0"
MYSQL_BIN="/usr/local/mysql/bin/mysql"
MYSQL_USER="root"
MYSQL_PASS="123456"
MYSQL_SOCK="/tmp/mysql.sock"
LOG_FILE="/home/logs/check_mysql_slave.log"

# 獲取本機 IP
SLAVE_IP=$(ifconfig $IP_INTERFACE | grep "inet addr" | awk -F'[: ]+' '{print $4}')
DATETIME=$(date +"%Y-%m-%d/%H:%M:%S")

# 獲取主從狀態
STATUS=$($MYSQL_BIN -u$MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK -e "SHOW SLAVE STATUS\G" | grep -i "running")
SLAVE_IO_RUNNING=$(echo "$STATUS" | grep Slave_IO_Running | awk '{print $2}')
SLAVE_SQL_RUNNING=$(echo "$STATUS" | grep Slave_SQL_Running | awk '{print $2}')

if [ "$SLAVE_IO_RUNNING" = "Yes" -a "$SLAVE_SQL_RUNNING" = "Yes" ]; then
  echo "[$DATETIME] Slave is Running!" >> $LOG_FILE
else
  echo "[$DATETIME] $SLAVE_IP Slave is NOT running! IO=$SLAVE_IO_RUNNING SQL=$SLAVE_SQL_RUNNING" >> $LOG_FILE
  
  # 嘗試自動修復:跳過 1 個錯誤事務
  $MYSQL_BIN -u$MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK -e "SLAVE STOP;"
  $MYSQL_BIN -u$MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK -e "SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;"
  $MYSQL_BIN -u$MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK -e "SLAVE START;"
  
  echo "[$DATETIME] Attempted skip counter fix" >> $LOG_FILE
fi

三、進階腳本:完全重新同步(適用於 Skip Counter 失效)

#!/bin/bash
# /home/crontab/slave_repl_full.sh

MASTER_HOST="192.168.1.106"
MASTER_PORT=3307
MASTER_USER="repl"
MASTER_PASS="w!zl7POg27"
SLAVE_HOST="192.168.1.107"
SLAVE_PORT=3307
SLAVE_USER="root"
SLAVE_PASS="w!zl7POg27"

MSTOOL="mysql -h$MASTER_HOST -u$MASTER_USER -p$MASTER_PASS -P$MASTER_PORT"
SLTOOL="mysql -h$SLAVE_HOST -u$SLAVE_USER -p$SLAVE_PASS -P$SLAVE_PORT"

# 獲取從庫狀態
SLAVE_STAT=($($SLTOOL -e "SHOW SLAVE STATUS\G" | grep Running | awk '{print $2}'))

if [ "${SLAVE_STAT[0]}" = "Yes" -a "${SLAVE_STAT[1]}" = "Yes" ]; then
  echo "OK: Slave is running"
  exit 0
fi

echo "CRITICAL: Slave error, starting full resync from Master"

# 從主庫獲取最新 Binlog 位置
FILE=$($MSTOOL -e "SHOW MASTER STATUS\G" | grep "File" | awk '{print $2}')
POS=$($MSTOOL -e "SHOW MASTER STATUS\G" | grep "Position" | awk '{print $2}')

echo "Master log file: $FILE, position: $POS"

# 重新配置從庫同步點
$SLTOOL -e "SLAVE STOP;
  CHANGE MASTER TO 
    MASTER_HOST='$MASTER_HOST',
    MASTER_PORT=$MASTER_PORT,
    MASTER_USER='$MASTER_USER',
    MASTER_PASSWORD='$MASTER_PASS',
    MASTER_LOG_FILE='$FILE',
    MASTER_LOG_POS=$POS;
  SLAVE START;"

sleep 3

# 驗證
$SLTOOL -e "SHOW SLAVE STATUS\G" | grep Running
echo "Resync completed"

四、部署與驗證

> /etc/crontab

# 4. 啟動 cron 服務
service crond start
chkconfig crond on

# 5. 查看日誌驗證
tail -f /home/logs/check_mysql_slave.log

五、關鍵參數說明

參數含義建議值
SQL_SLAVE_SKIP_COUNTER跳過 N 個錯誤事務1 (謹慎使用,可能導致數據不一致)
MASTER_LOG_FILE/POS重新同步起點從 SHOW MASTER STATUS 獲取
Seconds_Behind_Master延遲秒數> 300 告警
Slave_IO_StateIO 線程狀態Connecting/Waiting/Reconnecting 異常

六、生產環境增強建議

  1. 分級告警:IO 錯誤 → 網絡/防火牆檢查;SQL 錯誤 → 數據衝突分析
  2. 延遲監控:增加 Seconds_Behind_Master 閾值告警
  3. GTID 模式 (5.6+):用 CHANGE MASTER TO MASTER_AUTO_POSITION=1 替代文件/位置
  4. 多從庫巡檢:腳本參數化,循環檢查所有從庫
  5. 報警通知:整合企業微信/釘釘/郵件 API,異常即時推送
  6. 審計日誌:所有自動修復操作記錄審計表,事後可追溯

七、總結

Shell + Crontab 實現的 MySQL 主從監控**輕量、無依賴、易部署**。核心是準確解析 SHOW SLAVE STATUS、分級處理 IO/SQL 線程異常、**謹慎使用 Skip Counter**(僅限非關鍵數據)、**完整重同步作為終極手段**。生產環境建議升級為 **Prometheus + mysqld_exporter + Alertmanager** 或 **Orchestrator** 等專業監控體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved