美文网首页
MySQL数据库使用mysqlbinlog找回数据

MySQL数据库使用mysqlbinlog找回数据

作者: 十万个魏什么啊 | 来源:发表于2020-05-07 22:19 被阅读0次

这是一个值得被铭记的日子,2020年5月6日 21:55左右,应客户要求删除数据库中部分过期的订单,我直接使用了delete()方法,误以为条件写好,没有再次check,是事实删除条件没有写正确,导致执行删除方法后,一发而不可收拾,刚开始我还不警觉,一分钟后怎么这个方法还在执行,我强制中断,打开数据库订单表,OMG,订单一行都没有了!这是生产环境啊!顿时,我心中万丈波涛,心跳加速,呼吸紧促,一点多不为过。

怎么办,我第一个想遇事不要慌,千万不要慌!

第一时间为了停止了继续写入,我关闭了项目入口。然后通知客户,说现我这边在操作后台数据,用户有问题您先压一下,这个时候我还没告诉客户数据被误删了,我想利用一晚上时间找回来。

接着我联系服务器供应商,因为在3月份刚迁了本地主机的新服务器,之前使用的阿里云服务器有快照备份等等,三月份疫情期间迁移服务器后什么备份措施都没有!服务器那边告诉我他们没有办法!如果数据很重要就要把数据盘给我寄来去找专门数据恢复的公司做,我想事情应该还没有到这一步。

先说我们系统环境:LNMP(Linux + Nginx + MySQL + PHP)

然后,就这样我百度mysql数据误删找回、phpmyadmin数据误删找回,发现了mysqlbinlog这个东西,说可以通过mysqlbinlog找回数据,但是前提是mysql配置文件开启了二进制日志。

下面就是每一步的操作,当然我走了很多弯路。

第一步:找mysql的log二进制文件,如果有才可以往下一步。到mysql安装路径下,看到了这样一张图,有若干个mysql-bin.0000* 的文件,看到这里,我觉得应该有戏。(有的服务器可能是master-bin.0000* 的文件,跟mysql-bin.0000*一样,只是名字不同。)

二进制文件

也可以在mysql命令界面通过show master logs; 通过命令查看binlog日志列表

命令查看二进制文件

第二步:转存mysql-bin.0000*文件。因为mysql-bin.0000*为二进制文件,不可读,只能转成 .txt 或者 .sql。执行:/usr/local/mysql/bin/mysqlbinlog --no-defaults /usr/local/mysql/var/mysql-bin.000017 -d yourdbName > test.sql

/usr/local/mysql/bin/mysqlbinlog:是我们mysqlbinlog所在的位置,否则会报错mysqlbinlog方法不存在

--no-defaults:(非必填)是为了避免一个字符的报错

 /usr/local/mysql/var/mysql-bin.000017:是我们二进制文件的位置

-d yourdbName:(非必填)yourdbName为需要转存/恢复的数据库,如果多库需要恢复则可以不写-d yourdbName

此时我们已经把日志文件转存为名叫test.sql到根目录,如下图:

.sql 文件

第三步:本地打开 .sql 日志文件,查找需要恢复的位置。可以看到我们误删时的删除记录,可以从 at 216492370(具体位置结合业务特征)回到到第一次删除前的状态。

转存为.sql的日志

第四步:转存日志文件中需要恢复的部分为 .sql 文件。执行:/usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/var/mysql-bin.000017 --skip-gtids --stop-position=216492370 -d yourdbName > new.sql

现在得到了 new.sql 文件,就可以使用得到的 new.sql 文件还原数据库了。(如果不是还原到本库,记得打开new.sql文件30行左右修改库名为接受恢复的库名)

第五步:恢复数据。恢复数据的表一定要存在,且表结构要完整。

mysql> use test; //test是接受恢复的库,里面需要恢复表的结构

mysql> source new.sql

数据恢复中

然后执行恢复中,我一共恢复3w条数据,从执行恢复到恢复结束共耗时8小时。最后才知道我相当于是做了全库恢复,不然用不到这么久。最后成功,无重复无遗漏,心里的石头落地。

写在后面,这是距离误删数据24小时后写的了,数据恢复也在几小时前才完成。中间的经历真的只有经历后才会知道。可能每一步都会碰到问题,但是碰到问题多百度,有条件可以请教他人。我当天晚上搜了很多方法,最后都没有成功,实在没辙,在第二天早上咨询了一个大牛,才发现了问题,我是在第四步搞错了,我恢复第一次删除点到最后一次删除点的数据,这样导致把我删除数据的行为又执行了一遍,所以每次都恢复不到数据。如果是部分恢复,从某个具体位置(结合业务特征),回到到第一次删除前。当然binlog方法有更多的值得我去学习,转存日志文件中需要恢复的部分这个地方我还有点迷糊,后面一定要去专门研究一下~

相关文章

网友评论

      本文标题:MySQL数据库使用mysqlbinlog找回数据

      本文链接:https://www.haomeiwen.com/subject/ebqzghtx.html