项目场景:
最近经常碰到的一个头疼问题:网站开发完成,过了几天之后,数据库中数据表全部消失,只剩下两个表“RECOVER_YOUR_DATA”和“sys”
问题描述:
数据库为什么会自动消失?
既然消失了,为什么还会留下“RECOVER_YOUR_DATA”和“sys”?
是配置问题,还是其他问题?
若能解决,那么如何防范之后不再出现这种情况?
原因分析:
1.MySQL部署在服务器上时用的是docker容器镜像部署,会不会是数据卷挂载失败,导致数宿主机没有同步到容器内的数据?
Docker部署MySQL语句
docker run \
-p 3306:3306 \
--restart=always \
--name mysql \
--privileged=true \
-v /home/mysql/log:/var/log/mysql \
-v /home/mysql/data:/var/lib/mysql \
-v /home/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:8.0.33
部署完成后,输入docker inspect mysql,若能找到以下代码则表示宿主机目录已经与容器内目录数据挂载完成,如果和下面结果一样,则可以排除挂载失败这种情况。
此时使用DBeaver连接服务器上数据库可能会出现以下内容,即初始的数据库有sys(如果想看到mysql、information_schema、performance_schema等系统数据库,那么在设置里面设置“显示系统对象”即可),
也可能是
这就代表你的数据库已经被黑了。我们来看看这个表中都有什么信息:
首先里面包含一张表“RECOVER_YOUR_DATA”:内容大致为:
简明来说,你的数据即将在48小时之内公开并删除,如果想要恢复数据,那么就需要支付0.0102 BTC。当时我还没意识到这张表的存在,就继续管自己建表......当然这种情况也可能在你的数据库建之后出现,那么在一定时间内,你的数据库就会被真正删除!
解决方案:
既然已经找到了问题所在,那接下来只需要解决问题即可
这是我们的MySQL的配置文件,其中需要注意:“log-bin”=/home/mysql/data/mysql-bin,这是恢复数据的关键!
log-bin是 MySQL 中一种非常重要的日志文件,它以二进制格式记录了对数据库执行更改的所有事件,比如 INSERT
、UPDATE
、DELETE
等 SQL 语句。这些日志记录对于数据库的复制、恢复和审计等操作起着关键作用,通过上网查询资料我们可以log-bin就是用来“数据恢复”,“主从复制”的。 那么,我们再翻译一下这段话什么意思,“log-bin”=/home/mysql/data/mysql-bin:log-bin文件路径在“/home/mysql/data”Docker的虚拟目录下,并以mysql-bin开头,如下图:
利用它对数据恢复有个前提,就是需要有mysqlbinlog工具,但是Docker拉取MySQL8.0.33时并不会包含此工具,让我们来看看deepseek是怎么回答的。
我认为最麻烦的一步来了,这种情况下,该如何安装mysqlbinlog工具呢?这里提供一种方法(CentOS7)使用yum在宿主机上直接安装mysql-client,这时要确保yum的Python路径(CentOS 7默认Python 2.7),如果不是(为Python3),请自行修改
/usr/bin/yum文件的首行必须为#!/usr/bin/python,出现下图结果,算成功。
然后下载mysql-community-client,可以根据这篇文章进行安装:
安装mysql客户端(yum安装和rpm包安装)_安装mysql服务端时,客户端会作为依赖自动安装-CSDN博客
安装完成之后输入mysqlbinlog --version出现下图结果,那么就算下载成功:
首先我在服务器上创建了一个aaa数据库,里面创建“asd”表,此时模拟数据库被黑掉,手动删除aaa数据库
一看就知道这个是当前操作完后的日志。
先利用:mysqlbinlog /home/mysql/data/mysql-bin.000006 > /tmp/mysql-bin.000006.txt将此bin-log以txt形式展示,找到删除aaa库的具体位置,如下图
上面的红框是代表asd添加了一条数据,而下面的红框代表aaa数据库被删除,此时,我们只要"at2531"行之前的SQL获取即可,这样就能试着恢复数据库。
输入代码后,生成SQL脚本,运行该SQL脚本,即可恢复数据库以及数据。运行结果如下:
此时不仅数据库成功恢复,数据表内容也成功恢复!
温馨提示,如果想要避免被黑客攻击,有以下方法可供参考:
1.首先可以新增用户,密码采用强密码,禁止其他IP登录root,只允许本地,减少用户对数据表的访问与操作的权限。并一段时间修改一次密码。
2.开启防火墙,开放MySQL所在端口或者直接修改MySQL默认3306端口,修改为3307等,阿里云中的“安全组”可以实现端口开放。
3.定时监控数据库的操作(zabbix,本人还未使用过)
4.使用root用户,根据需求选择指定端口能连接数据库
最后,如果本篇文章有不足之处,请评论区留言,我们一起探讨问题,谢谢!