Slave_IO_Running 和 Slave_SQL_Running 均為 YesSLAVE STOP; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; SLAVE START; 跳過錯誤事務#!/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
#!/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_State | IO 線程狀態 | Connecting/Waiting/Reconnecting 異常 |
Seconds_Behind_Master 閾值告警CHANGE MASTER TO MASTER_AUTO_POSITION=1 替代文件/位置Shell + Crontab 實現的 MySQL 主從監控**輕量、無依賴、易部署**。核心是準確解析 SHOW SLAVE STATUS、分級處理 IO/SQL 線程異常、**謹慎使用 Skip Counter**(僅限非關鍵數據)、**完整重同步作為終極手段**。生產環境建議升級為 **Prometheus + mysqld_exporter + Alertmanager** 或 **Orchestrator** 等專業監控體系。