損壞癥狀識別
- 查詢報錯:
Table 'xxx' is marked as crashed and last (automatic?) repair failed
- 錯誤日志出現:
Incorrect key file for table 'xxx'; try to repair it
CHECK TABLE tbl_name 返回 status: Table is marked as crashed
工具選型決策樹
| 場景 | 推薦工具 | 是否需停庫 | 適用引擎 |
| MyISAM 表、可停機維護窗口 | myisamchk (離線,速度最快,修復最徹底) | 是 | MyISAM |
| MyISAM 表、7x24 不可停機 | mysqlcheck (在線,熱修復) | 否 | MyISAM |
| InnoDB 表 | 不可用上述工具,依賴 Crash Recovery / 邏輯備份恢復 | - | InnoDB |
方案一:myisamchk 離線深度修復 (最推薦 MyISAM)
標準流程
# 1. 停止 MySQL (防止數據文件被修改)
systemctl stop mysqld
# 2. 進入數據目錄
cd /var/lib/mysql/mydb
# 3. 檢查所有表 (只檢查不修復)
myisamchk *.MYI
# 4. 修復損壞表 (-r 恢復模式,-q 快速模式僅修復索引)
myisamchk -r -q tbl_name.MYI
# 若 -r -q 失敗,去掉 -q 允許修改數據文件
myisamchk -r tbl_name.MYI
# 若仍失敗,安全恢復模式 (更慢但更徹底)
myisamchk --safe-recover tbl_name.MYI
# 5. 啟動 MySQL
systemctl start mysqld
參數詳解
-r, --recover:恢復模式,修復索引,刪除錯誤行/已刪除行。
-q, --quick:快速模式,**僅修復索引文件 (.MYI),不觸碰數據文件 (.MYD)**,極快。
--safe-recover:舊版恢復算法,處理極少數常規模式無法修復的情況 (如索引文件頭損壞)。
-f, --force:**慎用!** 強制修復,遇無法修復錯誤直接刪除壞塊/行,**可能導致數據丟失**。
方案二:mysqlcheck 在線熱修復 (業務不能停)
# 修復指定庫所有表
mysqlcheck -r -u root -p mydb
# 修復指定表
mysqlcheck -r -u root -p mydb tbl_name
# 自動修復所有庫所有表 (慎用)
mysqlcheck -r -A -u root -p
# 參數說明
# -r, --repair: 修復
# -A, --all-databases: 所有庫
# -o, --optimize: 優化表 (整理碎片,等同 OPTIMIZE TABLE)
# -a, --analyze: 分析表 (更新統計信息)
極端損壞:數據文件 (.MYD) 完好,索引文件 (.MYI) 丟失/損壞
# 1. 停庫
systemctl stop mysqld
# 2. 備份 .MYD 文件
cp tbl_name.MYD /backup/
# 3. 進入 MySQL 重建表結構 (利用 .frm)
mysql -u root -p mydb
mysql> DELETE FROM tbl_name; -- 或 TRUNCATE TABLE tbl_name; (會重建 .MYI)
mysql> QUIT;
# 4. 還原數據文件
cp /backup/tbl_name.MYD /var/lib/mysql/mydb/
# 5. 標準修復
myisamchk -r -q tbl_name.MYI
# 6. 啟庫驗證
InnoDB 表損壞應對 (完全不同機制)
- 不需要手工修復工具:InnoDB 啟動時自動進行 **Crash Recovery** (Redo Log 前滾 + Undo Log 回滾)。
- 若自動恢復失敗 (極罕見):
- 設置
innodb_force_recovery = 1..6 (從 1 開始嘗試) 啟動導出數據。
- 導出數據後重建表/實例。
- 預防勝於治療:
innodb_flush_log_at_trx_commit=1, sync_binlog=1, 定期物理備份 (xtrabackup)。
預防措施
- 優先使用 InnoDB:事務保護、自動崩潰恢復、行級鎖。
- 定期
CHECK TABLE / mysqlcheck -c:早發現早處理。
- 避免磁盤寫滿:磁盤空間 100% 是表損壞首因。
- 優雅關機:
mysqladmin shutdown,禁止 kill -9 / 硬斷電。
- 備份驗證:定期恢復演練,確保備份可用。
總結
- MyISAM 損壞:**停機用 myisamchk -r -q** 最快最穩;**不停機用 mysqlcheck -r**。
- InnoDB 損壞:**依賴自動恢復**,極端情況用
innodb_force_recovery 導數據。
- **禁用
-f 強制修復**,除非已接受數據丟失且無備份。
- **備份是唯一底線**。