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

Myisamchk 崩潰恢復 MySQL 完整指南

     編輯:MySQL 資料庫相關知識

MyISAM 表損壞的常見誘因

  • mysqld 進程在寫入過程中被強制終止
  • 伺服器意外斷電或硬體故障
  • 磁碟壞軌、記憶體錯誤等底層異常

理解表對應的三個實體檔案至關重要:

檔案用途
tbl_name.frm表定義(結構)檔
tbl_name.MYD資料檔
tbl_name.MYI索引檔

問題最常集中在 .MYD 與 .MYI。

myisamchk 工作原理

工具逐行建立 .MYD 副本,修復結束時刪除舊檔並重命名新檔。
--quick 模式不建立臨時資料檔,假定 .MYD 正確,僅重建索引;雙 --quick 甚至嘗試修正重複鍵等資料錯誤(極度缺磁碟空間時才建議,且必先備份)。

一、如何檢查表錯誤

指令說明
myisamchk tbl_name預設檢查,發現 99.99% 錯誤(不含純資料檔損壞)
myisamchk -e tbl_name擴展檢查,逐鍵驗證每行指向,大表耗時較長
myisamchk -e -i tbl_name同上並輸出統計資訊

一般情況下無參數執行即可;需更多細節可加 -v(最多顯示 20 個錯誤)。

二、如何修復表

典型損壞癥狀

  • 查詢意外中斷
  • 報錯:.frm 被鎖、找不到 .MYI、記錄檔損壞、非預期檔案結束等

四階段修復流程

  1. 階段 1:檢查
    myisamchk *.MYI 或 myisamchk -e *.MYI(加 -s 靜默)。
    僅對報錯的表進入階段 2;若出現記憶體不足或工具崩潰,跳至階段 3。
  2. 階段 2:簡易安全修復
    1. myisamchk -r -q tbl_name(快速恢復,不動資料檔)
    2. 失敗則備份 .MYD 後執行 myisamchk -r tbl_name(標準恢復,重建索引)
    3. 仍失敗則 myisamchk --safe-recover tbl_name(安全恢復,較慢但覆蓋更多案例)
    同樣遇到異常則進階段 3。
  3. 階段 3:困難修復(索引檔前 16KB 損壞或遺失)
    1. 移動 .MYD 至安全處。
    2. 用 .frm 重建空表:
      mysql db_name → DELETE FROM tbl_name; → quit
    3. 將舊 .MYD 複製回新資料檔(保留副本)。
    4. 回階段 2 執行 myisamchk -r -q 應可成功。
  4. 階段 4:極度困難修復(.frm 也損壞)
    1. 從備份還原 .frm 後回階段 3;或還原索引檔回階段 2(用 myisamchk -r)。
    2. 無備份但知建表語句:在別庫建表,刪除新資料檔,移入 .frm 與索引檔,回階段 2 重建索引。

三、表優化

合併碎片、回收刪除/更新產生的空洞:

myisamchk -r tbl_name

等同 OPTIMIZE TABLE,但 myisamchk 更快且無客戶端-伺服器交互開銷。
其他性能相關選項:-S/--sort-index、-R/--sort-records、-a/--analyze。

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