原文发表在我的个人博客:MYSQL设置远程登录
这个问题还真搞了一段时间,因为出问题的地方有很多,这个就比较麻烦,多方查找终于解决了问题。
1. 端口被防火墙禁用问题
远程连接首先需要端口是没有被禁用的,可以使用,之前没注意,发现连接不上时,用telnet来测试mysql服务器上的3306端口,发现无法连接,这时可以确认3306端口被防火墙禁用,因为本地3306是可用的嘛。
服务器在centos上,所以调查怎么使centos防火墙开放端口,用iptables。
iptables是什么就不介绍了,这有一篇中文的命令简介: Iptables
因为3306端口被禁用,所以需要开放3306端口,用下面的命令语句,有不了解的可以查询iptables命令,或者看上面的链接。
iptables -A INPUT -p tcp –dport 3306 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 3306 -j ACCEPT
如果有之前关于3306端口的规则,删除原来的规则,删除方法如下:
iptables -L -n –line-numbers #显示规则,并显示序号
iptables -D INPUT 8 #删除序号为8的规则
iptables -D OUTPUT 8
这样就解决了端口无法使用的问题,再用telnet ip 3306发现可以连通了,但是连接mysql发现还是连接不上。
发现还是有问题,因为没有给用户设置可以远程连接的权限。
2. mysql用户赋予远程登录的权限
这个就是sql语句还赋予用户权限的问题了,语句如下:
GRANT ALL PRIVILEGES ON database.table TO ‘username’@’ip’ IDENTIFIED BY ‘password’;
database是数据库名,如果全部用’*’
table是具体的表明,如果是全部的表用’*’
username是要赋予权限的用户名
ip是赋予可以用这个用户进行远程访问的ip地址,可以是具体的ip,如果所有ip都可以访问用’%’
password是用户密码
调整用户权限后需要刷新权限使上面的设置生效:
FLUSH PRIVILEGES;
这句话执行了之后就赋予了用户可以远程登录并且查看相关数据库以及表的权限了。
3. mysql设置超时时间
在经历上面的设置之后发现连接还是有问题,大概率无法连接,经调查时超时的原因,需要设置mysql数据库的连接超时时间。
执行下面的语句可以显示所有跟超时有关的设置,
show variables like ‘%timeout’;
我这里的执行结果如下:
Variable_name | Value |
---|---|
connect_timeout | 60 |
delayed_insert_timeout | 300 |
innodb_lock_wait_timeout | 50 |
innodb_rollback_on_timeout | OFF |
interactive_timeout | 28800 |
net_read_timeout | 30 |
net_write_timeout | 60 |
slave_net_timeout | 3600 |
table_lock_wait_timeout | 50 |
wait_timeout | 28800 |
可以看到connect_timeout是60,我这里原来是15秒,因为某些原因网络需要走代理,连接会超时,所以设置成一分钟,这样就不会出现连接超时无法连接的问题了。