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

MySQL 表損壞修復實戰:Table is marked as crashed and should be repaired

     編輯:MySQL 資料庫相關知識

故障現象

論壇報錯:Table '.\Tablename\posts' is marked as crashed and should be repaired
phpMyAdmin 的 Repair 按鈕無效,需命令列深度修復。

快速修復命令

# 進入 MySQL 安裝目錄 bin 資料夾
myisamchk -c -r ../data/tablename/posts.MYI

-c 檢查,-r 修復(重建索引)。修復完成無需重啟 MySQL 服務即可生效。

根因分析

  1. 頻繁讀寫導致索引錯亂: 動態頁面高頻查詢/更新同一表(如 dede_archives),索引檔易損壞。
  2. 硬體/系統異常: 斷電、殺進程、磁碟壞軌、複製數據檔時服務未停止等導致物理損壞。

錯誤代碼:145

三級修復策略(由輕到重)

級別命令適用場景速度
1. 快速修復myisamchk --recover --quick /path/to/tbl_name常見索引錯誤最快
2. 標準修復myisamchk --recover /path/to/tbl_name快速修復失效中等
3. 安全修復myisamchk --safe-recover /path/to/tbl_name嚴重損壞、其他方法無效最慢

極端損壞:索引檔遺失/不可修復時的重建流程

  1. 備份資料檔:cp tbl_name.MYD /backup/
  2. 重啟 MySQL,連線執行:DELETE FROM tbl_name;(產生新空索引檔)
  3. 停止 MySQL,用備份 .MYD 覆蓋新空資料檔。
  4. 執行標準修復:myisamchk --recover /path/to/tbl_name(根據資料檔 + .frm 重建索引)。

格式檔遺失時的重建流程

  1. 備份 .MYD、.MYI。
  2. 刪除該表所有檔案(.frm, .MYD, .MYI)。
  3. 用原 CREATE TABLE 語句重建表(產生新 .frm)。
  4. 停止服務,覆蓋回備份的 .MYD/.MYI。
  5. 執行標準修復。

myisamchk 進階用法

  • 檢查所有 MyISAM 表:myisamchk --silent --fast /datadir/*/*.MYI
  • 檢查並自動修復所有表:
    myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /datadir/*/*.MYI
    需 >64MB 可用記憶體。

重要注意事項

  • 修復前必須確保表未被使用: 執行 FLUSH TABLES 或停止 MySQL 服務,否則報錯 warning: clients are using or haven't closed the table properly。
  • 生產環境優先使用 SQL 命令 CHECK TABLE / REPAIR TABLE,避免檔案鎖衝突。
  • 定期備份 + 監控磁碟健康是預防表損壞的根本對策。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved