#!/bin/bash
HOST=192.168.0.123
USER=xiaomo
PWD=my_pwd
DB=my_db_name
NEED_OPTIMIZE=true
TABLES=$(mysql -h$HOST -u$USER -p$PWD $DB -A -Bse "SHOW TABLES")
for TBL in $TABLES; do
# 1. 檢查
CHECK_RESULT=$(mysql -h$HOST -u$USER -p$PWD $DB -A -Bse "CHECK TABLE $TBL" | awk '{print $4}')
if [[ "$CHECK_RESULT" == "OK" ]]; then
echo "[$TBL] OK, no repair needed"
else
echo "[$TBL] Check failed: $CHECK_RESULT, repairing..."
mysql -h$HOST -u$USER -p$PWD $DB -A -Bse "REPAIR TABLE $TBL"
fi
# 2. 優化(可選)
if [[ "$NEED_OPTIMIZE" == "true" ]]; then
echo "[$TBL] Optimizing..."
mysql -h$HOST -u$USER -p$PWD $DB -A -Bse "OPTIMIZE TABLE $TBL"
fi
done
# 檢查並自動修復所有庫所有表 mysqlcheck -h $HOST -u $USER -p$PWD --auto-repair --check --all-databases # 僅優化指定庫 mysqlcheck -h $HOST -u $USER -p$PWD --optimize $DB # 組合:檢查、修復、優化、分析 mysqlcheck -h $HOST -u $USER -p$PWD --check --auto-repair --optimize --analyze $DB
| 維度 | Shell 腳本 | mysqlcheck |
|---|---|---|
| 可視性 | 高(逐表輸出狀態、決策邏輯) | 低(聚合輸出,難定位問題表) |
| 可控性 | 強(可加條件判斷、跳過、告警) | 弱(全量執行,難干預單表) |
| 執行效率 | 可並行化改造 | 串行,大庫極慢 |
| 適用場景 | 生產常規維護、需審計留痕 | 測試環境、小庫、一次性全檢 |
Data_free / Data_length > 20% 的表執行 OPTIMIZExargs -P 4 -I {} sh -c '...' <<< "$TABLES"(注意連接數限制)**生產環境首選 Shell 精細控制**,邏輯透明、可干預、可審計;**mysqlcheck 適合測試/小庫快速全檢**。將腳本納入定時任務(如每周日 02:00),配合碎片率閾值動態優化,讓表維護從「被動救火」轉為「主動養護」。