ERROR 145 (HY000): Table './db/tbl' is marked as crashed and should be repaired
MyISAM 表索引檔 (.MYI) 損壞,常見於斷電、殺進程、磁碟滿、硬體故障。
# 進入資料目錄
cd /var/lib/mysql/dbname
# 1. 快速檢查+修復 (最常用)
myisamchk -r tbl_name
# 2. 強制修復 (快速失敗時)
myisamchk -r -f tbl_name
# 3. 安全修復 (最慢、最徹底)
myisamchk --safe-recover tbl_name
F:\> cd sqldata\mysql\bin
F:\sqldata\mysql\bin> cd ..\data\dbname
F:\sqldata\mysql\data\dbname> ..\bin\myisamchk -r tbl_name
- recovering (with sort) MyISAM-table 'tbl_name'
Data records: 7216
- Fixing index 1
- Fixing index 2
- Fixing index 3
@echo off
cd /d F:\sqldata\mysql\data\dbname
..\bin\myisamchk -r tbl_name
pause
.MYD (資料檔) 與 .frm (結構檔)。DELETE FROM tbl_name; (產生新空 .MYI)。.MYD 覆蓋新檔。myisamchk -r tbl_name 重建索引。.MYD、.MYI。CREATE TABLE 重建表 (產生新 .frm)。.MYD/.MYI。| 參數 | 用途 |
|---|---|
| -c / --check | 檢查錯誤 |
| -r / --recover | 修復 (快速排序法) |
| --safe-recover | 安全修復 (舊版相容) |
| -f / --force | 強制覆蓋臨時檔 |
| -q / --quick | 僅修復索引樹,不掃描資料 |
| --analyze | 分析關鍵字分佈 |
| --sort-index | 排序索引 |
# 每日巡檢所有 MyISAM 表
myisamchk --silent --force --fast --update-state \
-O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M \
/var/lib/mysql/*/*.MYI
innodb_force_recovery。發現 crashed
│
├─ 有備份? → 是 → 直接還原 (最快最安)
│
└─ 否 → myisamchk -r (快速修復)
│
├─ 成功 → 驗證資料 → 完成
│
└─ 失敗 → myisamchk -r -f (強制)
│
├─ 成功 → 驗證 → 完成
│
└─ 失敗 → --safe-recover
│
└─ 仍失敗 → 索引重建法 / 結構重建法
建立標準修復 SOP,納入運維手冊,關鍵時刻不慌不亂。