MySQL 数据恢复/数据修复(根据.frm和.ibd文件恢复表结构和数据)

博主近期遇到兄弟项目中的zabbix数据库因ibdata1损坏导致服务无法启动情况;经百度查询相关资料发现有两篇关于利用现存.frm文件和.ibd恢复数据的文章:文章1 文章2

 PS:本次是异机模拟测试ibdata1损坏后进行数据恢复(只从原数据库复制了原数据库的原始文件.frm和.idb,并未复制原ibdata1文件

数据恢复的主要原理(仅限innodb引擎下):重建表结构 利用原idb文件恢复表空间 具体操作如下:

一、配置mysql的innodb回滚参数

     在my.cnf–[mysqld]添加:innodb_force_recovery = 1

innodb_force_recovery参数说明:
1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作。

二、恢复表结构

    各位看观如果不知道现有数据库的相关表结构,建议大家按文章1的方法穷举法恢复/重建表结构(如果数据库表比较复杂,建议大家找研发索取建表脚本);  在创建表结构的时候,需要在sql语句后加上 ROW_FORMAT=COMPACT;将表结构改为静态表。

三、替换表空间(重点)

   在表结构建好后,去MySQL 的data目录下找到对应数据库,发现frm文件和ibd文件。Navicat中可以看到表,此时还不能看到数据。在未放弃原表空间时将ibd文件覆盖之后会发现数据表不能打开,会报[Err] 1146 – Table ‘users’ doesn’t exist等错误;

   1.放弃表空间:在创建表结构的时候,需要在sql语句后加上 ROW_FORMAT=COMPACT;将表结构改为静态表;

     参考:https://www.chriscalender.com/tag/innodb-error-tablespace-id-in-file/

    例:(如果表较多,建议用excel批量生成后一起操作)

ALTER TABLE 表名 DISCARD TABLESPACE;

   2.替换、导入表空间:将ibd文件(原)覆盖,重启MySQL服务,导入这个表空间;

   例:   

ALTER TABLE 表名 IMPORT TABLESPACE;

   此操作成功后可以在表中看到数据,至此数据恢复成功!

未经允许不得转载:运维大虾 » MySQL 数据恢复/数据修复(根据.frm和.ibd文件恢复表结构和数据)

赞 (3)

评论 1

CAPTCHAis initialing...

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 今日头条新闻文章不错支持一下吧回复