首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 數據表損壞修復實戰:myisamchk、mysqlcheck 兩大工具深度對比與操作指南

     編輯:MySQL 綜合教學

損壞癥狀識別

  • 查詢報錯: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 表損壞應對 (完全不同機制)

  1. 不需要手工修復工具:InnoDB 啟動時自動進行 **Crash Recovery** (Redo Log 前滾 + Undo Log 回滾)。
  2. 若自動恢復失敗 (極罕見):
    • 設置 innodb_force_recovery = 1..6 (從 1 開始嘗試) 啟動導出數據。
    • 導出數據後重建表/實例。
  3. 預防勝於治療:innodb_flush_log_at_trx_commit=1, sync_binlog=1, 定期物理備份 (xtrabackup)。

預防措施

  • 優先使用 InnoDB:事務保護、自動崩潰恢復、行級鎖。
  • 定期 CHECK TABLE / mysqlcheck -c:早發現早處理。
  • 避免磁盤寫滿:磁盤空間 100% 是表損壞首因。
  • 優雅關機:mysqladmin shutdown,禁止 kill -9 / 硬斷電。
  • 備份驗證:定期恢復演練,確保備份可用。

總結

  1. MyISAM 損壞:**停機用 myisamchk -r -q** 最快最穩;**不停機用 mysqlcheck -r**。
  2. InnoDB 損壞:**依賴自動恢復**,極端情況用 innodb_force_recovery 導數據。
  3. **禁用 -f 強制修復**,除非已接受數據丟失且無備份。
  4. **備份是唯一底線**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved