表損壞是 MyISAM 時代 DBA 的噩夢,狀包含查詢中斷、.MYI 遺失、錯誤代碼 135/144/145、資料檔截斷等。本文提供分級修復策略:從最快的「僅修索引」到「重建索引檔」,再到「從備份恢復」與「無備份重建」,並說明關鍵工具 myisamchk 參數與操作細節。
tbl_name.frm is locked against changeCan't find file: 'tbl_name.MYI' (Errcode: ###)Got error ### from table handler(135 除外)Unexpected end of file / Record file is crashedmyisamchk -r -q tbl_name
isamchk -r -q tbl_name
-r:恢復模式-q:快速模式,僅依索引檔重建,不掃描資料檔myisamchk -r tbl_name
isamchk -r tbl_name
myisamchk --safe-recover tbl_name
isamchk --safe-recover tbl_name
前提:.frm 表定義檔完整,.MYD 資料檔完整
cd /var/lib/mysql/db_name/mv tbl_name.MYD /safe/place/.frm 重建空表:
mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit
cp /safe/place/tbl_name.MYD ./myisamchk -r -q tbl_name(此時應成功).frm、.MYD、.MYI 三檔CHECK TABLE 驗證前提:記得 CREATE TABLE 陳述式或有 Schema 備份
.MYD 資料檔.frm .MYD .MYI)mysql 中執行 CREATE TABLE 重建結構.MYD 覆蓋新建立的空資料檔| 參數 | 用途 |
|---|---|
-r / --recover | 恢復模式(標準修復) |
-q / --quick | 快速模式,不掃描資料檔 |
--safe-recover | 安全恢復模式(舊演算法) |
--force | 強制覆蓋舊暫存檔 |
--analyze | 分析索引分佈(配合優化) |
mysqldump --single-transaction --master-data=2(InnoDB)或 mysqlhotcopy(MyISAM)CHECK TABLE 排程 + 告警mysqladmin shutdownfsck表損壞修復是「外科手術」,分級策略能最大化搶救成功率。但請記住:最好的修復是不需要修復——完備的備份策略與 InnoDB 引擎,才是資料安全的真正基石。