mysql 数据误删恢复

mysql 数据误删恢复

无咎 52 2024-05-24

mysql 数据误删恢复

背景:

线上用户数据被误删。由于是非功能性数据,所以不论是后台日志还是任务端日志均没有进行打印输出。但是由于数据并不是一两个,且时间过久客户并不记得具体备注信息,又需要这些信息便于区分。

恢复过程:

1、分析并查找可能输出的地方

非重点字段,故此后台日志均没有进行打印输出。此外,该数据删除逻辑属于某主动操作下的内置连带操作,故此也不可能从操作日志查看恢复。所幸我们还有最后的底牌——数据库日志。毕竟只要对存储的数据进行增删改查就必定绕不过数据库,且正好 mysql 中自带有数据的操作记录日志。

2、找出可能存在误删数据的日志文件

进数据库(要 root 权限)输入

SHOW VARIABLES LIKE 'log_bin';

这时候应该会欣喜的看到大大的“ON”

如果是 “OFF”,出门电梯应该能直上顶层 (`・ω・´)

然后输入以下命令查看文件位置(一般都是在 /var/lib/mysql 目录下的)

SHOW VARIABLES LIKE '%log_bin%';

进入所在目录之后输入 "ll",然后根据时间确定文件。但是请不要直接打开,因为这只是二进制文件,直接打开会乱码,无法正常获得需要的数据。

3、使用 mysqlbinlog 工具下载查看

借助 mysqlbinlog 将二进制文件导出成 sql 文件,便于下载查看。

mysqlbinlog --no-defaults --base64-output=decode-rows -v 要解析的文件(带路径) -r 要导出的文件(带路径)

一些常用参数:

-v:输出详细的日志信息。

--start-datetime 和 --stop-datetime:指定时间范围。

--start-position 和 --stop-position:指定位置。

-s 或 --short-form:只显示日志中包含的语句,不显示其他信息。

--no-defaults: 表示不读取任何选项文件,可以解决【mysqlbinlog: [ERROR] unknown variable 'default_character-set=utf8'】问题。

--no-defaults --base64-output=decode-rows -v :解决乱码问题

4、数据恢复

在下载的日志中找到误删的数据,然后将删除语句改为 insert 执行即可。

总结

线上数据库一定要先确认是否开启数据库日志记录!否则类似这种突发性的数据误删,是没办法通过定时备份数据库的手段来规避的。