MySQL无备份未开启二进制的日志,恢复数据库的数据
在数据库为备份的情况下,并且还没开启MySQL数据的二进制日志,那么恢复数据的难度就会大大增加,但经过我的实验,还是可以通过Java打印的日志恢复数据的(如果你的服务未开启Java里的SQL日志就不需要往下看了)。
恢复数据的环境为:
MySQL数据库+tomcat+Java后台+mybatis框架
具体方法是通过将Linux服务器上tomcat输出的日志筛选出来我们需要的,再将这些占位符SQL语句导入idea的mybatis日志插件中,转换成能直接运行的SQL语句
其中Linux筛选日志的命令为:
sed -n '/2019-12-13 09:20:01/,/2020-01-02 15:38:39/p' catalina.out >> bak.log
grep -A 5 'insert into' bak.log >> bak2.log
grep -A 5 'delete from' bak.log >> bak2.log
这几行命令的作用为:将catalina.out中的2019-12-13 09:20:01到2020-01-02 15:38:39日志导入到bak.log文件中,而后面的两条命令是将bak.log中的新增
和删除
的SQL语句这行和后5行追加输入到bak2.log文件中。
此时bak2.log中就基本上全部都是SQL语句了,这时就需要用到我们的idea中的mybatis日志插件(插件名称:MyBatis Log
),将这些全部复制到插件中,点击Resore Sql
按钮上成原始的可运行SQL。
此时我们就可以拿到一堆可以直接运行的SQL语句了,但是为了避免还有一些无用的查询SQL,我们可以把这些SQL语句复制到Notepad++或者Sublime等里面将这些不需要执行的SQL找出来,使用列编辑按照SQL的注释语法注释掉它们即可。
本文方法最大的问题是不方便将更新的SQL找出来,当然如果不怕麻烦,而且也有必要的话可以用
grep -A 5 'update 表名' bak.log >> bak2.log
命令将更新的SQL也导出来。以及本文到筛选日志给定了时间,因为我有2019-12-13的备份数据,因此我可以筛选到这一天。
当然,经过此役备份肯定是会做好的,也告诫大家备份一定要做好,我这次就是因为navicat的备份计划没有生效,导致我的备份缺失。备份要检查,这个习惯要养成啊。