主機死機重啟後,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
# 重建資料庫、從備份恢復
my.cnf[mysqld]
innodb_force_recovery = 6
innodb_purge_threads = 0
| 級別 | 常數 | 行為 | 風險 |
|---|---|---|---|
| 1 | SRV_FORCE_IGNORE_CORRUPT | 忽略損壞頁 | 低 |
| 2 | SRV_FORCE_NO_BACKGROUND | 阻止主執行緒(purge/merge) | 低 |
| 3 | SRV_FORCE_NO_TRX_UNDO | 不執行事務回滾 | 中 |
| 4 | SRV_FORCE_NO_IBUF_MERGE | 不合併插入緩衝 | 中 |
| 5 | SRV_FORCE_NO_UNDO_LOG_SCAN | 不看重做日誌,視未提交為已提交 | 高 |
| 6 | SRV_FORCE_NO_LOG_REDO | 不執行前滾(Redo) | 極高 |
systemctl start mysqld
# 僅支援 SELECT、CREATE、DROP,不支援 INSERT/UPDATE/DELETE
mysqldump -uroot -p --single-transaction db_name > dump.sql
# 移除 force_recovery 配置
systemctl stop mysqld
rm -rf /usr/local/var/mysql/*
systemctl start mysqld
mysql < dump.sql
innodb_flush_log_at_trx_commit=1 + sync_binlog=1mysqldump + xtrabackup 異地備份dmesg | grep -i error、smartctl -a 磁碟健康innodb_force_recovery 是最後防線,而非常規手段。平時備份做扎實,關鍵時刻才不慌。