文件結構認知
.frm:表定義 (所有引擎通用)
.MYD:數據文件 (MyISAM)
.MYI:索引文件 (MyISAM)
調用語法
myisamchk [options] tbl_name[.MYI]
# 批量操作
myisamchk *.MYI
myisamchk /path/to/db/*.MYI
myisamchk /var/lib/mysql/*/*.MYI
核心功能選項
| 選項 | 功能 | 典型場景 |
-c, --check | 檢查表 (默認) | 定期巡檢 |
-r, --recover | 恢復/修復表 | 表損壞、崩潰後 |
-q, --quick | 快速修復 (不修改數據文件) | 輕微索引錯誤 |
-f, --force | 強制覆蓋臨時文件 | 修復失敗重試 |
-a, --analyze | 分析鍵值分布 | 優化器統計更新 |
-o, --optimize | 優化表 (整理碎片+統計) | 大量刪除/更新後 |
-d, --description | 顯示表信息 | 查看表結構統計 |
-e, --extend-check | 深度檢查 | 極端損壞排查 |
--set-auto-increment=N | 設置自增起始值 | 數據遷移後重置 |
操作前必須條件
⚠️ 嚴禁在 mysqld 運行時直接操作數據文件!
必須先執行:mysqladmin flush-tables 並確保無活躍查詢,或直接 systemctl stop mysql。
標準修復流程
# 1. 停止服務 (生產環境建議從庫操作)
systemctl stop mysql
# 2. 進入數據目錄
cd /var/lib/mysql/mydb
# 3. 檢查所有表
myisamchk *.MYI
# 4. 發現損壞表進行修復
myisamchk -r -q damaged_table.MYI # 快速修復
# 若失敗
myisamchk -r damaged_table.MYI # 完全修復
# 極端情況
myisamchk -r -e damaged_table.MYI # 深度修復
# 5. 優化所有表
myisamchk -o *.MYI
# 6. 啟動服務
systemctl start mysql
現代替代方案
- SQL 命令:
CHECK TABLE, REPAIR TABLE, OPTIMIZE TABLE, ANALYZE TABLE — 無需停服務,InnoDB 也支持
- Percona Toolkit:
pt-table-checksum, pt-online-schema-change — 線上無鎖操作
- MySQL 8.0+
innodb_force_recovery 參數應對極端崩潰
避坑提醒
--skip-locking 啟動時,myisamchk 讀取可能不一致
- 修復前務必備份
.MYD 和 .MYI
- 大表修復耗時極長,規劃維護窗口
- InnoDB 表**不能**用 myisamchk,需用
innodb_checksum 或 SQL 命令