mysql恢复误删除的历史数据

场景:用docker部署了mysql,没有做额外的处理,只部署了一个,不小心误删除了大量数据

我用的是mysql8.0的docker镜像生成的容器,默认配置中mysql的主要数据都在/var/lib/mysql中,可挂载也可不挂载出去,如果mysql无法启动了,也可以通过docker cp的方式将无法启动的容器中的文件拷贝出来,将它放入新的mysql容器中。

最开始我把注意力放在.ibd文件中,但各种操作很麻烦,而它适合恢复整体数据,而不是历史数据,读取这个文件内容也很麻烦。然后我便想到SQL操作日志。

/var/lib/mysql文件夹下可以看到binlog.000001这样的文件,这样的文件是编码过的,我们无法直接查看,为了方便查看,使用mysqlbinlog --base64-output=DECODE-ROWS -v binlog.000001 > fay-test.sql命令来将其转出到新的sql文件中,因为binlog本身记录就是sql语句的日志。这里只是个例子,随着数据的增加会有binlong.000002、binlog.000003、…。

下面是我自己生成的sql文件中的一部分:

/*!*/;
# at 50906
#200625 11:48:39 server id 1  end_log_pos 51019 CRC32 0x34457801 	Table_map: `huashi`.`wx_user` mapped to number 139
# at 51019
#200625 11:48:39 server id 1  end_log_pos 51133 CRC32 0x7308e85d 	Delete_rows: table id 139 flags: STMT_END_F
### DELETE FROM `huashi`.`wx_user`
### WHERE
###   @1=9
###   @2='123'
###   @3='123123'
###   @4=123123
###   @5='123123'
###   @6='123123'
###   @7='123123'
###   @8='123123'
###   @9='1231231'
###   @10=NULL
###   @11=NULL
###   @12=NULL
###   @13=NULL
###   @14=NULL
###   @15=NULL
###   @16=NULL

虽然不是我们平时经常写的sql语句,但我们分析下后依然可以很清晰的看出其中的意思,我们不难看出每个字段的值,@1代表第一个字段。我们得到了这些历史SQL操作数据后,便可以进行数据恢复了。

你可能感兴趣的:(MySQL)