首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 表損壞修復實戰:從簡單修復到極度困難四階段、InnoDB 強制恢復全流程

     編輯:MySQL 資料庫相關知識

表損壞癥狀:查詢中斷、Incorrect key file、Table marked as crashed、Can't open .MYI (errno 145)。修復遵循「由簡入繁、由快到慢、備份優先」原則。

MyISAM 四階段修復

階段 1:簡單安全修復

myisamchk -r -q tbl_name   # 快速恢復 (僅重建索引)
# 失敗則
myisamchk -r tbl_name      # 恢復模式 (刪除錯誤行、重建索引)
# 仍失敗則
myisamchk --safe-recover tbl_name  # 安全恢復 (舊演算法、較慢)

修復前務必 cp tbl_name.* /backup/。

階段 2:困難修復 (索引檔前 16K 損壞/遺失)

  1. mv tbl_name.MYD /safe/
  2. 用 .frm 重建空表:
    mysql db_name
    SET AUTOCOMMIT=1;
    TRUNCATE TABLE tbl_name;  -- 或 DELETE FROM tbl_name
    quit
  3. cp /safe/tbl_name.MYD /var/lib/mysql/db_name/
  4. 回階段 1 執行 myisamchk -r -q

一鍵等效:REPAIR TABLE tbl_name USE_FRM;

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

  1. 從備份還原 .frm → 階段 2
  2. 或從備份還原 .MYI → 階段 1
  3. 無備份但記得 CREATE TABLE:另建同結構表,複製 .frm/.MYI → 階段 1/2

InnoDB 損壞應對

1. 嘗試導出完好資料

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

2. 無法啟動時:innodb_force_recovery 強制啟動導出

編輯 my.cnf:

[mysqld]
innodb_force_recovery = 4  # 1~6 遞增激進
值常數行為風險
1SRV_FORCE_IGNORE_CORRUPT忽略損壞頁,SELECT 跳過低
2SRV_FORCE_NO_BACKGROUND阻止主執行緒 (清除操作)低
3SRV_FORCE_NO_TRX_UNDO不執行事務回滾中
4SRV_FORCE_NO_IBUF_MERGE阻止插入緩衝合併、不計算統計中高
5SRV_FORCE_NO_UNDO_LOG_SCAN視未完成事務為已提交高
6SRV_FORCE_NO_LOG_REDO不做 Redo Log 前滾極高
  • 值越大包含越多保護,≥4 通常能導出多數資料。
  • 設定 >0 時 InnoDB 禁止 INSERT/UPDATE/DELETE。
  • 可 DROP/CREATE TABLE 移除壞表停止失控回滾。

3. 導出後重建

  1. 停止服務,移除 innodb_force_recovery。
  2. 重啟正常服務。
  3. DROP TABLE tbl_name; CREATE TABLE ...; LOAD DATA INFILE ... 重建。

修復演練建議:季度在測試環境模擬各階段損壞並完整走完流程,驗證 RTO、資料完整性、應用相容性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved