昨天发现网站不能访问,以为只是简单的报错,看看日志,解决一下就行了。就没当回事的打开日志,开始查看,看了一眼突然懵了,怎么回事,原本运行的好好的数据库找不到了,我半信半疑的想着我插入数据失败不至于把数据库干掉了吧。打开mysql,连上远程,刷新数据库,果然数据找不到了。
非常的郁闷,显示经历了插入失败,接着数据库不翼而飞!但又发现多了一个没见过库,打开该库里面只有一张表,表里面写着:
To recover your lost Database and avoid leaking it:
Send us 0.04 Bitcoin (BTC) to our Bitcoin address 1Msg3ribW4CpEUgCJwdLVhN4p3fuHWpXLy and contact us by Email([email protected]) with your Server IP or Domain name and a Proof of Payment. Your Database is downloaded and backed up on our servers.Backups that we have right now: java_stu. Any email without your server IP Address or Domain Name and a Proof of Payment together will be ignored.
If we dont receive your payment in the next 10 Days, we will make your database public or use them otherwise.
原来遭遇了可恶的比特币勒索病毒,这事竟然发生在了我的身上!原来这距离我们这么近,还以为它只是出现在报道上而已。数据库是没了,数据也没了,于是给服务器商打电话, 问该怎么解决,或者恢复一下库吧。然而客服的语气很同情你,但是我们也没办法,建议你做好备份,如果有开启binlog日志,可尝试数据恢复等等之类。显然他们不会给你找回库。也应该想想自己问题,用了多少年的数据库密码了,依然123456,自身安全意识薄弱,没有一点防护,应对突发问题补救措施,是造成这次问题的关键。于是网上查查,这个病毒是否攻破了,如何解密我的数据库,一无所获。只好另想他法了。
上面有提到开启binlog,可进行数据库恢复,感觉可以试试,有网上查了查,如何binlog恢复。确实找到了相关的文章。有的还挺详细。由于每个人的情况不一,但都是要恢复被删的库,我就写写,我是如何一点点的恢复的吧!
1.首先查看你的数据是否开启了binlog,登录mysql
>use mysql;
>show variables like 'log_%';
如果你没有开启,那你就没办法通过它恢复了,数据库还有个有ibdata1,至于使用这个怎么恢复,请大家自行百度啦。
你也可以去开启,以备下次:
修改mysql数据库的配置文件,windows是my.ini文件,打开该文件,在[mysqld] 区块设置/添加
log-bin=mysqlinit
确认是打开状态(值 mysqlinit 是日志的基本名或前缀名);设置完成之后需要重启mysql服务才能生效。
2、查看所有binlog日志列表
>show master logs;
然后就是看你要从哪个文件开始恢复了,当mysql重新启动,它就会重新生成一个binlog文件。所以你就要找要从哪里开始恢复了。恢复的时候还要注意你添加了主键外键问题,这在恢复的时候会出现报错,导致恢复暂停,我这里是整个库的恢复。
首先我重新创建了同样名字的数据库,然后再生成表,你只需要找回数据就行了,当然你也可以一个一个文件的都执行一遍,整个库也就回来了,也不用创建数据库,和表了。这期间你需要找到你你从那一点开始创建的库,从哪一点结束执行。
3.查看binlog文件的内容
>show binlog events in 'binlog.000012';
找到了数据库被删的那个地方,需要注意的有pos和end_log_pos,info表示执行的语句。可以根据执行的语句来查询或者是现有数据库最后执行的id等关键字来查找到对应的info,记录下相应的end_log_pos。为了保证恢复时没问题,我舍弃了两个insert,从4381689作为结束!再就是找到你从哪里开始恢复了,如果你想省事,不想创建表:那就找到开始的地方再记下一个end_log_pos。然后我们就开始恢复吧。
4、使用mysql的工具mysqlbinlog读取binlog日志
进入mysql安装目录下的bin文件夹,执行:mysqlbinlog 命令,如果执行失败,可以带上路径执行。 这里由于我创建好了数据库和表,所以只需要找回数据就行了,预估了一下我从文件9开始恢复:
>/usr/local/mysql/bin/mysqlbinlog --no-defaults /usr/local/mysql/data/binlog.000009 | /usr/local/mysql/bin/mysql -uroot -p123456 java_stu -v -f
当然,如果你的有开始start_log_pos话,你需要这样写:
>/usr/local/mysql/bin/mysqlbinlog --no-defaults /usr/local/mysql/data/binlog.000009 --start-position="3344" | /usr/local/mysql/bin/mysql -uroot -p123456 java_stu -v -f
直到执行到结束的end_log_pos:
>/usr/local/mysql/bin/mysqlbinlog --no-defaults /usr/local/mysql/data/binlog.000012 --stop-position="4381689" | /usr/local/mysql/bin/mysql -uroot -p123456 java_stu -v -f
执行完毕,你的数据也就完全恢复了。感觉这过程有小心,有惊险,有惊喜,觉得一步步就是希望,有恐自己遇见个决绝不了的错误,最后的希望之火也灭掉了。
最后补充知识:
1、常用binlog日志操作命令
(1).查看所有binlog日志列表
mysql> show master logs;
(2).查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值
mysql> show master status;
(3).刷新log日志,自此刻开始产生一个新编号的binlog日志文件
mysql> flush logs;
注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
(4).重置(清空)所有binlog日志
mysql> reset master;
转载:http://javasourceshare.cn/article/16