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

MyISAM 索引文件 (.MYI) 損壞修復實戰:REPAIR TABLE USE_FRM

     編輯:MySQL 資料庫相關知識

MyISAM 表由 .frm (結構)、.MYD (數據)、.MYI (索引) 三文件組成。索引文件損壞或丟失時,可利用 .frm 重建索引。本文記錄實驗過程、錯誤現象、修復指令與損壞成因分析。

1. 模擬損壞

mv message_ignore.MYI message_ignore.MYI.bak  # 移除索引文件
/etc/init.d/mysql restart                      # 重啟服務

2. 錯誤現象

  • 錯誤日誌 無任何報錯 (MyISAM 損壞不寫錯誤日誌)。
  • 查詢報錯:ERROR 1017 (HY000): Can't find file: 'message_ignore' (errno: 2)
  • CHECK TABLE 顯示 Corrupt。
  • REPAIR TABLE 普通模式失敗,同樣報 Can't find file。

3. 核心修復指令

REPAIR TABLE message_ignore USE_FRM;

原理:讀取 .frm 結構定義,重新生成 .MYI 索引文件,數據文件 .MYD 必須完好。

4. 驗證修復

CHECK TABLE message_ignore;  -- 顯示 OK
SELECT * FROM message_ignore LIMIT 1;  -- 正常查詢

5. .frm 損壞怎麼辦?

  • 從從庫複製對應 .frm。
  • 從備份恢復 .frm。
  • 若表結構簡單,手工重建 CREATE TABLE ... 產生新 .frm,再 REPAIR TABLE ... USE_FRM。

6. MyISAM 易損壞場景 (官方文檔)

  1. mysqld 進程在寫入中被 kill -9 強制終止。
  2. 作業系統意外斷電/崩潰 (未正常關機)。
  3. 硬體故障 (磁盤壞道、控制器錯誤)。
  4. 外部工具 (如 myisamchk) 在服務器運行時修改表文件。
  5. MySQL/MyISAM 代碼 Bug。

7. 預防建議

  • 生產環境強烈建議遷移至 InnoDB,具備崩潰恢復、雙寫緩衝、Redo Log 保護。
  • 必須用 MyISAM:定期 CHECK TABLE、myisamchk -r 離線維護、備份前 FLUSH TABLES WITH READ LOCK。
  • 配置 myisam_recover_options=BACKUP,FORCE 啟動時自動檢查修復並備份舊文件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved