錯誤 Can't open file: 'xxx.MYI' (errno: 145) 代表 MyISAM 索引檔損壞,常見於斷電、強制關機、檔案系統錯誤或直接搬移資料檔。MyISAM 表損壞機率較高,但修復工具完善,關鍵在於選對工具、停服務操作、備份優先。
USE your_database;
REPAIR TABLE `damaged_table`;
適用:遠端連線、phpMyAdmin、應用程式內執行。注意:表鎖定期間寫入會阻塞,大表耗時較久。
OK 即修復成功。前提:必須先停止 MySQL 服務(service mysqld stop),避免檔案被鎖定導致二次損壞。
# 進入 MySQL bin 目錄
cd /usr/local/mysql/bin
# 掃描並修復指定資料庫所有 .MYI
myisamchk -r /path/to/datadir/*.MYI
# 或修復單一表
myisamchk -r /path/to/datadir/table_name.MYI
參數說明:-r (recover) 重建索引;-f (force) 強制覆蓋舊暫存檔;-q (quick) 僅修復索引檔不動資料檔(速度快但較不徹底)。
# 檢查、優化、修復所有庫
mysqlcheck -A -o -r -p
# 僅修復指定庫
mysqlcheck -A -o -r database_name -p
參數:-A (--all-databases)、-o (--optimize)、-r (--repair)。
cp /path/to/datadir/table_name.MYD /backup/
cp /path/to/datadir/table_name.MYI /backup/
cp /path/to/datadir/table_name.frm /backup/
修復失敗時可從備份還原,或結合 Binlog 做時間點恢復(PITR)。
service mysqld stop,確保緩衝區刷盤、檔案正確關閉。mysqldump 或 mysqlpump 導出匯入。cron 執行 mysqlcheck -A -r 或 myisamchk -r(離線維護窗口)。myisamchk -r → 極高機率導致索引更嚴重損壞。.frm 備份 → 表結構遺失時無法識別表定義。REPAIR TABLE 當作常態運維手段 → 應視為緊急搶救,常態應靠預防與引擎選型。