四年ECS老用户,记一次很基础的问题解决流程。
问题描述
外部客户端访问mysql数据库,测试链接卡在connecting main不动。
初步排查
- ping IP可通
- telnet IP 3306不通
所以原因很简单:无法访问3306端口
配置排查
1. 已确认在腾讯云页面设置了3306端口向0.0.0.0/0开放TCP协议
2. 已确认端口正在被监听(mysqld)
root@node:~$ netstat -nltp | grep 3306
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN -
tcp6 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
3. 已确认操作系统防火墙没有额外的拦截设置(甚至都没开)
root@node:$ ufw status
Status: inactive
测试仍然连接不上,正准备向售后寻求《技 术 支 持》时,从注意事项中看到了一条:
上面第2点执行netstat确认端口监听情况时漏了一个细节,local address显示127.0.0.1:3306,即只允许本机访问。所以当下问题明显是要设置3306向0.0.0.0开放。
解决过程
修改配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf,把bind-address=127.0.0.1注释掉
# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
重启mysqld
/etc/init.d/mysql restart
再次检查3306的netstat
root@node:~/# netstat -an | grep 3306
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN
tcp6 0 0 :::3306 :::* LISTEN
显示三个冒号:::说明已对0.0.0.0公开。再次通过客户端访问mysql,这次换了个报错:
x.x.x.x(IP) is not allowed to connect to this MySQL server
这次的原因是mysql内部的问题,没有设置允许外部机器访问,通过修改系统表解决:
mysql> use mysql;
Database changed
mysql> select host from user where user='root';
+-----------+
| host |
+-----------+
| localhost |
+-----------+
1 row in set (0.00 sec)
mysql> update user set host = '%' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select host from user where user='root';
+------+
| host |
+------+
| % |
+------+
将user表中root的host改为“%”后,即可允许所有外部客户端访问。
测试后再次遇到新的报错:
Public Key Retrieval is not allowed
原因是当时设置驱动属性把useSSL给改为false了,重新设回useSSL=true即可。
再次测试链接,这次终于连上了。
参考&鸣谢
连接MySQL报错,is not allowed to connect to this MySQL server_Gzzz__的博客-CSDN博客