1、最近在写一个小项目,MySQL 数据库使用 Docker 安装部署在租的服务器上,然后使用 Navicat 连接数据库时,发现:

ERROR 1045 (28000): Access denied for user ‘root‘@‘x.x.x.x‘ (using password: YES/NO)

之前一直是能连上的,并且最近开发一直在使用,开发过程中编写过 sql 执行都是没问题的。

2、百度发现这个错误是因为 root 账户没有远程访问权限(参考),即跨 ip 访问权限,但是之前安装部署时是打开了这个设置的(安装过程),支持远程访问的,而且最近使用也没有什么问题。

3、但是抱着试一试的心态,还是重新执行了授权的命令

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option; 	#这里第一个root是用户名,第二个是密码,% 代表对所有 IP 开放权限,也可以设置单独的 IP
flush privileges;

执行完之后,发现确实可以登陆了。

4、登录之后,发现 mysql 数据库中的 user 表里面多了条 root,访问权限 Host 为localhost (也可能是之前就有的),另一条 root,访问权限 Host 为 %,这样就所有的 IP 都可以访问了。

5、然后启动微服务。数据库能够连接成功了,但是有出现了找不到数据,查看数据库发现上面的表都被人删掉了,而且多了一张 README 表,打开表发现里面内容如下:

以下数据库已被删除:xxx。 我们有一个完整的备份。 要恢复它,您必须将0.006比特币(BTC)支付给我们的比特币地址xxxxxx。 有关说明,请通过xxx@xxx.com通过电子邮件联系我们。 任何与付款无关的邮件都将被忽略!
原来是被黑客攻击了,提示要付款才能找回被删除的数据。

6、在仔细查看用户

mysql>select host,user,authentication_string from mysql.user;

发现多了一个mysqld不限ip的用户,将它删除。
删除用户:

mysql>drop user mysqld@'%';

查看授权:

mysql>show grants;

对固定ip授权:

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'x.x.x.x' IDENTIFIED BY 'xxx';

不使用%对所有ip授权,仅对固定ip授权,减少可能的恶意访问。
刷新授权:

mysql>flush privileges;

7、默认 root 账户的密码是 root,比较简单为了提高安全性,防止再次被黑客破解,需要修改密码。
然后尝试去 user 表找密码的字段进行更新,按照传统改密码方式发现没有 password这个字段。

mysql> update user set password=password('123') where user='root';
ERROR 1054 (42S22): Unknown column ‘password’ in ‘field list’
网上查了一下据说5.7 版本password 字段改成 authentication_string password 函数还是原来的password函数。可以看到密码是加密的,所以说,如果设置过密码但是忘记了,那不好意思了,是不能进行查看密码的,只能查看用户名,因为mysql密码是动态md5加密,是不可逆向查询的。
mysql> update user set authentication_string=password('123') where user='root';

8、开启 binlog 方便恢复数据
在开启binlog遇到个问题记录下:
1)配置my.cnf

在这里插入图片描述
2)将mysqld中config: /etc/my.cnf 放开
在这里插入图片描述
参考:

Logo

更多推荐