如何使用Navicat连接WSL里的MySQL服务

Hervey

0 前言

真的有人会干这么套娃的事情吗?

原来是我啊,那没事了

究其原因,还是由于之前技术不精,在Windows系统上安装MySQL,结果MySQL炸了,而且还没办法卸载干净,这次想着既然VSCode可以与WSL连接,为何Navicat不能与WSL里的MySQL连接呢?

而且照XCloudFance 学长的说法:“你可以把WSL想象是里面的一台电脑,你的Windows也是一台独立的电脑”,那么navicat理论上应该可以与WSL中的MySQL连接。

于是,痛苦的两个小时配置之旅就开始了(中途还重装了一次WSL qwq)

1 前期准备

1.1 安装Navicat

自行Baidu/Google/Bing下载安装包

安装包打开后一路next即可

1.2 安装WSL

Baidu/Google/Bing

**注意:**记得将WSL版本设置为WSL2,本人使用的系统是Ubuntu22.04

1.3 在WSL中安装MySQL

在WSL终端中输入

1
sudo apt install mysql-server

即可,root及其余账户密码配置请自行百度

2 正式开始吧!

2.1 找到WSL的IP地址

首先,我们应该让Windows主机能够访问WSL,那么我们就应该先知道WSL的本地IP访问地址。

在Windows下打开终端(Power Shell),使用如下命令查询:

1
ipconfig

可以看到这样一行提示:

1
2
3
4
5
6
7
以太网适配器 vEthernet (WSL):

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::85d4:3cdb:df1f:f6e1%42
IPv4 地址 . . . . . . . . . . . . : 172.30.224.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :

说明主机其实是能够访问到WSL的。

在WSL的终端中,使用ifconfig查询本地IP地址

1
ifconfig

有可能需要使用如下指令安装net-tools

1
sudo apt install net-tools

安装成功后,运行ifconfig会输出类似下面的结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 172.30.224.99 netmask 255.255.240.0 broadcast 172.30.239.255
inet6 fe80::215:5dff:fe99:f76a prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:99:f7:6a txqueuelen 1000 (Ethernet)
RX packets 104254 bytes 266388818 (266.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 69925 bytes 5218621 (5.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 5644 bytes 29799099 (29.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5644 bytes 29799099 (29.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

第二行的172.30.224.99便是你的WSL的本地IP地址。

2.2 设置MySQL被局域网访问

这时我们可以试着用Navicat连接一下刚才获得IP地址的WSL的MySQL服务,发现Navicat显示连接失败,这是因为我们未设置MySQL能被局域网访问。

进入MySQL中,修改账户的访问权限:

1
2
3
4
5
6
mysql -u root -p <password>
mysql->use mysql
mysql->update user set host = '%' where user ='root';
mysql->grant all privileges on *.* to 'root'@'%' with grant option;
mysql->flush privileges;
mysql->exit;

找到MySQL的配置文件进行修改:

1
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

mysqld.cnf中,找到这样一行配置:

1
bind-address = 127.0.0.1

修改为:

1
bind-address = 0.0.0.0

保存后重启MySQL:

1
sudo /etc/init.d/mysql restart

可以通过netstat -aptn检查MySQL的状态

1
2
3
4
5
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -

2.3 设置Ubuntu防火墙

此时我们还是无法连接,还需关闭Ubuntu的防火墙

1
sudo ufw enable #开启

在WSL环境下,可能会得到如下提示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/ufw/util.py", line 427, in under_ssh
ppid = get_ppid(pid)
File "/usr/lib/python3/dist-packages/ufw/util.py", line 421, in get_ppid
return int(ppid)
ValueError: invalid literal for int() with base 10: 'S'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/sbin/ufw", line 138, in <module>
not ui.continue_under_ssh():
File "/usr/lib/python3/dist-packages/ufw/frontend.py", line 901, in continue_under_ssh
if self.backend.do_checks and ufw.util.under_ssh(): # pragma: no cover
File "/usr/lib/python3/dist-packages/ufw/util.py", line 457, in under_ssh
return under_ssh(ppid)
File "/usr/lib/python3/dist-packages/ufw/util.py", line 457, in under_ssh
return under_ssh(ppid)
File "/usr/lib/python3/dist-packages/ufw/util.py", line 457, in under_ssh
return under_ssh(ppid)
[Previous line repeated 1 more time]
File "/usr/lib/python3/dist-packages/ufw/util.py", line 434, in under_ssh
raise ValueError(err_msg)
ValueError: Couldn't find parent pid for '3129'

这是因为/usr/lib/python3/dist-packages/ufw/util.py中有一行Python出现错误

更正方法是进入中:

1
sudo vim /usr/lib/python3/dist-packages/ufw/util.py

1
ppid = open(name).readlines()[0].split(')')[1].split()[1]

改为

1
ppid = open(name).readlines()[0].rsplit(')',1)[1].split()[1]

即可

之后添加允许访问的端口3306并重载生效即可

1
2
sudo ufw allow 3306
sudo ufw reload

完成后查看

1
sudo ufw status

得到如下结果即为成功

1
2
3
4
5
6
Status: active

To Action From
-- ------ ----
3306 ALLOW Anywhere
3306 (v6) ALLOW Anywhere (v6)

这时再使用Navicat访问,即可连接上WSL的MySQL服务。

  • 标题: 如何使用Navicat连接WSL里的MySQL服务
  • 作者: Hervey
  • 创建于 : 2023-08-02 23:06:50
  • 更新于 : 2023-10-31 02:28:36
  • 链接: https://herveyb3b4.github.io/2023/08/02/How-to-use-Navicat-to-connect-to-MySQL-services-in-WSL/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。