记一次 `ibdata1` 误删后的恢复过程

经过很长时间的网上找资料最终解决,记录一下
说明一下情况
a,数据库没有备份
b,服务器没有快照
c,删除后,多次重启mysql,跟服务器reboot
d,通过rm -rf删除了ibdata1,ib_logfile0,ib_logfile1.frm,.ibd这些文件都存在

下面说一下探索解决办法的过程

1,利用extundelete进行文件修复

df -h 查看分区
ls -lia / 查看node
extundelete –inode node /dev/vda1
extundelete /dev/vda1 –restore-all
extundelete /dev/vda1 –restore-directory /tmp
extundelete /dev/vda1 –restore-files /usr/local/mysql/var/ibdata1
extundelete –restore-inode node /dev/vda1

  • 可能会出现的问题:

记一次`ibdata1`误删后的恢复过程

  • 最终得到的结论

记一次`ibdata1`误删后的恢复过程

这种方法会生成一个RECOVERED_FILES文件夹,最理想的情况就是数据全部恢复,但是很遗憾,没能通过这种方法完成数据恢复

记一次`ibdata1`误删后的恢复过程

  • 参考文章
    https://blog.csdn.net/liupin67/article/details/84401211

2,/proc/进程号/fd

这个的前提是在没进行服务重启,跟服务器重启

cd /proc/进程号/fd

记一次`ibdata1`误删后的恢复过程

3,通过.frm,.ibd恢复数据

首先下载mysql工具,需要通过.frm找到建表语句

yum install mysql-utilities.noarch

这个工具的下载有很多种方法,自行网上搜索mysql-utilities

mysqlfrm –server=root:pwd@localhost databasename:tablename.frm –port=3307 –user=mysql

本地新建同名数据库,然后重新运行上面从.frm得到的sql

  • 可能会出现的问题

记一次`ibdata1`误删后的恢复过程

记一次`ibdata1`误删后的恢复过程
这个问题解决就是加上ROW_FORMAT=COMPACT

记一次`ibdata1`误删后的恢复过程
然后就是建表,删除之前的表空间,导入新的表空间

CREATE TABLE `test`.`coupon` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `shop_id` int(11) NOT NULL COMMENT '门店id',
  `type` tinyint(4) DEFAULT NULL COMMENT '优惠券类型:1,折扣券; 2,满减;',
  `minimum_payment` float DEFAULT NULL COMMENT '最低使用金额(即订单满多少钱可使用该优惠券)',
  `amount` float DEFAULT NULL COMMENT '抵用金额或折扣的值 (即表示折扣值或满减值)',
  `time_show` int(11) DEFAULT NULL COMMENT '优惠券发放开始时间',
  `time_hide` int(11) DEFAULT NULL COMMENT '优惠券发放结束时间',
  `time_start` int(11) DEFAULT NULL COMMENT '优惠券使用开始时间',
  `time_end` int(11) DEFAULT NULL COMMENT '优惠券使用截至时间',
  `status` int(11) DEFAULT NULL COMMENT '状态:0,未发布 1,发布  2,删除',
  `time_create` int(11) DEFAULT NULL COMMENT '数据创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='优惠券' ROW_FORMAT=COMPACT

ALTER TABLE `test`.`coupon` DISCARD TABLESPACE;
ALTER TABLE `test`.`coupon` IMPORT TABLESPACE;

最终贴一下解决后的效果

没有全部去恢复,就拿了几个表做实验,全部恢复的话,需要写脚本去吧每个.frm的建表语句全部获取到,然后导入,批量操作,这里就不多说了

记一次`ibdata1`误删后的恢复过程

记一次`ibdata1`误删后的恢复过程

因为对服务,服务器做了太多的操作,对于分区,挂载也没理解很深,前面两种方法都不适用于我自己的情况,用的第三种方法解决了问题


记一次mysql恢复数据探索过程,如有补充,欢迎沟通交流

本作品采用《CC 协议》,转载必须注明作者和本文链接
希望你是真正的喜欢code
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!