远程连接云服务器MySQL的关键配置
最近在使用Nodejs开发后台系统,因此尝试在云服务器上安装MySQL,在云服务器终端操作MySQL没有任何问题,但是使用数据库工具远程连接MySQL一直连接不上,整理了配置和排查的关键步骤,希望可以帮到遇到同样问题的小伙伴。
一、打开防火墙规则允许3306端口可被访问
MySQL启动后,默认监听的是3306端口,要远程访问该端口,就要开启访问墙限制,允许外部访问3306端口。阿里云和腾讯云都提供了防火墙页面,用户可以点击添加规则,应用类型选择MySQL,会自动选择端口范围3306,点击确定保存即可。
然后打开电脑的终端,测试云服务器的端口是否可以访问。
mac下测试3306端口是否可以访问。
nc -vz -w 2 ip 端口号 # 测试命令
Connection to 101.43.70.251 port 3306 [tcp/MySQL] succeeded! # 出现此提示,代表可以访问
windows下测试3306端口是否可以访问。
telnet ip 端口 # 测试命令
# 出现成功连接提示,代表可以访问
二、确认云服务器MySQL是否启动
云服务器终端输入如下命令:
ps -ef|grep MySQL # 查看MySQL进程命令
MySQL 31502 30890 0 2月11 ? 00:00:28 /www/server/MySQL/bin/MySQLd --basedir=/www/server/MySQL --datadir=/www/server/data --plugin-dir=/www/server/MySQL/lib/plugin --user=MySQL --log-error=VM-4-9-centos.err --open-files-limit=65535 --pid-file=/www/server/data/VM-4-9-centos.pid --socket=/tmp/MySQL.sock --port=3306 # 出现类似此提示,代表MySQL已经启动了, 我使用宝塔面板安装的MySQL,MySQL的目录在/wwww/server/下的,不同的安装方式,此目录不同,出现进程pid即可
三、检查云服务3306端口的监听地址
云服务器的MySQL要被其它电脑主机访问,监听的地址不能是127.0.0.1,而应该是0.0.0.0或是:::
云服务器终端输入如下命令:
netstat -tlanp|grep 3306 # 查看命令
# 出现类似如下信息,代表MySQL已启动, 监听端口是3306,MySQL进程id是31502,地址:::3306 ,代表是0.0.0.0
tcp6 0 0 :::3306 :::* LISTEN 31502/MySQLd
如果不是: : :3306而是127.0.0.1:3306,则代表监听的ip地址是本地的,只能本地访问,可以修改my.cnf的bind-adresss的地址为0.0.0.0或者删掉这个配置,删掉则为: : :3306。
四、检查MySQL的用户是否有远程访问的权限
查看MySQL数据库的user表
云服务器终端查看权限:
MySQL -u root -p # 输入密码登录
MySQL> use MySQL; # 切换到MySQL数据库
Database changed
MySQL> select host,user from user; # 查询user表
+-----------+---------------+
| host | user |
+-----------+---------------+
| % | hewangjs |
| localhost | hewangjs |
| localhost | MySQL.session |
| localhost | MySQL.sys |
| localhost | root |
+-----------+---------------+
5 rows in set (0.00 sec)
# host字段 localhost代表只能本地访问, %代表可以远程访问,即不限制访问的ip地址
# 因此,可以使用heangjs用户进行远程访问,root用户只能本地访问
update user set host='%' where user='root'; # 通过此命令可以修改root用户可以访问的ip地址限制
以上四步完成后,可以使用数据库管理工具测试连接,这里使用MySQLWorkbench测试,按照以下界面填写信息,测试连接。
提示成功,则连接完成,否则可以再检查下前面四步。
五、分享一个坑
在阿里云页面添加了3306的规则后,但是没有生效,导致我一直不成功,所以有时候这个设置并不能保证一定成功,可以这样排查。
如果像我一样使用了宝塔的防火墙,可以检查宝塔的防火墙页面是不是也把3306端口放开了。
也可以使用以下命令排查
# 1. 查看端口状态
[root@iZuf6ccn2ffevsd3vg6azrhzbxZ ~]# netstat -nutlp # 查看端口状态
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1153/sshd
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 1419/python3
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1148/master
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 1248/mongod
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 14431/MySQLd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1228/nginx: master
tcp6 0 0 ::1:25 :::* LISTEN 1148/master
tcp6 0 0 :::33060 :::* LISTEN 14431/MySQLd
udp 0 0 0.0.0.0:68 0.0.0.0:* 862/dhclient
udp 0 0 127.0.0.1:323 0.0.0.0:* 528/chronyd
udp6 0 0 ::1:323 :::* 528/chronyd
# 以上显示3306端口 正在被MySQL监听
# 2. 查看防火墙状态
systemctl status firewalld
[root@iZufa6ccn2fevs3dvg6zrhzbxZ ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-02-06 17:00:18 CST; 6 days ago
# 以上显示防火墙正在运行
# 3. 查看防火墙规则
iptables -nxvL
# 4. 使用命令``firewall-cmd --list-all``放通了那些端口
firewall-cmd --list-all # 查看放通了那些端口
# 5. 如果没有3306,可以尝试使用以下两条命令,放开3306端口
firewall-cmd --add-port=3306/tcp --permanent
iptables -I INPUT -p tcp --dport 3306 -m state --state NEW -j ACCEPT
如果尝试了很多方法还是连不上云服务器的数据库,可以联系云服务器的在线客服帮助,转人工客服,专业的运维人员会为你解决问题。作为前端、后端或客户端的开发工程师,我们应该把时间和精力放在专业内的技术研究和业务开发上,不必在运维领域浪费较大的精力,毕竟术业有专攻,专业的人做专业的事情,运维是一件不简单的事情,遇到较难的问题,可以及时向大牛请教。