远程连接云服务器MySQL的关键配置

841 阅读5分钟

远程连接云服务器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 

如果尝试了很多方法还是连不上云服务器的数据库,可以联系云服务器的在线客服帮助,转人工客服,专业的运维人员会为你解决问题。作为前端、后端或客户端的开发工程师,我们应该把时间和精力放在专业内的技术研究和业务开发上,不必在运维领域浪费较大的精力,毕竟术业有专攻,专业的人做专业的事情,运维是一件不简单的事情,遇到较难的问题,可以及时向大牛请教。