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

MySQL 錯誤「Can't open file: 'xxx.MYI' (errno: 145)」完整修復指南:四種修復方案與預防策略

     編輯:MySQL 資料庫相關知識

錯誤 Can't open file: 'xxx.MYI' (errno: 145) 代表 MyISAM 索引檔損壞,常見於斷電、強制關機、檔案系統錯誤或直接搬移資料檔。MyISAM 表損壞機率較高,但修復工具完善,關鍵在於選對工具、停服務操作、備份優先。

四種修復方案(由易到難)

方案一:SQL 指令修復(最簡單,需資料庫連線)

USE your_database;
REPAIR TABLE `damaged_table`;

適用:遠端連線、phpMyAdmin、應用程式內執行。注意:表鎖定期間寫入會阻塞,大表耗時較久。

方案二:phpMyAdmin 圖形介面(視覺化操作)

  1. 進入 phpMyAdmin → 選擇資料庫 → 勾選損壞的表。
  2. 下拉選單選「修復表」→ 執行。
  3. 結果顯示 OK 即修復成功。

方案三:myisamchk 命令列工具(離線深度修復,成功率最高)

前提:必須先停止 MySQL 服務(service mysqld stop),避免檔案被鎖定導致二次損壞。

# 進入 MySQL bin 目錄
cd /usr/local/mysql/bin

# 掃描並修復指定資料庫所有 .MYI
myisamchk -r /path/to/datadir/*.MYI

# 或修復單一表
myisamchk -r /path/to/datadir/table_name.MYI

參數說明:-r (recover) 重建索引;-f (force) 強制覆蓋舊暫存檔;-q (quick) 僅修復索引檔不動資料檔(速度快但較不徹底)。

方案四:mysqlcheck 批次檢查/修復所有資料庫(適合維護腳本)

# 檢查、優化、修復所有庫
mysqlcheck -A -o -r -p

# 僅修復指定庫
mysqlcheck -A -o -r database_name -p

參數:-A (--all-databases)、-o (--optimize)、-r (--repair)。

修復前必做:備份檔案

cp /path/to/datadir/table_name.MYD /backup/
cp /path/to/datadir/table_name.MYI /backup/
cp /path/to/datadir/table_name.frm /backup/

修復失敗時可從備份還原,或結合 Binlog 做時間點恢復(PITR)。

根因預防:從源頭減少損壞

  • 優雅關機:關機前執行 service mysqld stop,確保緩衝區刷盤、檔案正確關閉。
  • UPS 電源保護:避免突然斷電導致寫入中斷。
  • 避免直接搬移 .MYD/.MYI:跨伺服器遷移請用 mysqldump 或 mysqlpump 導出匯入。
  • 定期排程修復:cron 執行 mysqlcheck -A -r 或 myisamchk -r(離線維護窗口)。
  • 考慮遷移至 InnoDB:支援崩潰恢復、行鎖、事務,現代應用首選引擎。

常見誤區提醒

  • ❌ MySQL 服務運行中直接執行 myisamchk -r → 極高機率導致索引更嚴重損壞。
  • ❌ 忽略 .frm 備份 → 表結構遺失時無法識別表定義。
  • ❌ 將 REPAIR TABLE 當作常態運維手段 → 應視為緊急搶救,常態應靠預防與引擎選型。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved