docker部署mysql使用binlog恢复数据
昨天早上打开网站发现数据全没了,一连数据库发现库没了,留下一个有一个勒索比特币的表,说48h内不把比特币打到他账户上就把数据拿去黑市卖啥的。当然我不怕他去卖,因为也没有任何敏感数据都是我的学习播客罢了,但这些是几万字的我创造的东西啊,一开始真的很绝望,绝望了一天,晚上解决了,记录下过程
一.binlog恢复过程
部署的时候一定要映射数据卷
- 过程挺曲折的,最万幸的就是我用docker-compose编排的时候设定好了映射数据卷
- 这其中
/var/lib/mysql
中的内容和数据恢复关系巨大,一定要映射这个文件
被攻击后还好这个数据卷还在,但是看不到我的数据库的文件夹了,因为是映射的数据卷,如果被映射的容器中将这个库删掉了,数据卷中的数据库也会消失
- 但是万幸的是下方的
binlog
中有二进制存储的对数据库的各种操作,只要查看一下并确定一下需要执行的起始位置,就可以将之前的命令都再次执行一次,等于就恢复了
二.使用binlog恢复
1. 首先进入mysql容器内
docker ps #查看mysql容器的id
docker exec -it 容器id /bin/bash
mysql -uroot -p #登录
- 之后可以用这个命令查看各个binlog命令中都记录了什么操作
2. 查看binlog内的信息
show binlog events in 'binlog.000003'; #我发现我binlog.00003有10M这么大,应该记录了被删库的过程在里面
- 找到被删库的地方,往上找一个正常的操作,一般是以
BEGIN到 COMMIT结尾
,记住commit对应的结束位置的数字
3. 恢复
- 之后要退出mysql命令窗,因为接下来要使用的
mysqlbinlog
是mysql内置的使用binlog恢复的工具,不是在mysql中进行,直接在这个容器中操作就行(一开始我傻傻的都在mysql命令中执行)
- 全部执行的命令(就是将这整个binlog都执行)
# 命令格式: mysqlbinlog --no-defaults(如果不加这个他会说一些编码的问题) 之后是binlog所在的路径,这里是将/var/lib/mysql做了映射数据卷嘛,所以binlog也会在这里,总之就是binlog所在的路径 后面照填就行
mysqlbinlog --no-defaults /var/lib/mysql/binlog.000001 | mysql -uroot -p
- 只执行一段区间,如果要从头执行到一个地方结束,不写start只写stop即可
mysqlbinlog --no-defaults --start-position='起始位置' --stop-position='结束位置' /var/lib/mysql/binlog.000001 | mysql -uroot -p
注意点:我这个数据库其实不是在binlog.000003中建立的,所以我是将binlog.000001和2都完整执行了一遍,3才能执行,3中需要指定执行的结束地方
三.一些坑
- 一开始以为我的数据卷没了之类大,我就去
docker volume ls
,默认地址是/var/lib/docker/volumes/
查看所有数据卷,之后发现里面一个mysql的都没有,我以为我数据卷没了,但其实这个数据卷没被删除,只是因为数据库那边的改变,有一定程度的被覆盖了,数据卷其实还在我一开始编排的时候映射的地方 - 执行mysqlbinlog命令不是在mysql中执行,而是在这个容器下执行即可
- 备份!备份!备份!
- 学些安全,溯源一下,能把这黑客干翻最好
- 就这么简单的网站都攻击,但我也有没做好的地方,mysql密码也太简单了哈哈哈哈哈哈