MyISAM 表損壞是運維噩夢,myisamchk 是官方離線檢查修復利器。本文總結大表內存調優、磁碟空間預留、分級修復流程、備份鐵律四大實戰要點,助你從容應對表損壞。
myisamchk 內存上限由 -O 參數控制,預設僅 3MB,大表完全不夠。建議:
# 檢查/修復前評估表大小
ls -lh /var/lib/mysql/db/*.MYD
# 大表單獨處理,調大內存至 16-64MB
myisamchk -O sort_buffer_size=64M -O key_buffer_size=64M \
-O read_buffer_size=16M -O write_buffer_size=16M \
/var/lib/mysql/db/large_table
內存過大反而擠佔系統緩存,16MB 通常是甜點;超大表(>50GB)可分多次處理或用通配符批次。
修復過程會產生臨時數據文件、新索引文件,空間需求:
.MYD 大小(重建數據文件)。-r/-r -q): 需 ≥ 1× 原 .MYI 大小 + 排序緩衝區(約 2× 數據大小)。.MYD + .MYI + .frm)。空間不足時可用 --quick 僅重建索引(不動數據文件),但無法修復數據層損壞。
前置動作(鐵律): STOP MYSQL → 備份原 .MYD/.MYI/.frm 至異地。
| 級別 | 命令 | 適用場景 | 風險 |
|---|---|---|---|
| 1. 快速檢查 | myisamchk --update-state tbl | 常規巡檢,標記損壞表 | 無 |
| 2. 快速修復 | myisamchk -r -q tbl | 僅索引損壞,數據文件完整 | 極低 |
| 3. 標準修復 | myisamchk -r tbl | 數據文件有錯誤/刪除記錄殘留 | 低(重建索引、清理無效行) |
| 4. 索引文件毀損重建 | 1. mv tbl.MYI /safe2. myisamchk -c tbl 生成新 .MYI3. cp /safe/tbl.MYD tbl.MYD4. myisamchk -r -q tbl | 索引文件前 16KB 損壞/丟失 | 中(需手動操作,嚴格按序) |
| 5. 極端:.frm 也損壞 | 放棄 myisamchk,用備份集(全量+增量)整庫恢復 | 表定義文件損壞 | 高(需完備備份策略) |
原則: 低級別修復失敗再升級;--recover 等同 -r,能解決 99% 問題,但無法修復「唯一鍵重複」等邏輯錯誤。
myisamchk -r /var/lib/mysql/db/*.MYI 一次修復全庫。.MYD/.MYI 操作,無需庫目錄。innodb_force_recovery + xtrabackup 或重建副本。myisamchk 三板斧:大表加內存、修復留空間、分級按步驟。配合「停庫→備份→檢查→分級修復→驗證→啟庫」標準化 SOP,將 MyISAM 表損壞從「生產事故」降級為「常規運維動作」。長期來看,核心業務表遷移至 InnoDB 才是根治之道。