mysql根据mysqlbinlog恢复找回被删除的数据库
年初和朋友一起做了个项目,到现在还没收到钱呢,今天中午时候突然听说之前的数据库被攻击了,业务数据库全部被删除。看有没有什么办法恢复,要是恢复不了,肯定也别想拿钱了吧?
README FOR RECOVERY DATA |
---|
All your databases was backed up. You need to email us at [email protected] to recover your data. If the payment is not received within 48 hours, all your data will be deleted and used for our purposes |
BITCOIN adress for pay bc1q8hsych64d5l79s8sztl3x7xj4u0rerltug9zcu 0,008 BTC |
Bitcoin can be purchased with Alipay from: CoinCola: https://www.coincola.com/?lang=zh-HK BitValve: https://www.bitvalve.com/buy-bitcoin/alipay |
Or another way: MoonPay: https://www.moonpay.com/buy Paybis: https://paybis.com/ Changelly: https://changelly.com/buy |
After paying write to us in the mail with your DB IP: [email protected] and you will receive a link to download your database dump. |
打开数据库后就看到只剩下mysql和README FOR RECOVERY DATA数据库,自己创建的数据库已被删除,顺着打开README数据库中仅有的一张表README FOR RECOVERY DATA
。大概意思就是您的数据库已被攻击者备份了 请48小时内用比特币支付。如果48小时内没有付款 数据将被删除。这不是赤裸裸的上演了互联网勒索嘛。
观察BinLog日志文件
进入mysql数据存放目录
-rw-r----- 1 polkitd input 56 Jan 5 2023 auto.cnf
-rw-r----- 1 polkitd input 2983124 Jan 5 2023 binlog.000001
-rw-r----- 1 polkitd input 157 Jan 5 2023 binlog.000002
-rw-r----- 1 polkitd input 157 Jan 5 2023 binlog.000003
-rw-r----- 1 polkitd input 2235 Jan 5 2023 binlog.000004
-rw-r----- 1 polkitd input 180 Jan 5 2023 binlog.000005
-rw-r----- 1 polkitd input 153788296 Jul 31 14:40 binlog.000006
-rw-r----- 1 polkitd input 96 Jan 5 2023 binlog.index
能看到binlog最新的一个文件binlog.000006
貌似还没有被删除。尝试用日志还原试一试
ps:这里如果binlog文件都被删除了的话 估计真不好恢复了。
基于mysqbinlog工具恢复数据
mysqlbinlog工具是把二进制的binlog转换为文本格式,通常情况下就会用到mysqlbinlog 日志管理工具。
在mysql安装目录下 bin目录中正常会有一个工具命令行叫mysqbinlog
如果是跑在docker中的mysql可能是没有这个命令的。需要从别的地方复制过来,复制数据库命令版本需要和当前恢复的数据库版本一致。比如我这里就是因为安装在docker中的数据库,没有mysqlbinlog工具。
先从官网下载数据库包 解压后 ,把bin中的mysqlbinlog复制到docker中进行执行。 如果有mysqlbinlog工具跳过此步。
Usage: ./mysqlbinlog [options] log-files
-d,-database-name:指定数据库名称,只列出指定的数据库相关操作。
-o,-offset=#:忽略掉日志中的前n行命令。
-r,--result-file=name:将输出的文本格式日志输出到指定文件。
-s,--short-form:显示简单格式,省略掉一些信息。
-set-charset=char-name:在输出为文本格式时,在文件第一行加上 set names char-name,这个选项在某些情况下装载数据时非常有用。
--start-datetime=name,--stop-datetime=name: 指定日期间隔内的所有日志。
--start-position=#, --stop-position=#:指定位置间隔内的所有日志。
常用就参数项就以上几个。
这里假定我们恢复到binlog.000006文件中的内容。
mysqlbinlog binlog.000006 > /root/binlogtxt.sql
执行完成之后 /root/binlogtxt.sql文件中上百兆的语句。我想大概率是妥了。
恢复到数据库中。
mysql -uroot -p
source /root/binlogtxt.sql
像我这里的场景是因为数据库被drop了。恢复的时候需要注意 只需要恢复到drop前一步就行。如果全部日志恢复后发现还是没有数据库,可能是恢复后又自动被日志中drop语句删除了。
怎么知道恢复到哪一步之前呢?
1、可以打开/root/binlogtxt.sql文件 看到drop database语句后就注释了。
2、./mysqlbinlog 导出文本的时候 设置时间段或者position位置。
打了navicat看了一下 果然恢复成功了 表结构和数据都恢复的很完美。
转载请注明出处。
作者:peachyy
出处:http://www.cnblogs.com/peachyy/
出处:https://peachyy.gitee.io/
出处:https://peachyy.github.io/
公众号: