生產環境資料庫表隨時間增長易產生碎片、索引損壞或統計資訊過期。本文提供一個生產級 Bash 腳本,可遍歷指定資料庫所有表,自動執行 CHECK TABLE、REPAIR TABLE、OPTIMIZE TABLE,並支援配置化參數、日誌記錄、錯誤告警,適合納入 Crontab 定時任務。
#!/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
# 保存腳本 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: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
xargs -P 或 GNU Parallel 並行檢查OPTIMIZE TABLE 已支援 Online DDL,但大表建議用 pt-online-schema-changeANALYZE TABLE 輕量級更新統計資訊,可高頻執行pt-online-schema-change 或維護窗口執行CHECK TABLE 支援分區表,會逐分區檢查