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

MySQL InnoDB 啟動失敗無法重啟:Checksum Mismatch 災難恢復實戰手冊

     編輯:MySQL 資料庫相關知識

主機死機重啟後,MySQL 無法啟動,錯誤日誌顯示 InnoDB: checksum mismatch,單表空間檔案損壞。本文提供兩套方案:資料不重要 → 重建、資料關鍵 → innodb_force_recovery 救援。

一、錯誤日誌關鍵片段

2016-04-23 22:08:38 3604 [ERROR] InnoDB: checksum mismatch in tablespace ./test_user/user_recommend_code#P#pmax.ibd
...
InnoDB: Error: could not open single-table tablespace file ./test_user/user_recommend_code#P#pmax.ibd
InnoDB: We do not continue the crash recovery...
InnoDB: To fix the problem and start mysqld:
 1) If permission problem, modify permissions.
 2) If table not needed or restorable from backup, remove .ibd file.
 3) If disk broken, set innodb_force_recovery > 0 in my.cnf.

二、方案一:資料可重建/有備份(最快恢復)

cd /usr/local/var/mysql/
rm -f ib_logfile* ibdata*
rm -rf test_user/   # 受損資料庫目錄
systemctl start mysqld
# 重建資料庫、從備份恢復

三、方案二:資料極其重要且無備份(innodb_force_recovery 救援)

1. 編輯 my.cnf

[mysqld]
innodb_force_recovery = 6
innodb_purge_threads = 0

2. 級別詳解(數字越大包含前級所有限制)

級別常數行為風險
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不執行前滾(Redo)極高

3. 啟動並導出資料

systemctl start mysqld
# 僅支援 SELECT、CREATE、DROP,不支援 INSERT/UPDATE/DELETE
mysqldump -uroot -p --single-transaction db_name > dump.sql

4. 重建環境

# 移除 force_recovery 配置
systemctl stop mysqld
rm -rf /usr/local/var/mysql/*
systemctl start mysqld
mysql < dump.sql

四、預防清單

  • RAID 1/10 + BBU/BBU 雙重保護
  • innodb_flush_log_at_trx_commit=1 + sync_binlog=1
  • 定期 mysqldump + xtrabackup 異地備份
  • 監控 dmesg | grep -i error、smartctl -a 磁碟健康
  • 測試恢復演練,確保備份可用
innodb_force_recovery 是最後防線,而非常規手段。平時備份做扎實,關鍵時刻才不慌。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved