jokerW
作者jokerW·2023-07-19 17:39
数据安全工程师·哪儿都通

MYSQL数据库数据丢失恢复思路简述(无binlog)

字数 1110阅读 782评论 0赞 1

前言:本文仅提供恢复思路,不涉及恢复的具体算法细节。适用于使用innodb引擎的数据库实例,黑客勒索加密/删除数据库、误操作删除数据库以及误操作删除数据记录,同时未开启binlog日志的情况。

一、故障环境保护

1、当误操作使用delete或truncate命令删除表中的数据记录后,尽可能第一时间关闭数据库服务,丢失数据的表不要再有数据写入,避免造成丢失的记录数据被覆盖破坏,导致无法恢复。

2、当遇到黑客勒索或误操作,删除了表或者整个数据库(drop table或者drop database)时,这个时候表相关的.ibd表空间文件或全部数据库空间文件会被删除,数据释放到磁盘上,一定要注意,整个磁盘分区上面不要再有写入操作,不要再自行操作还原旧的备份。整个磁盘分区上,一旦有新的数据写入,将造成数据被彻底破坏无法恢复。

二、数据恢复思路

1、数据记录删除(delete、truncate)

使用delete或truncate语句删除表中的数据后,相关的.ibd表空间文件并没有释放,文件还存在,此时被删除的数据还存在于表空间文件中,只是此数据的一些信息被修改,从数据库中屏蔽了。

上图中为测试表中存在的一条数据,使用delete命令删除此条数据后,表空间中情况如下

由此可见,delete命令删除后的数据,实际还是存在在.ibd表空间文件中的,可以从表空间页中的删除记录入口,获取被删除屏蔽的数据记录的偏移地址,从而恢复被删除的数据记录。

2、表或数据库删除(drop table、drop database)

使用drop语句删除表或者数据库后,表相关的.ibd数据文件也会被全部删除。若数据库所在的系统环境为windows操作系统,可尝试使用windows数据恢复软件,恢复.ibd数据文件;当系统环境为linux操作系统时,一般数据文件都无法直接恢复,需要进行数据库碎片扫描,并导出其中的数据记录来恢复。

mysql数据库中默认数据页大小为16K,上图中即为一个mysql的数据库页,可根据页校验参数、infimum、supremum等相关标志性信息,扫描磁盘分区的闲置空间,得到所有丢失的数据库页数据,同时依据数据页中的表空间id参数,对扫描到的数据库页数据进行区分,结合相应的表结构,从数据页中抓取导出正确的数据记录,将数据整理成insert语句后,导入到新的数据库表中,完成mysql数据库数据的恢复。

扫描数据碎片

注意通过碎片扫描方式恢复mysql数据库,一定要有正确的表结构,如果没有表结构留存或表结构与实际扫描到的数据碎片中的结构有差异,都会导致数据无法恢复。

数据库被删除不要着急跑路,有需要私信或留言,我来助你力挽狂澜

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

相关文章

相关问题

相关资料

X社区推广