事故背景
- 環境:Windows Server 2003 + MySQL
- 損壞表:
function_products(MyISAM)
- 症狀:查詢報錯、備份檔同樣損壞
損壞成因分析
- 意外斷電 /
kill -9 強制終止 MySQL 進程
- 高負載下強制備份導致檔案寫入中斷
- 檔案系統錯誤
關鍵認知:損壞發生時若不知情,後續備份會同步損壞資料,導致所有備份皆不可用。
修復核心原則
- 必須停止 MySQL 服務,確保
myisamchk 獨佔存取
- 修復前務必備份 原始檔案(
.frm、.MYD、.MYI)
- 在檔案副本上操作,驗證無誤後再替換原檔
MyISAM 檔案結構
| 檔案 | 用途 |
tbl_name.frm | 表定義(欄位、型別、索引結構) |
tbl_name.MYD | 資料檔案 |
tbl_name.MYI | 索引檔案 |
myisamchk 檢查與修復命令
1. 基本檢查
myisamchk /path/to/db/tbl_name
myisamchk /path/to/db/tbl_name.MYI
2. 檢查所有表
myisamchk /path/to/db/*.MYI
myisamchk /path/to/data/*/*.MYI
3. 深度檢查(較慢但更徹底)
myisamchk --extend-check /path/to/tbl_name
4. 修復模式(由輕到重)
# 快速修復(僅修復索引樹)
myisamchk --recover --quick /path/to/tbl_name
# 標準修復(重建索引、修復資料)
myisamchk --recover /path/to/tbl_name
# 強力修復(嘗試恢復所有可讀資料行)
myisamchk --safe-recover /path/to/tbl_name
# 極端修復(強制修復,可能丟失資料)
myisamchk --recover --force /path/to/tbl_name
Windows 環境實操步驟
- 開啟 CMD,切換至 MySQL
bin 目錄
- 停止 MySQL 服務:
net stop mysql
- 備份損壞表三個檔案至安全位置
- 執行修復:
myisamchk --recover --quick "C:\mysql\data\dbname\function_products"
- 若無效,升級嘗試
--safe-recover、--recover --force
- 修復完成後啟動 MySQL 驗證
預防措施
- 定期執行
CHECK TABLE / myisamchk 掃描
- 備份策略:完整備份 + 二進制日誌,支援 PITR
- 避免
kill -9,使用 mysqladmin shutdown 優雅停機
- 重要表考慮遷移至 InnoDB,獲得崩潰自動恢復能力