某天下午上班時,發現公司基於 DedeCMS 搭建的網站全盤報錯,MySQL 錯誤日誌直指核心問題:
Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired
文章主表 dede_archives 被標記為損壞,必須修復。本文記錄完整的排查過程、修復步驟與深度分析,供遇到同類問題的開發者參考。
MySQL 安裝目錄下的 bin/myisamchk 是修復 MyISAM 表的利器。具體操作如下:
bin 目錄myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI參數說明: -c 檢查錯誤,-r 執行恢復模式(最常用、速度最快)。
若上述命令失效,可嘗試以下三種遞增強度的修復策略:
| 命令 | 適用場景 | 速度 |
|---|---|---|
myisamchk --recover --quick | 常見索引錯誤,僅修復索引不動數據 | 最快 |
myisamchk --recover | 標準修復,重建索引並驗證數據 | 中等 |
myisamchk --safe-recover | 頑固損壞,逐行掃描重建 | 最慢 |
提示:若報臨時文件無法建立,刪除殘留的臨時文件後重試。
.MYD 數據文件DELETE FROM dede_archives; 生成新空索引.MYD 覆蓋新數據文件myisamchk --recover 重建索引.MYD、.MYI 文件CREATE TABLE 語句重建表(生成新 .frm)# 快速檢查所有庫所有表
myisamchk --silent --fast /path/to/datadir/*/*.MYI
# 檢查並強制修復損壞表(需 64MB+ 空閒內存)
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
FLUSH TABLES WITH READ LOCK,否則會報 warning: clients are using or haven't closed the table properlyCHECK TABLE / REPAIR TABLE SQL 語句,避免文件鎖衝突Error 145 是長久之計dede_archives 頻繁 SELECT/UPDATE,索引易碎裂本案例中,動態頁面高併發讀寫是主因。建議:啟用靜態緩存、遷移至 InnoDB、配置定期 OPTIMIZE TABLE。
MyISAM 表索引損壞(Error 145)雖驚人,但 myisamchk 提供了完整的修復工具鏈。關鍵在於:備份優先、停服操作、分級修復、根因治理。對於核心業務表,強烈建議遷移至 InnoDB 以獲得事務與崩潰恢復保障。