首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL MyISAM 表索引損壞:錯誤 145 的排查與修復實戰

     編輯:MySQL 資料庫相關知識

前言

某天下午上班時,發現公司基於 DedeCMS 搭建的網站全盤報錯,MySQL 錯誤日誌直指核心問題:

Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired

文章主表 dede_archives 被標記為損壞,必須修復。本文記錄完整的排查過程、修復步驟與深度分析,供遇到同類問題的開發者參考。

一、快速修復:使用 myisamchk 工具

MySQL 安裝目錄下的 bin/myisamchk 是修復 MyISAM 表的利器。具體操作如下:

  1. 進入 MySQL 安裝目錄的 bin 目錄
  2. 執行命令:
    myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
  3. 工具自動檢查並重建索引文件
  4. 重啟 MySQL 服務,網站恢復正常

參數說明: -c 檢查錯誤,-r 執行恢復模式(最常用、速度最快)。

二、三種修復模式對比

若上述命令失效,可嘗試以下三種遞增強度的修復策略:

命令適用場景速度
myisamchk --recover --quick常見索引錯誤,僅修復索引不動數據最快
myisamchk --recover標準修復,重建索引並驗證數據中等
myisamchk --safe-recover頑固損壞,逐行掃描重建最慢

提示:若報臨時文件無法建立,刪除殘留的臨時文件後重試。

三、極端情況:索引文件丟失或格式文件損壞

情況 A:.MYI 索引文件丟失/不可修復

  1. 備份 .MYD 數據文件
  2. 重啟 MySQL,執行 DELETE FROM dede_archives; 生成新空索引
  3. 停止服務,用備份的 .MYD 覆蓋新數據文件
  4. 執行標準修復 myisamchk --recover 重建索引

情況 B:.frm 格式文件丟失

  1. 備份 .MYD、.MYI 文件
  2. 刪除該表所有相關文件
  3. 用原始 CREATE TABLE 語句重建表(生成新 .frm)
  4. 執行標準修復確保索引一致性

四、myisamchk 進階用法與最佳實踐

批量檢查/修復所有 MyISAM 表

# 快速檢查所有庫所有表
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

關鍵注意事項

  • 務必停止 MySQL 服務 或執行 FLUSH TABLES WITH READ LOCK,否則會報 warning: clients are using or haven't closed the table properly
  • 生產環境建議改用 CHECK TABLE / REPAIR TABLE SQL 語句,避免文件鎖衝突
  • 定期備份 + 監控 Error 145 是長久之計

五、根因分析:為什麼會損壞?

  1. 高頻讀寫衝突:動態頁面未靜態化,導致 dede_archives 頻繁 SELECT/UPDATE,索引易碎裂
  2. 非正常關機:斷電、殺進程、磁盤滿導致寫入中斷
  3. 文件層面操作:服務運行時直接拷貝/刪除數據文件
  4. 硬體/FS 錯誤:磁盤壞塊、文件系統損壞

本案例中,動態頁面高併發讀寫是主因。建議:啟用靜態緩存、遷移至 InnoDB、配置定期 OPTIMIZE TABLE。

六、總結

MyISAM 表索引損壞(Error 145)雖驚人,但 myisamchk 提供了完整的修復工具鏈。關鍵在於:備份優先、停服操作、分級修復、根因治理。對於核心業務表,強烈建議遷移至 InnoDB 以獲得事務與崩潰恢復保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved