磁盘故障引发的innodb页损坏无法原地修复,只能通过innodb_force_recovery强制读出可用数据后重建实例;若强制启动失败,则用inno_space跳过坏页导出,或依赖备份恢复。

innodb_force_recovery 强制读出可用数据,再重建实例;若连强制启动都失败,需用 inno_space 跳过坏页后导出,或依赖备份恢复。
如何从错误日志定位损坏页的归属表
错误日志里出现类似 [ERROR] [MY-011906] [InnoDB] Database page corruption on disk or a failed file read of page [page id: space=19, page number=4] 这种信息时,关键不是页号本身,而是 space=19 ——它对应 INNODB_SYS_TABLES.SPACE 值。
若 MySQL 实例还能启动(没彻底 crash),可立即执行:
USE information_schema; SELECT NAME, SPACE FROM INNODB_SYS_TABLES WHERE SPACE = 19;
查到表名后,再确认该页是否属于主键还是索引:
- 查
INNODB_BUFFER_PAGE(仅当页在 buffer pool 中)或结合INNODB_SYS_INDEXES判断INDEX_ID - 若
PAGE_TYPE是INDEX且非聚簇索引,重建该索引即可(ALTER TABLE t DROP INDEX idx_name, ADD INDEX idx_name(...)) - 若
PAGE_TYPE是IBUF_BITMAP或FSP_HDR,说明是文件头/插入缓冲结构损坏,风险更高,不建议跳过修复
innodb_force_recovery 从 1 到 6 怎么选才安全
innodb_force_recovery 不是越大越好。值为 4 及以上会跳过 undo log 和 redo 应用,可能把未提交事务当作已提交,导致逻辑数据错乱。
实操建议按顺序尝试,每步做完立刻导出数据:
- 先设为
1:只忽略单个 corrupt 页,能SELECT就停手,导出全库 - 若报错仍含
SRV_FORCE_NO_BACKGROUND相关提示,再试2 -
3会跳过事务回滚,适合有大量长事务未提交的场景,但导出前务必确认业务能接受部分事务状态丢失 - 避免直接设为
5或6:它们禁用重做日志和前滚,等于放弃崩溃恢复机制,极可能导出不一致快照
注意:innodb_force_recovery > 0 时,所有写操作(INSERT/UPDATE/DELETE)均被禁止,DROP TABLE 却允许——别误删表。
mysqld 启动失败时,用 inno_space 跳过坏页导出数据
当 innodb_force_recovery=6 仍无法启动,且错误日志明确指向某个 .ibd 文件(如 ./test/t_user.ibd),就该上 inno_space。
它不是“修文件”,而是解析 .ibd 结构、定位并跳过指定页,让 mysqld 能加载剩余有效页:
- 先根据日志中
space=97, page number=2定位文件:SELECT NAME, FILE_NAME FROM INFORMATION_SCHEMA.INNODB_SYS_DATAFILES WHERE SPACE = 97; - 用
./inno -f ./test/t_user.ibd -c list-page-type确认页类型分布 - 执行
./inno -f ./test/t_user.ibd -d 2删除损坏页(慎用,仅当确定该页无关键记录) - 或更稳妥地:用
./inno -f ./test/t_user.ibd -c show-records | head -50检查前几条记录是否完整,再决定是否导出
inno_space 不能修复 redo log 或 ibdata1 损坏,只对独立表空间(innodb_file_per_table=ON)有效。
为什么备份比任何修复手段都重要
所有修复方案都有前提:坏页没破坏元数据、buffer pool 还能映射、.ibd 文件物理结构尚存。磁盘故障常伴随扇区不可读、静默数据损坏,这些情况会让 innodb_force_recovery 和 inno_space 全部失效。
真正兜底的只有两件事:
- 最近一次
mysqldump --single-transaction --routines --events的全量逻辑备份 + 持续归档的 binlog - 物理备份(如 Percona XtraBackup)+ 对应的 LSN 截断点,确保能精确恢复到坏页发生前
修复过程本身会改写文件系统时间戳、触发内核缓存刷新,甚至让原本只是“标记损坏”的页彻底丢数据。所以只要备份存在,优先走备份恢复,别在坏盘上反复折腾。











