1. 基本的修复方法
1) 修改 my.ini 添加参数:
innodb_force_recovery=1
2) 依次尝试修改为 1、2、3、4、5、6的时候,数据库是否能启动成功
3) 如果数据启动成功,导出数据库脚本
4) 把参数注释掉,COPY一个新的正常的数据库data文件过来,重新启动数据库,然后创建新的数据库并恢复脚本
2. 重建数据库表结构,导出表空间,覆盖ibd文件,然后重新导表空间
1) 前提条件:有备库,并且表结构与现有表结构一致,没有删除或者添加过字段
2) 替换备库,并启动数据库
3) 分别生成该导出的表空间和导入表空间的SQL脚本
-- 执行下面的语句,生成导出表空间的语句,复制出来并保存
SELECT
CONCAT('ALTER TABLE ',TABLE_NAME,' DISCARD TABLESPACE;') AS sql_discard
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='ldcrm' AND TABLE_TYPE='BASE TABLE' AND `ENGINE`='InnoDB';
-- 执行下面的语句,生成导入表空间的语句,复制出来并保存
SELECT
CONCAT('ALTER TABLE ',TABLE_NAME,' IMPORT TABLESPACE;') AS sql_import
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='ldcrm' AND TABLE_TYPE='BASE TABLE' AND `ENGINE`='InnoDB';
4) 在当前数据库执行下面的语句:忽略表之间的约束关系
SET FOREIGN_KEY_CHECKS=0;
5) 运行上面步骤3生成的导出表空间的脚本,分离数据库表和数据
6) 搜索损坏数据库文件中所有 .ibd 后缀的文件,复制出来覆盖到当前数据库
7) 运行上面生成的导入表空间的脚本,导入表空间
8) 在当前数据库执行下面的语句:取消忽略表之间的约束关系
SET FOREIGN_KEY_CHECKS=1;
9) 恢复成功。此时也可以导出数据库脚本,再重新恢复一下。