專為 **MyISAM 表** (.MYD 資料、.MYI 索引) 設計的離線檢查/修復/優化工具。ISAM 表請用 isamchk。
myisamchk [options] tbl_name[.MYI]
*.MYI、跨資料庫 /path/to/datadir/*/*.MYI。| 類別 | 選項 | 功能 |
|---|---|---|
| 檢查模式 | -c / --check | 基本檢查 (預設),找出 99.99% 錯誤 |
-e / --extend-check | 徹底檢查 (逐列驗證索引指向),極慢 | |
-i / --information | 顯示統計資訊 | |
-d / --description | 顯示表描述 (欄位、索引、儲存格式等) | |
| 修復模式 | -r / --recover | 標準恢復,修復幾乎所有損壞 (含重建索引) |
-q / --quick | 快速恢復,**不觸碰 .MYD 資料檔**,僅重建索引 | |
-q -q | 雙重 quick,嘗試修改 .MYD 解決重複鍵等錯誤 (磁碟空間不足時用) | |
-o / --safe-recover | 安全恢復 (舊演算法),較慢但能處理 -r 失敗的極端情況 | |
-f / --force | 覆蓋舊暫存檔,檢查發現錯誤自動轉 -r 修復 | |
-u / --unpack | 解壓 myisampack 壓縮表 | |
| 優化/分析 | -a / --analyze | 分析鍵值分布,優化 JOIN 順序選擇 |
-S / --sort-index | 索引樹塊高到低排序,加速範圍掃描 | |
-R N / --sort-records=N | 依第 N 個索引排序資料,加速該索引的 SELECT/ORDER BY | |
-k N / --keys-used=N | 僅更新前 N 個索引,其餘停用 (加速大量 INSERT) | |
-l / --no-symlinks | 修復時不跟隨符號連結 |
# 32MB 以上記憶體建議
myisamchk -O sort_buffer_size=16M -O key_buffer_size=16M \
-O read_buffer_size=1M -O write_buffer_size=1M ...
sort_buffer_size:排序緩衝,對修復/優化影響最大。key_buffer_size:索引緩衝。TMPDIR:指向大磁碟分區,避免記憶體檔案系統導致 OOM。在 safe_mysqld 啟動腳本加入:檢查過去 24 小時修改過的表,或比 .pid 檔新的表。
# 每週日凌晨 0:35 檢查所有表 (安靜模式,僅報錯)
35 0 * * 0 /usr/local/mysql/bin/myisamchk -s /var/lib/mysql/*/*.MYI
TcX 實務:數年無非硬體故障損壞,每週一次足夠。建議新系統前期每晚檢查最近 24h 修改的表。
| 階段 | 操作 | 適用情況 |
|---|---|---|
| 1. 檢查 | myisamchk *.MYI 或 -e *.MYI | 識別損壞表,僅修復報錯者 |
| 2. 簡單修復 | ① -r -q 快速恢復② 失敗則備份 .MYD → -r 完整恢復③ 失敗則 --safe-recover | 索引損壞、資料檔完整 |
| 3. 困難修復 | ① 移走 .MYD ② mysql> DELETE FROM tbl 重建空表③ 複製舊 .MYD 回新表 ④ 執行 -r -q | 索引檔前 16KB 損壞/遺失 |
| 4. 極度困難 | ① 從備份還原 .frm → 回階段 3 ② 無備份則在別庫建同結構表,複製 .frm/.MYI 回來 → 回階段 2 | .frm 定義檔也損壞 (極罕見) |
myisamchk -r tbl_name # 恢復模式即含優化
# 或 SQL: OPTIMIZE TABLE tbl_name (較易用但較慢)
mysqladmin flush-logs 或 FLUSH LOGS:切換新日誌檔。--log-update):自動產生序號檔 (.001, .002...),舊檔可備份刪除。--log):mv mysql.log mysql.old; mysqladmin flush-tables; 備份刪除 mysql.old。mysql-log-rotate 腳本,配合 cron 自動輪替。