• 在去年,宝塔爆出数据库漏洞的时候,大海曾经发视频讲过数据库安全备份,当时我还转载了《关于宝塔被删库如何恢复操作(干货)》这篇文章,里面记述了一种如何恢复数据库的方法。

    但往往事情就是这样,你没有亲自去干,就没有发言权,前几天一个客户找到我,说自己的mysql数据库误删了,而且还是公司的数据库,非常着急,怕老板发现呀?,我猛然间想起这文章来,于是欣然接受了客户的付费任务,但当我真按照帖子操作的时候,发现该方法与其说是宝塔删库恢复倒不如说是mysql删库恢复,其中很多命令无法直接套用宝塔面板环境。

    linux和mysql的很多命令对于大海这种互联网爱好者来说,有点艰难了,虽然提前和客户说好没有十足把握,但本着拿人钱财替人消灾的朴实信仰,我又翻阅了B站上一些mysql恢复的相关教程,从蛛丝马迹中找到了些许灵感,终于一个通宵未睡换来了不辱使命。

    下面记录下整个过程,给自己留个备份,给相似经历者一些启发。

    1、开始本教程之前请先检查下你的回收站是不是开着,因为宝塔环境默认是开着的,或者数据库是否有近期备份文件,因为大海曾讲过多次该内容。

    假如回收站开着或者数据库有备份,那么恭喜你,你可以直接恢复了,下面的这些内容就不再需要了。

    你还在继续阅读本教程,那么假如你的数据库能够恢复,请在第一时间内开启数据回收站,并增加计划任务里的网站和数据库备份。

    2、在本教程的这种方法里,想要完成mysql的删库恢复,你的mysql必须开启了二进制日志,万幸的是宝塔面板下这一功能是默认开启的,想要确定你的mysql是否开启,最直接的办法,就是去/www/server/data目录下,看看有没有几个mysql-bin文件,像下图这样的:

    结尾数字未必是从1开始的,只要有,那就说明可以继续下一步,假如没有,那么尝试全盘搜索mysql-bin文件,假如哪都没有,那本教程将不适合你。

    操作之前,将mysql-bin文件全部备份下,以免失误带来不可逆的损失。

    服务器中假如有其他的数据库,也请提前备份下。

    3、在宝塔终端或者ssh中root权限下,使用命令:

    /www/server/mysql/bin/mysqlbinlog --start-datetime="2021-05-20 15:30:01" --stop-datetime="2021-08-24 12:30:50" /www/server/data/mysql-bin.0000* > redata.sql

    其中的/www/server/mysql/bin/mysqlbinlog是mysqlbinlog程序的位置,这样写的好处是不用增加配置系统环境变量,start和stop是划定时间段,注意结束时间不能是删除数据库之后的时间,也就是整个时间段必须在删除数据库之前,假如无法精确,那尽量提前到几天前,开始的时间要早于数据库建立的时间,假如记不清,那可以删掉开始时间,简写为

    /www/server/mysql/bin/mysqlbinlog --stop-datetime="2021-08-24 12:30:50" /www/server/data/mysql-bin.0000* > redata.sql

    注意mysql-bin.0000*的写法是包含了全部所有的数据库信息,执行起来比较费时,假如你可以根据mysql-bin文件的大小和修改时间,确定某个具体的mysql-bin文件,那也可以写具体文件名,例如mysql-bin.000001,一般对应的文件都比较大。

    运行上面的命令后进入root目录下查看是否出现了redata.sql文件,该文件大小应该远大于删掉的数据库大小,假如没有生成该文件或者该文件过小,那么尝试下面这条命令

    /www/server/mysql/bin/mysqlbinlog --base64-output=DECODE-ROWS -v -d 数据库名 /www/server/data/mysql-bin.0000* > redata.sql

    这条命令不再设置时间点,而是完全按照文件恢复,数据库名换成删掉的数据库名,假如不记得了,去网站文件config或者其他数据库配置文件查看,宝塔默认数据库和网站文件夹同名,点换成下横线。

    运行该命令后进入root目录下查看是否出现了redata.sql文件。

    4、假如有了redate.sql文件,在数据库中新建数据库,数据库名最好和删掉的数据库同名,然后执行下面的命令:

    mysql -uroot -p -f 新建数据库名 < redata.sql

    假如一切顺利,你的数据库会恢复到删除前的状态,有些情况下只能部分恢复。

    *本教程中只使用了二进制日志中比较简单的时间节点恢复,还有一种更加复杂精确的事件sid恢复,大家可以参考b站“特健全的都教授”的数据库相关视频“5.5.使用MySQL二进制日志”和“7.5.MySQL备份:使用二进制日志进行数据恢复”讲解的非常详细,无奈大海没有系统学过数据库,很多地方听不懂?

    对于数据恢复,大海并不专业,只是百度查查拼拼凑凑出来的办法,希望能帮到一些朋友,本文系大海原创,转载请尊重我的劳动,注明出处。

    发表回复

    后才能评论