MySQL 定時檢查修復表腳本:自動發現損壞、修復、郵件告警
腳本功能
- 掃描
datadir 所有庫、所有表
- 對每表執行
CHECK TABLE + REPAIR TABLE
- 記錄含 Error 的表至日誌
- Syslog 發送告警至監控服務器
完整腳本
#!/bin/sh
fix_logs='/tmp/fix.log'
user=''
pass=''
check_fix() {
dblist=$(find /usr/dlm_db/mysql/ -type d | grep -vE "logs|_[1-9]|*bak|test" | sed -e "s#/usr/dlm_db/mysql/##g")
echo "start $(date)" > $fix_logs
for dbname in $dblist; do
echo $dbname
for tb_name in $(find /usr/dlm_db/mysql/$dbname -type f | awk -F'/' '{print $NF}' | awk -F'.' '{print $1}' | sort -u); do
mysql -u$user -p$pass $dbname <> $fix_logs
CHECK TABLE $tb_name;
REPAIR TABLE $tb_name;
FFF
done
done
echo "$(date) done" >> $fix_logs
}
send_logs() {
msgip=10.0.7.44
IP=$(cat /etc/rc.conf | grep -E "ifconfig_[em1|bce1]" | awk '{print "IP:"$2}' | sed -n 1p)
fix_info=$(grep -rE "Error|start|done" $fix_logs)
logger -p local1.info -h $msgip "the services: $IP mysql_table_fix_info:$fix_info"
}
check_fix
send_logs
關鍵點解析
CHECK TABLE:檢查損壞,返回 status (OK/Error/Corrupted)
REPAIR TABLE:嘗試修復 MyISAM/Archive/CSV 引擎表,**InnoDB 不支援**(需重建)
sort -u:去重表名(避免 .frm/.MYD/.MYI 重複)
- Here Document (
<) 批量執行 SQL
- Syslog 遠程日誌傳輸,便於集中監控
部署建議
# crontab -e
0 3 * * 0 /path/check_repair.sh # 每週日 03:00 低峰執行
注意事項
- 大表 REPAIR 耗時極長,會鎖表,務必低峰期執行
- InnoDB 表損壞建議:
mysqldump -> DROP -> CREATE -> 導入 或 XtraBackup 恢復
- 生產環境優先用
mysqlcheck --auto-repair --check --all-databases 官方工具