近期很多MySQL数据丢失情况,很多是人为误操作导致。MySQL数据库丢失可能由truncate截断表、delete删除表中数据行、delete删除表、delete删除库、操作系统rm删除数据库文件、硬盘坏道等情况导致。本案例是一个误截断表导致的丢失。
不管哪种情况,第一时间是停止所有操作,千万不要再往数据所在磁盘分区写入数据,包括文件复制、打包、解压、下载、安装软件等,都可能往磁盘写入大量数据,从而造成覆盖,导致数据物理上永久丢失。
停止一切可能产生数据覆盖的行为后,我们应该尽快执行专业的数据扫描和恢复方案。
第一时间运行DU_MySQL_Search_Linux扫描程序,可以提取到磁盘上所有的mysql碎片数据。将DU_MySQL_Search_Linux上传到非数据分区,注意不要放在丢数据的分区上,扫描出来的数据会产生二次覆盖,如果服务器上只有一个分区,此情况放联系我们工程师特别处理。上传工具后,执行命令如下(windows环境则是运行DU_MySQL_Search_Win):
Sudo nohup DU_MySQL_Search_Linux -s /dev/vda &
以上命令是以后台方式运行DU_MySQL_Search_Linux,扫描磁盘为/dev/vda,可根据自己实际情况调整。
扫描时会产生nohup.out文件,显示到search complated时,表示扫描完成。
如上图所示,已扫描出大量ibdfile数据碎片,以及frmfile表结构碎片,如果mysql曾经开启过binlog,还能扫描出被删除的binlog碎片,这些都可能是恢复出数据的关键,下载后发给恢复工程师即可恢复出数据。
在本案例中,我们只花费2小时,就恢复了所有的完整数据。
案例中使用的恢复工具及详细使用教程:
DU MySQL Search/Restore Win/Linux,mysql ibd frm binlog 全面支持碎片级搜索恢复工具-2021.02.25_du_mysql_search/restore win/linux 5.3-CSDN博客