下午上班時發現公司的 Dedecms 網站全頁報錯,查看 MySQL 錯誤日誌,赫然出現以下提示:
Table '.dedecmsv4dede_archives' is marked as crashed and should be repaired
訊息直指文章主表 dede_archives 索引損壞,必須立即修復。經過資料還原與原因排查,最終成功解決,現整理完整流程供參考。
bin/myisamchk 工具。myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI錯誤編號為 145。常見原因包括:
dede_archives 表頻繁被查詢與更新,索引極易損壞。當嘗試修復損壞表時,可依嚴重程度選擇:
| 指令 | 適用場景 | 速度 |
|---|---|---|
myisamchk --recover --quick /path/to/tblName | 最常見的索引錯誤,不動資料檔 | 最快 |
myisamchk --recover /path/to/tblName | 需重建索引並清理無效記錄 | 中等 |
myisamchk --safe-recover /path/to/tblName | 前兩者失效時的最後手段 | 最慢 |
提示:若報臨時檔無法建立,請刪除殘留的臨時檔後重試。
若 .MYI 索引檔損壞嚴重或遺失,可利用資料檔 .MYD 與結構檔 .frm 重建:
tblName.MYD。DELETE FROM tblName; 清空表,同時生成新索引檔。.MYD 覆蓋新建的空資料檔。.frm 損壞若 .frm 遺失但清楚原 CREATE TABLE 語句:
.frm。myisamchk 專為 MyISAM 表(.MYI/.MYD)設計,可獲取資訊、檢查、修復、優化。
myisamchk [options] tbl_namemyisamchk /path/to/database_dir/*.MYImyisamchk /path/to/datadir/*/*.MYImyisamchk --silent --fast /path/to/datadir/*/*.MYI # 僅檢查 myisamchk --silent --force --fast --update-state \ -O key_buffer=64M -O sort_buffer=64M \ -O read_buffer=1M -O write_buffer=1M \ /path/to/datadir/*/*.MYI # 檢查並修復
執行前請確保無其他程序佔用表(停止 MySQL 或執行 FLUSH TABLES),否則會報 warning: clients are using or haven't closed the table properly。
索引損壞雖屬低概率事件,但一旦發生影響極大。掌握 myisamchk 分級修復流程、平時做好備份與靜態化,能將風險降至最低。