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

非法關機導致 MySQL 系統表損壞:myisamchk 逐步修復實戰記錄

     編輯:MySQL 資料庫相關知識

斷電/殺進程導致 MyISAM 系統表崩潰完整修復流程

非正常關機 (斷電、kill -9、OOM Killer) 易導致 MyISAM 表標記為 crashed,系統庫 (mysql.host、mysql.user、mysql.db、mysql.plugin) 損壞會阻止 mysqld 啟動,錯誤日誌典型特徵:
Table './mysql/host' is marked as crashed and last (automatic?) repair failed

修復步驟實戰紀錄

  1. 確認服務狀態:netstat -anp | grep mysqld、mysql -uroot -p 連線失敗。
  2. 查看錯誤日誌:定位損壞表名 (如 ./mysql/host)。
  3. 進入資料目錄:cd /var/lib/mysql/mysql (視 datadir 而定)。
  4. 逐表修復:myisamchk -of table_name.MYI
    -o 最佳化、-f 強制修復。輸出 recovering (with keycache) 及 Data records: N 表示成功。
  5. 修復順序:host → user → db → plugin (依日誌報錯順序)。
  6. 啟動驗證:/usr/local/mysql/bin/mysqld_safe & → netstat -anp | grep 3306 → mysql -uroot -p 登入 → 網頁訪問正常。

關鍵命令速查

# 檢查所有 MyISAM 表
myisamchk *.MYI

# 自動修復所有損壞表
myisamchk -r -f *.MYI

# 僅檢查不修復
myisamchk -c *.MYI

# 修復並更新統計資訊
myisamchk -r -q *.MYI  # 快速修復
myisamchk -r *.MYI     # 完整修復

預防與最佳實踐

  • 避免 kill -9:優雅關閉 mysqladmin shutdown 或 systemctl stop mysqld。
  • 啟用自動修復:my.cnf 加入 myisam_recover_options=FORCE,BACKUP (啟動時自動檢查修復)。
  • 系統表轉 InnoDB:MySQL 5.7+ 系統表預設 InnoDB,避免 MyISAM 崩潰風險。舊版可手動轉換:ALTER TABLE mysql.user ENGINE=InnoDB;
  • 定期備份:mysqldump --all-databases --single-transaction --master-data=2 確保可時間點恢復。
  • 檔案權限:資料目錄擁有者 mysql:mysql,目錄 700,檔案 660。

延伸:InnoDB 崩潰恢復

InnoDB 具備崩潰恢復能力 (Redo Log + Doublewrite Buffer),啟動時自動回滾未提交事務、重做已提交事務。若 Redo Log 損壞,需從備份恢復或重建實例。

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