遇到 Can't open file: 'table.MYI' (errno: 2) 錯誤時,通常意味著 MyISAM 表的索引檔(.MYI)遺失或檔頭損壞。本文詳細說明三種標準修復路徑,並針對不同損壞程度給出操作建議。
.MYD)與定義檔(.frm)通常完好。REPAIR TABLE `table_name` [QUICK | EXTENDED | USE_FRM];
選項策略:
QUICK:索引未被修改過,最快。USE_FRM:.MYI 遺失或檔頭損壞時必須使用,利用 .frm 定義重建索引。EXTENDED:嘗試逐列恢復,最後手段,可能產生垃圾列。實戰案例:
-- 一般修復失敗
mysql> REPAIR TABLE mytable;
| mytable | repair | error | Can't find file: 'mytable.MYI' (errno: 2) |
-- 使用 USE_FRM 成功
mysql> REPAIR TABLE mytable USE_FRM;
| mytable | repair | warning | Number of rows changed from 0 to 2 |
| mytable | repair | status | OK |
支援批量修復多表或整庫:
# 修復單表
mysqlcheck -r db_name table_name -u user -p
# 修復指定多表
mysqlcheck -r db_name table1 table2 -u user -p
# 修復整個資料庫所有表
mysqlcheck -r db_name -u user -p
輸出 OK 即成功。適合腳本化自動化維護。
前置條件:停止 MySQL 服務,或確保表處於非活動狀態(未啟用 skip-external-locking)。需在 .MYI 檔案目錄下執行或指定完整路徑。
# 最常用:標準恢復
myisamchk -r /var/lib/mysql/db/table_name
# 徹底修復(-r 失敗時使用):逐列重建索引
myisamchk --safe-recover /var/lib/mysql/db/table_name
# 快速修復(資料檔未修改)
myisamchk -q /var/lib/mysql/db/table_name
# 修復前自動備份
myisamchk -B -r /var/lib/mysql/db/table_name
關鍵參數說明:
| 參數 | 用途 |
|---|---|
-r, --recover | 標準恢復,修復多數損壞,大表可調大 sort_buffer_size 加速 |
-o, --safe-recover | 最徹底修復,逐列重建,較慢但成功率最高 |
-q, --quick | 快速模式,不掃描資料檔,僅修索引樹 |
-e, --extend-check | 嘗試恢復每一列,最後手段 |
-f, --force | 覆蓋同名臨時檔 |
-B, --backup | 修復前備份 .MYD 為 .BAK |
REPAIR TABLE tbl USE_FRM(最快、線上)。myisamchk -r 標準恢復。myisamchk --safe-recover 徹底修復。CHECK TABLE 或 mysqlcheck -c 掃描隱患。掌握這三套修復工具鏈,能從容應對 MyISAM 索引損壞的各種情況,最大程度挽回資料資產。