InnoDB: Database page corruption on disk or a failed file read of page 30506index "PRIMARY" of table "maitem"."email_status" 主鍵索引頁損壞啟動參數,值 0-6,越大限制越多、容錯越強。大於 0 時進入只讀模式(不可 INSERT/UPDATE/DELETE)。
| 值 | 常量 | 行為 | 風險 |
|---|---|---|---|
| 1 | SRV_FORCE_IGNORE_CORRUPT | 忽略壞頁 | 低,可能讀到髒數據 |
| 2 | SRV_FORCE_NO_BACKGROUND | 阻止主線程 Purge | 中,阻塞清理 |
| 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 Log 前滾 | 最高,數據丟失風險 |
# my.cnf
[mysqld]
innodb_force_recovery = 1
# 重啟
service mysql restart
服務穩定運行,可 SELECT、CREATE、DROP。
-- 創建同結構 MyISAM 表(避開 InnoDB 損壞頁)
CREATE TABLE email_status_bak LIKE email_status;
ALTER TABLE email_status_bak ENGINE = MyISAM;
-- 導數據(只讀模式下可 SELECT)
INSERT INTO email_status_bak SELECT * FROM email_status;
-- 刪除損壞表
DROP TABLE email_status;
# 註釋掉 innodb_force_recovery,重啟
service mysql restart
-- 重命名回原表名
RENAME TABLE email_status_bak TO email_status;
-- 可選:改回 InnoDB
ALTER TABLE email_status ENGINE = InnoDB;
OPTIMIZE TABLE 無效ALTER TABLE ... ENGINE=MyISAM 在 force_recovery=1 下會報錯 ERROR 1025 (HY000): Error on rename,需繞過LIMIT,避免大事務# 1. 導出結構+數據
mysqldump --single-transaction db_name tbl_name > tbl_dump.sql
# 2. 刪除表
DROP TABLE tbl_name;
# 3. 移除 force_recovery,重啟
# 4. 導入
mysql db_name < tbl_dump.sql
smartctl -a /dev/sdX 檢查磁盤健康、RAID 卡電池、ECC 內存dmesg | grep -i error、意外斷電innodb_flush_method=O_DIRECT、innodb_flush_log_at_trx_commit=1 確保持久化ANALYZE TABLE 更新統計信息