记一次 `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
- 可能会出现的问题:
- 最终得到的结论
这种方法会生成一个RECOVERED_FILES
文件夹,最理想的情况就是数据全部恢复,但是很遗憾,没能通过这种方法完成数据恢复
- 参考文章
https://blog.csdn.net/liupin67/article/details/84401211
2,/proc/进程号/fd
这个的前提是在没进行服务重启,跟服务器重启
cd /proc/进程号/fd
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
- 可能会出现的问题
这个问题解决就是加上ROW_FORMAT=COMPACT
然后就是建表,删除之前的表空间,导入新的表空间
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
的建表语句全部获取到,然后导入,批量操作,这里就不多说了
因为对服务,服务器做了太多的操作,对于分区,挂载也没理解很深,前面两种方法都不适用于我自己的情况,用的第三种方法解决了问题
记一次mysql恢复数据探索过程,如有补充,欢迎沟通交流
本作品采用《CC 协议》,转载必须注明作者和本文链接