萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL "Can't open file" / 表損壞修復全流程:REPAIR、mysqlcheck、myisamchk 三板斧

典型錯誤現象

1. Can't open file: 'mytable.MYI' (errno: 2)
2. Table 'picture' is marked as crashed and should be repaired

僅適用 MyISAM 表。InnoDB 損壞需從備份恢復或 innodb_force_recovery。

修復前準備

  • **務必先備份** 數據目錄(需 2x 表大小空間)。
  • 確認磁盤空間充足。

方法一:REPAIR TABLE SQL(服務運行中)

REPAIR TABLE tbl_name [QUICK | EXTENDED | USE_FRM];
  • QUICK:僅修復索引樹,數據文件未損壞時最快。
  • EXTENDED:逐行重建索引,可恢復更多數據,慢,可能產生垃圾行。
  • USE_FRM:.MYI 丟失/頭部損壞時,用 .frm 定義重建索引(救命稻草)。

實戰:.MYI 丟失修復

mysql> REPAIR TABLE mytable USE_FRM;
+------------------------+--------+----------+-----------------------------------------------+
| Table                  | Op     | Msg_type | Msg_text                                      |
+------------------------+--------+----------+-----------------------------------------------+
| sports_results.mytable | repair | warning  | Number of rows changed from 0 to 2            |
| sports_results.mytable | repair | status   | OK                                            |
+------------------------+--------+----------+-----------------------------------------------+

方法二:mysqlcheck 命令行(服務運行中)

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

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

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

輸出 OK 表示成功。可同時優化 mysqlcheck -o -r db_name。

方法三:myisamchk 離線修復(服務**必須停止**或表無活動)

# 進入數據目錄
cd /var/lib/mysql/db_name

# 最常用:自動恢復
myisamchk -r tbl_name.MYI

# 徹底修復(-r 失敗時)
myisamchk --safe-recover tbl_name.MYI

# 快速修復(數據文件未變)
myisamchk -q tbl_name.MYI
myisamchk -q -q tbl_name.MYI  # 修改數據文件

# 關鍵參數加速
myisamchk --sort_buffer_size=256M --key_buffer_size=512M -r tbl_name.MYI

關鍵參數速查

參數短用途
--backup-b修復前備份 .BAK
--recover-r標準恢復(最常用)
--safe-recover-o徹底恢復,慢
--quick-q快速模式
--extend-check-e嘗試恢復每行,產生垃圾行
--force-f覆蓋同名 .TMD 臨時文件

預防勝於治療

  1. 定期 CHECK TABLE / mysqlcheck -c 巡檢。
  2. 避免強制殺進程、斷電、磁盤滿寫入。
  3. 重要數據**必須**有備份策略(邏輯+物理)。
  4. 考慮遷移至 InnoDB(崩潰恢復能力強得多)。
copyright © 萬盛學電腦網 all rights reserved