mysql> REPAIR TABLE mytable;
+--------------------+--------+----------+------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------------+--------+----------+------------------------------------------+
| sports_results.mytable | repair | error | Can't find file: 'mytable.MYI' (errno: 2) |
+--------------------+--------+----------+------------------------------------------+
索引檔(.MYI)遺失或頭部損壞,資料檔(.MYD)通常完好。
-- 標準修復
REPAIR TABLE mytable;
-- 索引檔遺失/損壞:使用 .frm 定義重建
REPAIR TABLE mytable USE_FRM;
-- 僅修復索引(資料未動)
REPAIR TABLE mytable QUICK;
-- 逐行重建(最後手段)
REPAIR TABLE mytable EXTENDED;
# 修復單表
mysqlcheck -r dbname tbl_name -u root -p
# 修復多表
mysqlcheck -r dbname tbl1 tbl2 -u root -p
# 修復整庫
mysqlcheck -r dbname -u root -p
# 修復所有庫
mysqlcheck -r -A -u root -p
-r = --repair,-A = --all-databases。
# 進入資料目錄
cd /var/lib/mysql/dbname
# 標準修復(最常用)
myisamchk -r mytable.MYI
# 修復前備份
myisamchk -r -B mytable.MYI
# 安全模式修復(-r 失敗時)
myisamchk --safe-recover mytable.MYI
# 索引檔遺失:用 .frm 重建
myisamchk --recover --force mytable.MYI # 隱含 USE_FRM 邏輯
# 極速修復(資料檔未修改)
myisamchk -q mytable.MYI
| 參數 | 說明 |
|---|---|
| -r, --recover | 標準恢復,修復多數損壞 |
| -o, --safe-recover | 舊式逐行恢復,慢但徹底 |
| -q, --quick | 快速模式,不掃描資料檔 |
| -B, --backup | 修復前備份 .MYD/.MYI |
| -f, --force | 覆蓋同名 .TMD 臨時檔 |
| -e, --extend-check | 嘗試恢復每行,產生垃圾行 |
| --sort-recover | 排序恢復,臨時檔大但快 |
| -k, --keys-used=# | 只處理指定索引(位元遮罩) |
.frm .MYD .MYI 到安全位置。
CHECK TABLE mytable EXTENDED;
ANALYZE TABLE mytable;
SELECT COUNT(*) FROM mytable;