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

MySQL 資料表損壞:原因分析、預防策略與 MyISAM/InnoDB 分級修復大全

     編輯:MySQL 資料庫相關知識

一、常見損壞原因

  1. 伺服器斷電/強制關機,未正常 SHUTDOWN。
  2. mysqld 寫入時被 kill -9 強制終止。
  3. 執行 myisamchk 時 mysqld 同時操作同表(未加 --skip-external-locking)。
  4. 磁碟壞軌、RAID 降級、檔案系統錯誤。
  5. MySQL 本身 Bug(升級穩定版可避免)。

二、典型症狀

  • Incorrect key file for table: '...'. Try to repair it
  • Table '...' is marked as crashed and should be repaired
  • Can't open file: '...MYI' (errno: 145)
  • 查詢回傳筆數少於預期、資料不全。

三、預防九條鐵律

  1. 定期 CHECK TABLE 或 mysqlcheck -c(無需停庫)。
  2. 大量刪除/更新後執行 OPTIMIZE TABLE 消除碎片。
  3. 關機前 systemctl stop mysqld,禁用 kill -9。
  4. 配置 UPS,避免斷電。
  5. 使用官方穩定版(GA),關注安全公告。
  6. InnoDB 啟用 innodb_checksum_algorithm=crc32、innodb_file_per_table=ON。
  7. 資料庫專用機,不跑業務服務,減少 OOM/當機風險。
  8. 磁碟 RAID 1/10,定期 smartctl 巡檢。
  9. 備份是最後防線:每日全備 + Binlog 增量,異地存放,定期演練恢復。

四、MyISAM 分級修復流程

階段 1:檢查


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

僅修復回報錯誤的表。

階段 2:簡單安全修復


# 設定緩衝加速(約可用記憶體 25%)
myisamchk --sort_buffer_size=256M --key_buffer_size=256M -r -q tbl_name

# 失敗則標準恢復
myisamchk -r tbl_name

# 再失敗則安全恢復
myisamchk --safe-recover tbl_name

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

  1. 移動 .MYD 到安全處。
  2. 用 .frm 重建空表:
    mysql> TRUNCATE TABLE tbl_name;
  3. 複製回舊 .MYD 覆蓋新資料檔。
  4. 執行 myisamchk -r -q 重建索引。
  5. 或直接 REPAIR TABLE tbl_name USE_FRM; 自動完成上述。

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

  1. 從備份恢復 .frm → 回階段 3。
  2. 或在別庫建同結構表,複製 .frm .MYI 覆蓋 → 回階段 2。

五、InnoDB 損壞修復策略

InnoDB 有崩潰恢復機制,較少需手工修復。嚴重時:

  1. innodb_force_recovery = 1..6 分級啟動(my.cnf):
    1 忽略損壞頁讀取、4 禁止合併插入緩衝、6 不重做日誌。
  2. 啟動後 SELECT * INTO OUTFILE 導出資料。
  3. 重建表:CREATE TABLE new LIKE old; INSERT INTO new SELECT * FROM old;
  4. 嚴重時僅能從備份恢復。
等級常數行為
1SRV_FORCE_IGNORE_CORRUPT允許讀取損壞頁,跳過壞索引記錄
2SRV_FORCE_NO_BACKGROUND阻止主執行緒(purge、merge)
3SRV_FORCE_NO_TRX_UNDO不執行事務回滾
4SRV_FORCE_NO_IBUF_MERGE禁止插入緩衝合併、不計算統計
5SRV_FORCE_NO_UNDO_LOG_SCAN視未完成事務為已提交
6SRV_FORCE_NO_LOG_REDO不執行日誌前滾

警告:innodb_force_recovery > 0 時禁止 INSERT/UPDATE/DELETE。

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