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

MySQL 表損壞修復實戰:myisamchk 三級修復、FRM 遺失重建、備份還原避坑指南

     編輯:MySQL 資料庫相關知識

損壞徵兆識別

  • tbl_name.frm is locked
  • Can't find file: 'tbl_name.MYI' (Errcode: xxx)
  • Got error xxx from table handler (135 除外)
  • Unexpected end of file / Record file is crashed

MyISAM 三級修復階梯 (由輕到重)

Level 1:快速索引修復 (不動資料檔)

myisamchk -r -q tbl_name
# -r recover、-q quick (僅重建索引)

適用:索引檔輕度損壞、資料檔完整

Level 2:標準修復 (重建索引、清理刪除記錄)

myisamchk -r tbl_name

適用:Level 1 失效、資料檔有殘留刪除標記

Level 3:安全模式修復 (舊演算法、處理極端損壞、較慢)

myisamchk --safe-recover tbl_name

適用:前兩級均失效、索引檔前 16KB 損壞

困難修復:索引檔前 16KB / 遺失 / 損壞

  1. 進入資料庫目錄:cd /var/lib/mysql/db_name
  2. 備份資料檔:cp tbl_name.MYD /safe/path/
  3. 3. 利用 FRM 重建空表:
    mysql -e "USE db_name; DELETE FROM tbl_name;"  # 觸發重建 MYD/MYI
    4. 覆蓋資料檔:cp /safe/path/tbl_name.MYD ./tbl_name.MYD 5. 執行 Level 1 修復:myisamchk -r -q tbl_name

極度困難:FRM 也損壞/遺失

  1. 從備份還原 tbl_name.frm → 回到困難修復步驟 3
  2. 2. 無備份但記得 CREATE TABLE 陳述式:
    cd /var/lib/mysql/db_name
    mv tbl_name.MYD /safe/
    mysql -e "USE db_name; CREATE TABLE tbl_name (...原結構...);"
    mv /safe/tbl_name.MYD ./tbl_name.MYD
    myisamchk -r -q tbl_name

InnoDB 表損壞策略 (完全不同)

  • 不可用 myisamchk (會破壞表空間)
  • 啟用 innodb_force_recovery = 1..6 由輕到重嘗試導出資料
  • 導出後重建表、導入資料
  • 嚴重時僅能從備份還原

預防勝於修復

措施頻率/配置
定期 CHECK TABLE每日低峰 CHECK TABLE tbl_name FAST QUICK;
監控錯誤日誌log_error + 告警關鍵字
物理備份xtrabackup 每日全量 + 增量
邏輯備份驗證每週測試環境還原演練
避免 kill -9優雅關機 systemctl stop mysqld
磁碟健康SMART 監控、RAID、定期巡檢

結語

MyISAM 修復有 myisamchk 三級階梯,InnoDB 靠 innodb_force_recovery 導出重建。但最可靠的修復是備份還原。建立「備份 → 驗證 → 演練」閉環,才能在災難面前從容應對。

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