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

MySQL "Can't open file: table.MYI" 錯誤三種修復方案實戰

     編輯:MySQL 資料庫相關知識

錯誤現象

mysql> REPAIR TABLE mytable;
+--------------------+--------+----------+------------------------------------------+
| Table              | Op     | Msg_type | Msg_text                                 |
+--------------------+--------+----------+------------------------------------------+
| sports_results.mytable | repair | error    | Can't find file: 'mytable.MYI' (errno: 2) |
+--------------------+--------+----------+------------------------------------------+

索引檔(.MYI)遺失或頭部損壞,資料檔(.MYD)通常完好。

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

-- 標準修復
REPAIR TABLE mytable;

-- 索引檔遺失/損壞:使用 .frm 定義重建
REPAIR TABLE mytable USE_FRM;

-- 僅修復索引(資料未動)
REPAIR TABLE mytable QUICK;

-- 逐行重建(最後手段)
REPAIR TABLE mytable EXTENDED;

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

# 修復單表
mysqlcheck -r dbname tbl_name -u root -p

# 修復多表
mysqlcheck -r dbname tbl1 tbl2 -u root -p

# 修復整庫
mysqlcheck -r dbname -u root -p

# 修復所有庫
mysqlcheck -r -A -u root -p

-r = --repair,-A = --all-databases。

方案三:myisamchk 離線修復(需停止 MySQL 或表無活動)


# 進入資料目錄
cd /var/lib/mysql/dbname

# 標準修復(最常用)
myisamchk -r mytable.MYI

# 修復前備份
myisamchk -r -B mytable.MYI

# 安全模式修復(-r 失敗時)
myisamchk --safe-recover mytable.MYI

# 索引檔遺失:用 .frm 重建
myisamchk --recover --force mytable.MYI  # 隱含 USE_FRM 邏輯

# 極速修復(資料檔未修改)
myisamchk -q mytable.MYI

關鍵參數速查

參數說明
-r, --recover標準恢復,修復多數損壞
-o, --safe-recover舊式逐行恢復,慢但徹底
-q, --quick快速模式,不掃描資料檔
-B, --backup修復前備份 .MYD/.MYI
-f, --force覆蓋同名 .TMD 臨時檔
-e, --extend-check嘗試恢復每行,產生垃圾行
--sort-recover排序恢復,臨時檔大但快
-k, --keys-used=#只處理指定索引(位元遮罩)

修復前必做:空間與備份

  • 確保磁碟剩餘空間 ≥ 表大小 × 2(臨時檔 + 備份)。
  • 檔案級備份 .frm .MYD .MYI 到安全位置。

修復後驗證


CHECK TABLE mytable EXTENDED;
ANALYZE TABLE mytable;
SELECT COUNT(*) FROM mytable;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved