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

MySQL "Can't open file: 'table.MYI'" 錯誤完整修復指南

     編輯:MySQL 資料庫相關知識

MyISAM 表索引檔損壞:三種修復方案全解析

遇到 Can't open file: 'table.MYI' (errno: 2) 錯誤時,通常意味著 MyISAM 表的索引檔(.MYI)遺失或檔頭損壞。本文詳細說明三種標準修復路徑,並針對不同損壞程度給出操作建議。

核心原則

  • 90% 以上損壞僅涉及索引檔,資料檔(.MYD)與定義檔(.frm)通常完好。
  • 修復前必須備份:需預留雙倍表大小的磁碟空間。
  • 僅適用 MyISAM,InnoDB 等引擎需從備份恢復。

方案一:SQL 指令 REPAIR TABLE(服務需運行)

REPAIR TABLE `table_name` [QUICK | EXTENDED | USE_FRM];

選項策略:

  1. 預設無參數:大多數情況足夠。
  2. QUICK:索引未被修改過,最快。
  3. USE_FRM:.MYI 遺失或檔頭損壞時必須使用,利用 .frm 定義重建索引。
  4. EXTENDED:嘗試逐列恢復,最後手段,可能產生垃圾列。

實戰案例:

-- 一般修復失敗
mysql> REPAIR TABLE mytable;
| mytable | repair | error | Can't find file: 'mytable.MYI' (errno: 2) |

-- 使用 USE_FRM 成功
mysql> REPAIR TABLE mytable USE_FRM;
| mytable | repair | warning | Number of rows changed from 0 to 2 |
| mytable | repair | status  | OK |

方案二:mysqlcheck 命令列工具(服務可運行)

支援批量修復多表或整庫:

# 修復單表
mysqlcheck -r db_name table_name -u user -p

# 修復指定多表
mysqlcheck -r db_name table1 table2 -u user -p

# 修復整個資料庫所有表
mysqlcheck -r db_name -u user -p

輸出 OK 即成功。適合腳本化自動化維護。

方案三:myisamchk 離線深度修復(服務必須停止或表鎖定)

前置條件:停止 MySQL 服務,或確保表處於非活動狀態(未啟用 skip-external-locking)。需在 .MYI 檔案目錄下執行或指定完整路徑。

# 最常用:標準恢復
myisamchk -r /var/lib/mysql/db/table_name

# 徹底修復(-r 失敗時使用):逐列重建索引
myisamchk --safe-recover /var/lib/mysql/db/table_name

# 快速修復(資料檔未修改)
myisamchk -q /var/lib/mysql/db/table_name

# 修復前自動備份
myisamchk -B -r /var/lib/mysql/db/table_name

關鍵參數說明:

參數用途
-r, --recover標準恢復,修復多數損壞,大表可調大 sort_buffer_size 加速
-o, --safe-recover最徹底修復,逐列重建,較慢但成功率最高
-q, --quick快速模式,不掃描資料檔,僅修索引樹
-e, --extend-check嘗試恢復每一列,最後手段
-f, --force覆蓋同名臨時檔
-B, --backup修復前備份 .MYD 為 .BAK

修復流程決策樹

  1. 嘗試 REPAIR TABLE tbl USE_FRM(最快、線上)。
  2. 失敗則停服務,用 myisamchk -r 標準恢復。
  3. 仍失敗用 myisamchk --safe-recover 徹底修復。
  4. 均無效 → 從備份恢復。

預防措施

  • 避免強制殺進程、斷電、磁碟滿寫入。
  • 定期 CHECK TABLE 或 mysqlcheck -c 掃描隱患。
  • 重要業務遷移至 InnoDB,利用 Redo Log 保證崩潰安全。

掌握這三套修復工具鏈,能從容應對 MyISAM 索引損壞的各種情況,最大程度挽回資料資產。

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