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

MyISAM 表損壞成因、症狀與修復全攻略:CHECK TABLE、REPAIR TABLE 與 myisamchk 實戰

     編輯:MySQL 資料庫相關知識

損壞常見成因

  • mysqld 進程寫入中被強制殺掉(kill -9、OOM Killer)。
  • 意外斷電/系統崩潰。
  • 硬件故障(磁盤壞道、內存錯誤、RAID 降級)。
  • 外部工具(如 myisamchk)在服務器修改表時並發操作。
  • MySQL/MyISAM 代碼缺陷(極少見)。

典型症狀

  • 查詢報錯:Incorrect key file for table: '...'. Try to repair it
  • 查詢無法找到已知存在的行,或返回不完整結果集。

在線修復(服務運行中)


-- 檢查
CHECK TABLE tbl_name [FAST | QUICK | MEDIUM | EXTENDED | CHANGED];

-- 修復
REPAIR TABLE tbl_name [QUICK | EXTENDED | USE_FRM];
  • QUICK:僅修復索引樹,速度快。
  • EXTENDED:逐行重建索引,徹底但慢。
  • USE_FRM:.MYI 索引文件丟失時,從 .frm 重建結構。

離線修復(服務停止)


# 檢查
myisamchk tbl_name.MYI
# 或
myisamchk -c tbl_name.MYI

# 修復
myisamchk -r tbl_name.MYI        # 快速修復
myisamchk -r -q tbl_name.MYI     # 僅重建索引
myisamchk --safe-recover tbl_name.MYI  # 安全模式(慢但穩)

操作前必備份 .MYD/.MYI/.frm 文件。

頻繁損壞的根因排查

  1. 查錯誤日誌找 restarted mysqld → 確認是否服務器崩潰導致。
  2. 若非崩潰,可能是 MyISAM 代碼缺陷 → 構建可復現測試案例提交 Bug。
  3. 檢查硬件健康:smartctl、memtest86、RAID 狀態。
  4. 避免運行中用 myisamchk 直接操作表文件。

避坑建議

  • 重要業務避免使用 MyISAM,改用 InnoDB(崩潰安全、事務支持、行鎖)。
  • 必須用 MyISAM 時:定期 CHECK TABLE、備份驗證、監控磁盤健康。
  • MySQL 5.7+ 默認存儲引擎為 InnoDB,MyISAM 逐步邊緣化。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved