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

MySQL 表損壞修復三大法寶:REPAIR TABLE、mysqlcheck、myisamchk

     編輯:MySQL 資料庫相關知識

現象識別

Table 'tablename' is marked as crashed and should be repaired

多因非正常關機導致索引檔(.MYI)損壞,資料檔(.MYD)通常完好。

方法一:SQL 層修復(服務運行中)

ANALYZE TABLE tbl;
CHECK TABLE tbl;
REPAIR TABLE tbl [QUICK | EXTENDED | USE_FRM];
  • QUICK:僅修復索引樹,速度最快,適用索引未變動。
  • EXTENDED:逐行重建索引,可能產生垃圾行,最後手段。
  • USE_FRM:.MYI 遺失或頭部損壞時,用 .frm 定義重建索引。

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

# 修復單表
mysqlcheck -r db_name tbl_name -uuser -ppass

# 修復多表
mysqlcheck -r db_name tbl1 tbl2 -uuser -ppass

# 修復整庫
mysqlcheck -r db_name -uuser -ppass

支援 --auto-repair、--optimize 等參數,適合腳本自動化巡檢。

方法三:myisamchk 底層離線修復(服務停止或表鎖定)

必須確保表不被訪問,否則損壞加劇。

# 檢查
myisamchk tbl_name.MYI

# 修復(最常用)
myisamchk -r tbl_name.MYI

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

# 快速修復(資料檔未變)
myisamchk -q -r tbl_name.MYI

關鍵參數:-r recover、-o safe-recover、-q quick、-f force 覆蓋 .TMD 臨時檔。

安全操作流程(含表鎖協調)

  1. 客戶端執行 LOCK TABLE tbl READ; FLUSH TABLE tbl; 並保持連線。
  2. 另開終端執行 myisamchk 檢查/修復。
  3. 修復完成回客戶端 FLUSH TABLE tbl; UNLOCK TABLES; 釋放鎖。

若需修復寫入,改用 LOCK TABLE tbl WRITE。

備份先行原則

修復前務必備份 .MYD/.MYI/.frm,需雙倍磁碟空間。myisamchk -B 可自動備份。

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