解决Navicat15连接虚拟机Mysql时出现的两个问题

2023年 10月 5日 56.0k 0

Navicat15连接到虚拟机Mysql问题

问题场景描述

我的目的是将一个Springboot项目部署到Linux环境进行调试,该项目涉及到数据库的操作,所以需要在虚拟机的Linux环境上配置Mysql数据库,同时想要使用本地的Navicat进行数据库管理以方便调试。在使用Navicat15连接虚拟机中的Mysql8.0时出现了问题。

  • 虚拟机:VMware
  • 虚拟机操作系统:CentOS7
  • 数据库:Mysql 8.0
  • 数据库管理软件:Navicat 15

问题一:Can’t connect to MySQL server (10060)

第一个问题是:我直接在Navicat中新建连接,填写虚拟机ip、虚拟机上Mysql的用户名,点击连接后等待数十秒钟,就出现了 Can’t connect to MySQL server (10060)的错误。

问题二:192.168.x.x is not allowed to connect

第一个问题通过修改防火墙设置解决后,再在Navicat中创建连接,点击连接即出现了not allowed to connect 的错误。

问题解决

问题一

通过查询网上论坛和博客的资料,出现此错误的原因可能有3个:

  • 虚拟机Mysql服务未启动
  • 虚拟机和本地主机间网络不通
  • 虚拟机防火墙设置

前两个可能通过在虚拟机上检查Mysql服务和ping命令很快进行了排除,是防火墙设置问题的可能性较大。继续查阅网上的博客,发现了问题原理和解决方法:

首先,本地和虚拟机互相可以PING通,证明网络连通没有问题。但Navicat无法连接数据库,很可能是因为虚拟机端的防火墙将来自远程的访问过滤掉了,所以本地连接不上。
要想解决这一问题,可以通过iptables这一命令来修改防火墙设置。
image.png
iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用iptables命令可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。

具体在此场景中,可以先使用 iptables -nvL命令来查看fliter表中的过滤规则,并加上grep 3306来查看有关Mysql端口的相关过滤规则,发现为空或为DROP即为默认远端来访问3306端口的数据包不通过过滤。
此命令各参数的含义为:

  • -L 表示查看当前表的所有规则,默认查看的是 filter 表,如果要查看 nat 表,可以加上 -t nat 参数。
  • -n 表示不对 IP 地址进行反查,加上这个参数显示速度将会加快。
  • -v 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。

查看后得知远端对3306端口的数据包不通过过滤,所以需要修改过滤规则。通过命令:
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
此命令修改fliter表中INPUT入站数据过滤的规则,使远端的数据包可以通过防火墙过滤。

执行命令后,再进行连接不再报此错误。

至此,第一个问题得到解决。

问题二

通过查阅网上的博客等资料,发现问题二这种情况比较常见,有许多博客描述了同样的问题,解决方案思路也基本一致:Mysql配置中没有授权远程用户访问,所以报错显示了主机IP不被允许连接到数据库,所以要在Mysql配置中添加远程用户。
Mysql安装完成后默认有一个名为"Mysql"的数据库,里面保存了数据库的许多配置信息,与此问题相关的Mysql配置内容在此数据库中名叫"user"的表中,在虚拟机终端通过sql语句来修改此表,即可添加远程用户。具体操作如下:

在未进行修改时,user表中host一列只有虚拟机本地用户,解决问题的操作就是在此表中添加host为远端IP地址的用户。
使用的sql语句为:
grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;
使用此语句就在user表中添加了来自远端IP的数据库root用户访问权限。
image.png

不过此处我还遇到了一个小问题,就是第一次添加的host的IP地址为我在本地cmd窗口中通过ipconfig命令查询到的局域网IP地址,但这个地址添加后并不能解决问题。
随后我在Navicat提示报错的窗口中发现,错误信息中提示不被允许连接的IP地址并不是本机所在局域网IP,而是以太网适配器VMware Network Adapter VMnet8下的IP地址。这说明Navicat访问虚拟机数据库时发送请求的IP是VMnet8的IP,而不是局域网下的IP地址。
但我在虚拟机使用PING命令来测试本机VMnet8的IP地址时,并不能ping通,只有局域网可以ping通,猜测和VMware虚拟机网络设置有关,有待进一步探究。

至此,两个问题都得到解决,本地Navicat成功连接了虚拟机的Mysql数据库。

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论