MyISAM 表索引損壞是常見故障,表現為 Table 'xxx' is marked as crashed and should be repaired。本文記錄實戰修復流程、三級修復策略、極端情況重建方案與 myisamchk 完整參數手冊。
Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired
原因:頻繁讀寫衝突、非正常關機、磁碟故障、殺進程導致未刷盤等。
# 1. 定位 MYI 索引文件
find / -name "dede_archives.MYI"
# 假設路徑:/var/lib/mysql/dedecmsv4/dede_archives.MYI
# 2. 停止 MySQL 服務(必須,避免並發寫入)
service mysql stop
# 3. 執行標準修復
myisamchk -r /var/lib/mysql/dedecmsv4/dede_archives.MYI
# -r = --recover 標準恢復模式
# 4. 啟動驗證
service mysql start
| 級別 | 命令 | 適用場景 | 速度 | 成功率 |
|---|---|---|---|---|
| 1. 快速修復 | myisamchk --recover --quick | 常見索引錯誤、數據文件完好 | 最快 | 90%+ |
| 2. 標準修復 | myisamchk --recover | 快速修復失敗、數據文件可能受損 | 中等 | 99%+ |
| 3. 安全修復 | myisamchk --safe-recover | 嚴重損壞、其他方法失效 | 最慢 | 最高 |
# 1. 備份數據文件
cp /var/lib/mysql/db/tbl.MYD /tmp/tbl.MYD.bak
# 2. 進入 MySQL 清空表(自動生成新空 MYI)
mysql> DELETE FROM tbl;
# 3. 退出 MySQL,停止服務
# 4. 覆蓋回原數據文件
cp /tmp/tbl.MYD.bak /var/lib/mysql/db/tbl.MYD
# 5. 執行標準修復(根據 MYD + frm 重建 MYI)
myisamchk -r /var/lib/mysql/db/tbl.MYI
# 1. 備份 MYD + MYI
cp /var/lib/mysql/db/tbl.* /tmp/
# 2. 刪除原表所有文件
rm /var/lib/mysql/db/tbl.*
# 3. 重建表結構(生成新 frm)
mysql> CREATE TABLE tbl (...原建表語句...);
# 4. 停止服務,覆蓋回 MYD + MYI
cp /tmp/tbl.MYD /var/lib/mysql/db/
cp /tmp/tbl.MYI /var/lib/mysql/db/
# 5. 標準修復
myisamchk -r /var/lib/mysql/db/tbl.MYI
| 參數 | 作用 |
|---|---|
-c, --check | 檢查表錯誤(預設動作) |
-r, --recover | 恢復模式(修復) |
-q, --quick | 快速模式,不掃描數據文件 |
-s, --silent | 靜默模式,僅報錯 |
-f, --force | 強制覆蓋臨時文件 |
--safe-recover | 安全恢復模式(舊版算法) |
--analyze | 分析鍵值分布 |
--sort-index | 排序索引樹 |
--parallel-recover | 並行恢復(多線程) |
# 推薦:快速靜默檢查
myisamchk --silent --fast /var/lib/mysql/*/*.MYI
# 假設內存 > 64MB,可加大排序緩衝
myisamchk --sort-buffer-size=256M --key-buffer-size=512M \
--read-buffer-size=64M --write-buffer-size=64M \
/var/lib/mysql/*/*.MYI
warning: clients are using or haven't closed the table properlyCHECK TABLE tbl_name 可在線檢查,無需停庫CHECK TABLE 或 mysqlcheck -A --auto-repair掌握 myisamchk 三級修復策略與極端重建方案,能在索引損壞事故中將損失降至最低,保障業務連續性。