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

MySQL 批量檢查修復腳本:自動化巡檢 MyISAM/InnoDB 表健康狀態

     編輯:MySQL 資料庫相關知識

生產環境資料庫表隨時間增長易產生碎片、索引損壞或統計資訊過期。本文提供一個生產級 Bash 腳本,可遍歷指定資料庫所有表,自動執行 CHECK TABLE、REPAIR TABLE、OPTIMIZE TABLE,並支援配置化參數、日誌記錄、錯誤告警,適合納入 Crontab 定時任務。

腳本功能特性

  • 支援 MyISAM、InnoDB、Archive 等引擎
  • 自動識別需修復/優化的表,避免無效操作
  • 可配置是否執行 OPTIMIZE(大表慎用)
  • 詳細日誌輸出,支援靜默模式
  • 非零退出碼便於監控系統告警

完整腳本代碼

#!/bin/bash
# MySQL 批量表檢查修復優化腳本
# 用法: ./mysql_table_maintenance.sh [--optimize] [--dry-run]

set -euo pipefail

# ========== 配置區 ==========
HOST="127.0.0.1"
USER="root"
PASS="你的密碼"
DB="目標資料庫"
NEED_OPTIMIZE=false
DRY_RUN=false
MYSQL_BIN="/usr/local/webserver/mysql/bin/mysql"
LOG_FILE="/var/log/mysql_table_maintenance_$(date +%Y%m%d).log"
# ============================

# 解析參數
for arg in "$@"; do
    case $arg in
        --optimize) NEED_OPTIMIZE=true ;;
        --dry-run) DRY_RUN=true ;;
    esac
done

log() { echo "[$(date '+%F %T')] $*" | tee -a "$LOG_FILE"; }
run_sql() { $MYSQL_BIN -h"$HOST" -u"$USER" -p"$PASS" "$DB" -A -Bse "$1"; }

log "=== 開始資料庫表健康巡檢: $DB ==="

# 獲取所有表名
tables=$(run_sql "SHOW TABLES")
if [[ -z "$tables" ]]; then
    log "資料庫 $DB 無表,退出"
    exit 0
fi

for table in $tables; do
    log "--- 檢查表: $table ---"
    
    # CHECK TABLE
    check_result=$(run_sql "CHECK TABLE \`$table\`" | awk 'END {print $NF}')
    
    if [[ "$check_result" == "OK" ]]; then
        log "表 $table 狀態正常,無需修復"
    else
        log "表 $table 異常: $check_result,嘗試修復..."
        if [[ "$DRY_RUN" == "false" ]]; then
            repair_output=$(run_sql "REPAIR TABLE \`$table\`")
            log "修復結果: $repair_output"
        else
            log "[DRY-RUN] 跳過實際修復"
        fi
    fi
    
    # OPTIMIZE TABLE (可選)
    if [[ "$NEED_OPTIMIZE" == "true" ]]; then
        log "執行 OPTIMIZE TABLE \`$table\`..."
        if [[ "$DRY_RUN" == "false" ]]; then
            optimize_output=$(run_sql "OPTIMIZE TABLE \`$table\`")
            log "優化結果: $optimize_output"
        else
            log "[DRY-RUN] 跳過實際優化"
        fi
    fi
done

log "=== 巡檢完成 ==="
exit 0

部署與使用指南

1. 部署步驟

# 保存腳本
chmod +x mysql_table_maintenance.sh

# 建立專用監控用戶(最小權限)
mysql -e "CREATE USER 'monitor'@'localhost' IDENTIFIED BY '強密碼';
GRANT SELECT, INSERT, UPDATE ON target_db.* TO 'monitor'@'localhost';
FLUSH PRIVILEGES;"

# 測試運行
./mysql_table_maintenance.sh --dry-run
./mysql_table_maintenance.sh --optimize --dry-run

2. 定時任務配置

# 每天凌晨 2:30 執行檢查修復,每周日額外執行優化
30 2 * * * /path/mysql_table_maintenance.sh >> /var/log/mysql_maintenance_cron.log 2>&1
30 2 * * 0 /path/mysql_table_maintenance.sh --optimize >> /var/log/mysql_maintenance_cron.log 2>&1

3. 監控告警對接

  • 腳本異常退出碼非 0 → 觸發告警
  • 日誌關鍵字「異常」「修復失敗」→ 日誌平台告警
  • 執行時長超過閾值 → 效能告警

進階優化建議

  1. 並行處理:大表量時使用 xargs -P 或 GNU Parallel 並行檢查
  2. 分庫分表:腳本支援傳入 DB 列表,逐庫處理
  3. InnoDB 線上優化:MySQL 5.6+ OPTIMIZE TABLE 已支援 Online DDL,但大表建議用 pt-online-schema-change
  4. 統計資訊更新:ANALYZE TABLE 輕量級更新統計資訊,可高頻執行

常見問題 FAQ

Q: REPAIR TABLE 失敗怎麼辦?
A: 檢查錯誤日誌,常見於磁碟滿、權限不足、表損壞嚴重需從備份恢復
Q: OPTIMIZE TABLE 鎖表太久?
A: 使用 pt-online-schema-change 或維護窗口執行
Q: 腳本能否檢查 Partition 表?
A: 可,CHECK TABLE 支援分區表,會逐分區檢查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved