萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 表損壞修復完整手冊:REPAIR TABLE、myisamchk 與 InnoDB 強制恢復

錯誤現象

Table 'content_tags' is marked as crashed and should be repaired

典型原因:非正常關機(斷電、殺進程)、磁碟壞軌、記憶體錯誤、MySQL Bug。

MyISAM 表修復四階段

階段 1:檢查

# 快速檢查
myisamchk *.MYI
# 深度檢查
myisamchk -e *.MYI
# 靜默模式
myisamchk -s *.MYI

若 mysqld 運行中,加 --update-state 標記已檢查。
僅修復報錯的表;若出現 out of memory 或 myisamchk 崩潰 → 進階段 3。

階段 2:簡單安全修復

# 快速修復(僅重建索引)
myisamchk -r -q tbl_name

# 完整修復(重建索引+清理資料)
myisamchk -r tbl_name

# 安全修復(舊版演算法,較慢但穩健)
myisamchk --safe-recover tbl_name

執行前備份 .MYD、.MYI。調大 sort_buffer_size、key_buffer_size 至可用記憶體 25% 加速。

階段 3:困難修復(索引檔頭壞損/遺失)

  1. 移動 .MYD 至安全處。
  2. 用 .frm 重建空表:
    mysql> SET AUTOCOMMIT=1; TRUNCATE TABLE tbl_name; QUIT;
  3. 將舊 .MYD 複製回新建表目錄(保留副本)。
  4. 回階段 2 執行 myisamchk -r -q。

或直接用 SQL:REPAIR TABLE tbl_name USE_FRM; 自動完成上述流程。

階段 4:極度困難(.frm 也壞損)

  1. 從備份還原 .frm → 回階段 3。
  2. 或在別庫建立相同結構表,複製 .frm、.MYI 覆蓋,保留原 .MYD → 回階段 2。

InnoDB 損壞恢復策略

1. 導出法(輕微損壞)

SELECT * FROM tbl_name INTO OUTFILE '/tmp/tbl_dump.txt';

大部分資料可導出,再重建表匯入。

2. 強制恢復模式 (innodb_force_recovery)

在 my.cnf [mysqld] 加入:

innodb_force_recovery = 4

等級 1-6 遞增嚴格:

值常數行為
1SRV_FORCE_IGNORE_CORRUPT忽略損壞頁,讓 SELECT 跳過壞記錄
2SRV_FORCE_NO_BACKGROUND阻止主執行緒(防止 purge 崩潰)
3SRV_FORCE_NO_TRX_UNDO不執行事務回滾
4SRV_FORCE_NO_IBUF_MERGE禁用插入緩衝合併,不計算統計
5SRV_FORCE_NO_UNDO_LOG_SCAN視未完成事務為已提交
6SRV_FORCE_NO_LOG_REDO不做 Redo Log 前滾

注意:innodb_force_recovery > 0 時禁止 INSERT/UPDATE/DELETE。
導出資料後移除參數重啟,或 DROP 壞表停止失控回滾。

預防措施

  • 使用 UPS 防止斷電,配置 sync_binlog=1、innodb_flush_log_at_trx_commit=1。
  • 定期 CHECK TABLE、ANALYZE TABLE。
  • 監控磁碟健康度(SMART)、記憶體 ECC 錯誤。
  • 升級至新版 MySQL/MariaDB/Percona 修已知 Bug。
copyright © 萬盛學電腦網 all rights reserved