首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 表檢查修復 Shell 腳本自動化

     編輯:MySQL 資料庫相關知識

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 官方工具
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved