昨晚帮一个好学的小师弟找bug,他在连接远程数据库时出现了连接错误,并且报错"HOST 'ip' not allow to connect to mysql service",接下来梳理一下排查的思路
1.本地网络
2.服务器网络
3.端口
4.账号域问题
5.防火墙
首先,排查一下是不是他机子的问题,我在本地用navicat.exe连接了一下,果然,连接失败
接下来就是排查一下是不是服务器挂了(其实没超时错误已经算是没挂的了0.0),我ping了一下服务器IP,发现通讯正常
这个时候能想到的就是端口是不是被防火墙搞了,于是乎想用telnet访问一下服务器3306端口,发现telnet被我关了!!!关了!!!
好吧,接下来就直接上服务器看一下,用netstat -ano
3306端口开了,防火墙也查看了,没问题,本地连一下,发现还是连不上
ps:阿里云官网控制台可以设置安全组的,那里也是可以屏蔽端口
那么接下来就得看看是不是帐号域的问题,我通过一个超管帐号进去之后,查看了一下
发现了帐号的域是localhost的(其实小师弟已经建了一个针对他IP的号,为了描述一下处理过程,我先假装没有),那么好办,接下来新建一个用来远程访问的帐号
假设我的IP是188.188.188.188
那么,
// 新建用户
CREATE USER hello@188.188.188.188 IDENTIFIED BY '123';
// 授权test数据库下的user表的SELECT权限
GRANT SELECT ON test.user TO 'hello'@'188.188.188.188' IDENTIFIED BY '123';
// 刷新一下
flush privileges;
然后再次远程连接,发现还是失败,奇怪了...于是我拿着这个帐号在服务器本地连接了一下,发现报错了,然后我测试连接那个localhost,发现也报错了(之前能连)
但是奇迹般地,远程能连接了,我估计远程不能连接就因为这个报错。至于这个错是什么原因现在还在排查,因为还没见过有人把数据库玩到报错的,所以能查到的资料甚少。等我找到原因再贴出来。而本文主要就是描述一下我在mysql远程连接失败时的解决思路。
ps:从安全方面考虑,以上图片均来自我的测试环境,不是从服务器那截下来的,有出入的地方见谅,在此欢迎大神赐教