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 执行即可。
总结
线上数据库一定要先确认是否开启数据库日志记录!否则类似这种突发性的数据误删,是没办法通过定时备份数据库的手段来规避的。