2003 - Can't connect to MySQL xxx (61 "Connection refused") 或者 telnet: Unable to connect to remote host: Connection refused
为解决该问题查询了很多资料,网上多数方法都无法从根本上解决问题,记录我总结该问题的方法。
直接上最终解决方案。
分析出现该问题的根本原因: mysql用户访问权限。
检查mysql用户访问权限
root@zqm:~# mysql -u root -p
> use mysql;
> select host,user from user; // 查看用户
> update user set host='%' where user='root'; // 设置host为%,如果执行不成功, 再次查看一下用户权限
> select host,user from user; // 查看用户
> flush privileges; // 刷新权限
> exit; // 退出
重新连接数据库, 测试成功,成功连接。
如果您的mysql用户访问权限正常,可以尝试从以下几方面调查。
1. 查看访火墙是否开启了3306端口
- 查看防火墙状态
root@zqm:~# sudo ufw status
Status: active
如果防火墙是关闭状态,直接忽略掉以下的配置检查。
- 配置防火墙
root@zqm:~# sudo vi /etc/iptables.up.rules // 确保增加了3306端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
- 重载防火墙
root@zqm:~# sudo iptables-restore < /etc/iptables.up.rules
2. 确认3306端口是否开放
root@zqm:~# netstat -an | grep 3306
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
3. 检查数据库是否绑定0.0.0.0
root@zqm:~# sudo vim /etc/mysql/my.cnf // 确定?bind-address = 0.0.0.0
4. 端口检查
root@zqm:~# netstat -an | grep 3306
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 32251/mysqld
5. telnet测试3306端口是否连通
root@zqm:~# telnet xx.xxx.xxx.xxx 3306
telnet: Unable to connect to remote host: Connection refused
6. 检查mysql用户访问权限【以上都只是试错,最关键的这步,这步才是解决问题的一步。】
root@zqm:~# mysql -u root -p
mysql> use mysql;
mysql> select host,user from user; // 查看用户
+-----------+------------------+
| host | user |
+-----------+------------------+
| 127.0.0.1 | root |
| ::1 | root |
| localhost | debian-sys-maint |
| localhost | root |
| zqm | root |
+-----------+------------------+
5 rows in set (0.00 sec)
mysql> update user set host='%' where user='root'; // 设置host为%
ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY' // 如果执行不成功, 再次查看一下用户权限
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | root |
| 127.0.0.1 | root |
| ::1 | root |
| localhost | debian-sys-maint |
| zqm | root |
+-----------+------------------+
5 rows in set (0.00 sec)
mysql> flush privileges; // 刷新权限
mysql> exit // 退出
Bye
7. 以上确认配置都正常,重新连接数据库,成功!