MySQL数据库ibdata1、ib_logfile文件被删后的数据恢复过程

以梦为马i 2023-9-5 190 9/5

真实经历,事情发生在2023年09月04日  周一 的早上。这一天我还是和往常一样9点起床,9点半出门去上班,出门前看到钉钉有一条来自领导的一条未读消息但没有在意,就没有点开查看因为距离上班时间还早而且一般也没什么事,就算有什么事也能等我到公司再做,然而等我走到楼下打开钉钉消息之后意想不到的事情映入眼帘。我的领导给我发了一条消息说:“

kangyong,你早点去,某某项目数据库启动不起来了,我搞了两下没搞好,上午我有事。

”,就这么一句话打破了我悠闲的的状态,瞬间清醒,直奔公司。这可是大事,正好又是周一,公司销售全部依赖系统进行客户回访,跟进,出单,系统数据库无法启动那公司的销售都无法使用系统获取到自己的客户数据,无法回访,跟进,出单。虽然事情很严重,但其实我并没有太在意,因为销售一般比我晚到公司,我内心觉得启动不了应该没什么大事,可能就是某项配置问题,排下错 最多三五分钟就搞定的事,影响不大。虽然是这么想,但身体却很着急的奔向公司,路上早餐也没买,到公司之后马上打开电脑->打开服务器终端->查看数据库启动失败原因,然而并不是我想的那样配置问题,经过再次查看错误日志发现导致无法启动mysql是因为无法找到mysql-bin.0000xx 的二进制日志文件,心里的压力瞬间释放,这么简单的问题,好办啊,于是我找到mysql-bin.index文件,打开这个文件把找不到的二进制日志文件名称(mysql-bin.0000xx)剔除,然后再次启动mysql ,果不其然,启动成功了,皆大欢喜。

 

MySQL启动成功后我进入系统后台,然而晴天霹雳的事情来了,系统打不开,报错提示xxx表不存在,这时候我瞬间感到大事不妙,赶紧向领导报备情况。报备过后再详细查看了一番服务器终端的操作日志,发现了重大问题,前一天晚上22:00-23:30 期间有多次对数据库目录下的ibdata1文件、ib_logfile1文件、mysql-bin.0000xxx文件 进行删除操作,删除后又执行重启数据库操作,又再次删除上述的文件、然后又再次的执行重启操作,多次操作之后数据库依然是无法启动状态。

这下我已然确定问题的严重性,再次报备情况,由于领导他没空,也没及时看到我给他发的消息,这让我有点惊慌,这堪比删库的事还是第一次遇到。虽然不是我导致的问题,但还是很认真的去想办法,去解决问题。接下就记录下 面对此次删库事件我是如何去把数据恢复如初的。

前提条件

  1. ibdata1 被删除
  2. 数据库目录下的.frm文件还存在(重要)
  3. 数据库目录下的.ibd文件还存在(重要)
  4. my.cnf配置中已设置innodb_file_per_table=1

 

恢复步骤

  1. 将原数据库目录copy到其它目录,备份,防止操作导致源文件损坏
  2. 创建数据库->创建同名表;表结构必须保持一致(重要);后续会详细说明
  3. 删除新建数据库的表空间
  4. 复制原数据库的.ibd文件到新数据库目录
  5. 导入表空间
  6. 数据恢复完成
  7. 查询恢复的数据,验证恢复情况
  8. 利用mysqldump导出
  9. 再次导入到数据库
  10. 完成

 

 

详细步骤

  1. 将原数据库目录copy到其它目录,备份,防止操作导致源文件损坏
cp /www/server/data/ /www/back/
  1. 创建数据库->创建同名表;表结构必须保持一致(重要);
    1. 创建数据库(用命令或可视化工具创建都可)
    2. 创建需要恢复数据的表结构(必须保持一致),如果有备份的直接导入即可,如没有继续下一步
    3. 通过mysqlfrm命令从.frm文件中解析出表结构
    4. 安装mysql-utilities、下载地址:https://downloads.mysql.com/archives/utilities/
#下载
wget https://cdn.mysql.com/archives/mysql-utilities/mysql-utilities-1.6.5.tar.gz
#解压
tar zxf ./mysql-utilities-1.6.5.tar.gz
#进入目录
cd mysql-utilities-1.6.5
#构建
python ./setup.py  build
#安装
python ./setup.py  install
#安装完成,验证安装情况
mysqlfrm --version
#安装成功输出
MySQL Utilities mysqlfrm version 1.6.5 
License type: GPLv2
#提取表结构并保存到文件
mysqlfrm -diagnostic /www/back/test/ > test.sql
#登录数据库、将提取出来大表结构导入到新建的数据库
mysql -u root -p
#选择数据库
use test;
#导入
source /www/back/test/test.sql
#表结构导入完成、数据表结构已恢复
  1. 删除新建数据库的表空间
alter table table_name tablespace;
  1. 复制原数据库的.ibd文件到新数据库目录
cp /www/back/test/table_name.ibd /www/server/data/test/

 

  1. 导入表空间
alter table table_name import tablespace;

 

  1. 数据恢复完成
  2. 查询恢复的数据,验证恢复情况
  3. select * from table_name

     

  4. 利用mysqldump导出数据库
  5. mysqldump -u root -p test> /www/back/test.sql

     

  6. 再次导入到数据库
  7. source /www/back/test.sql

     

  8. 完成
- THE END -

以梦为马i

9月17日00:22

最后修改:2023年9月17日
4

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论