標準處理流程圖
檢查表 → [通過] 結束
→ [失敗] 備份 .MYD/.MYI/.frm → 修復 → [成功] 結束
→ [失敗] 從備份/Binlog 還原
前置必要動作
- 建立備份:
cp -a /var/lib/mysql/db/tbl.* /backup/
- 停止寫入:
FLUSH TABLES tbl WITH READ LOCK 或停止服務。
- 使用 mysql 系統帳號操作 (Linux): 避免檔案擁有權錯亂。
工具選擇
| 引擎 | 工具 | 索引檔 | 資料檔 |
| MyISAM | myisamchk | .MYI | .MYD |
| ISAM (舊) | isamchk | .ISM | .ISD |
| InnoDB | innodb_force_recovery / 重做日誌 | 不適用 myisamchk |
myisamchk 檢查模式對比
| 模式 | 指令 | 深度 | 耗時 | 適用 |
| 標準 | myisamchk tbl | 99.99% 錯誤 | 快 | 日常巡檢 |
| 擴展 | myisamchk -e tbl | 逐鍵逐列驗證 | 慢 (大表小時級) | 懷疑資料損壞 |
| 中等 | myisamchk -m tbl | 折中 | 中 | 較少用 |
| 僅檢查變更表 | myisamchk -C tbl | 上次檢查後有寫入 | 極快 | 定時任務 |
修復指令
# 安全修復 (保留資料檔,重建索引)
myisamchk -r tbl
# 強力修復 (重建資料檔,可能丟失資料)
myisamchk -o tbl
# 自動模式 (檢查失敗才修復)
myisamchk -a tbl
批次操作技巧
# 檢查整個資料庫目錄
myisamchk /var/lib/mysql/mydb/*.MYI
# 檢查所有資料庫
myisamchk /var/lib/mysql/*/*.MYI
實用參數
-v 詳細輸出 (最多 20 錯誤後停止)。
-i 顯示統計資訊 (記錄數、索引長度、碎片率)。
--sort-buffer-size=256M --key-buffer-size=512M 大表加速修復。
InnoDB 損壞處理 (補充)
innodb_force_recovery=1..6 分級啟動讀取資料。
- 用
mysqldump 導出 → 重建表 → 匯入。
- 嚴重時從備份還原 + Binlog PITR。
預防勝於治療
- 啟用
innodb_checksum_algorithm=crc32 (預設)。
- 定期
CHECK TABLE / mysqlcheck -A --auto-repair。
- 硬體層面:ECC 記憶體、RAID、UPS、定期
smartctl 檢測磁碟健康。
MyISAM 修復相對直觀,但生產環境強烈建議全面遷移至 InnoDB,享受崩潰自動恢復與 ACID 保障。
- 上一篇文章: MySQL 中文 LIKE 查詢亂碼根因與四大解決方案 (BINARY、字符集、LOCATE、COLLATE)
- 下一篇文章: MySQL 主從複制架構完整實作指南:從基礎配置到雙向同步與故障轉移
Copyright ©
程式碼之家 All Rights Reserved