在本地的Navicat连接服务器上的数据库时,出现如下错误:
遇到问题要学会拆解、分析,从不同的角度考虑问题,慢慢缩小问题范围,最终发现并解决问题;
一个远程的服务连接不上,一般的,考虑:
1、本地和远程是否互通
2、权限是否有问题
而我们的报错中并没有提到权限相关问题;
1、解决网络互通问题
这里,先分析第一种可能:
1.1、使用ping
命令
- 如果ping不通,参考官方文档:
安全相关:检查ECS安全组、云防火墙、安全管控状态。
安全组相关问题:具体操作请参见删除ECS实例的默认安全组规则导致无法ping通ECS实例。
云防火墙相关问题:请登录云防火墙控制台,在访问控制中,检查是否存在由外对内的拒绝规则,禁止了端口的访问和ICMP协议。
安全管控相关问题:具体操作请参见添加安全组规则,添加对安全组ICMP协议的入方向的安全策略。
1.2、使用telnet
命令
(win11的telnet
命令在”可选功能“中打开,参照文章末尾)
如果ping
没问题,但telnet
失败,显示 ”在端口xxx连接失败“
就表示端口未放行。
如果出现端口未放行,怎么办?需要排查两种情况。
1.查看阿里云服务器控制台是否设置了安全组规则。这个需要阿里云账号登录到阿里云,进入服务器控制台设置安全组规则。 具体教程:阿里云服务器如何设置安全组规则图文教程
也可以参考文章:https://blog.csdn.net/qq_42992704/article/details/1046964322.查看云服务器Linux系统是否设置了防火墙规则。查看防火墙是否关闭了端口。这个需要ssh远程连接你的linux服务器来查看和设置防火墙规则。具体教程,浏览本文
1,查看防火墙状态
systemctl status firewalld.service
2,开启防火墙
systemctl start firewalld.service
3,关闭防火墙
systemctl stop firewalld.service
4,禁用防火墙
systemctl disable firewalld.service
5,查看防火墙已开放端口列表
firewall-cmd --list-all
案例:
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 3306/tcp //已经开放的端口会在这里显示。没有显示的端口,是访问不了的。
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
6,防火墙添加端口
[root@localhost ~]# firewall-cmd --permanent --add-port=3306/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 8080/tcp 3306/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
7,防火墙关闭端口
[root@localhost ~]# firewall-cmd --permanent --remove-port 3306/tcp
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
来自:https://zhuanlan.zhihu.com/p/344784016
2、解决MySQL远程连接的授权问题
2.1、第一种方法
- 一般需要改下服务器上mysql的权限,首先登录服务器上的mysql,
%
:表示可以任何主机都能连接到mysql服务器
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '这里写自己数据库的密码' WITH GRANT OPTION;
- 或者也可以把
%
换成自己本地的IP地址,如:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.x.x' IDENTIFIED BY '这里写自己数据库的密码' WITH GRANT OPTION;
- 最后刷新权限使其生效
FLUSH PRIVILEGES;
2.2、 第二种方法
- 此时的MySQL配置不支持远程连接,登录服务器的mysql后,查看root用户下的 host
use mysql;
select host from user where user='root';
- 可以看到root用户下只有
localhost
本地支持连接 - 将
localhost
设置为通配符%
,就可以允许远程连接了
update user set host = '%' where user ='root';
localhost 指的是用户开放的IP,可以是localhost(仅本机访问,相当于127.0.0.1),可以是具体的某一IP,也可以是 ‘%’ (所有IP均可访问)
- 查看更改后的变化
select host, user from user;
- 最后刷新权限即可
FLUSH PRIVILEGES;
来自:https://developer.aliyun.com/article/872622