我在 Windows 上安装了 MySQL 服务器,我想从 WSL2 连接到它。不幸的是,WSL 似乎无法访问 MySQL 服务器:
$ /mnt/c/Program\ Files/MySQL/MySQL\ Server\ 5.7/bin/mysql.exe -uroot -p
Enter password:
mysql> exit
Bye
$ mysql -uroot -p --protocol=TCP
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (111)
在 上,ifconfig
我只有两个接口eth0
和lo
,因此 WSL 和 Windows 似乎共享同一个本地接口。为了验证这一点,我启动了一个 Python Web 服务器并从本地主机上的 Windows 进行访问。
如何从 WSL2 连接到 MySQL?
答案1
根据WSL 与 WSL2 文档关于如何连接主机,你可以在 WSL2 中查看/etc/resolv.conf对于名称服务器(恰好是主机):
export WSL_HOST_IP=$(awk '/nameserver/ { print $2 }' /etc/resolv.conf)
答案2
正如所述本文,您必须使用 WSL 以太网适配器创建的 IP。
如果需要,请创建 Windows 防火墙规则。(MySQL 的入站规则)
运行ipconfig.exe
并查找Ethernet-Adapter vEthernet (WSL)
。提取 IP 地址。(如果您使用文章中的 awk 行,我必须将 $14 更改为 $13 才能使其正常工作)。
在 mysql 中授予 ip 地址访问权限:(grant all on *.* to 'root'@'172.0.0.0/255.0.0.0' identified by '<password>' with grant option;
我发现 Windows 重启后 IP 地址会发生变化,因此我不得不使用 IP 范围/掩码版本。)
然后你可以打电话mysql -uroot -p -h<ip-address> --protocol=tcp
编辑
如果您想跳过此-h
参数,您可以将导出和别名添加到.bashrc
:
export WSL_HOST_IP=$(/c/Windows/system32/ipconfig.exe | awk '/WSL/ {getline; getline; getline; getline; print substr($13, 1, length($13)-1)}')
alias mysql='mysql -h$WSL_HOST_IP'
(如果您使用,/mnt/c/
请相应地更正 ipconfig 的路径。)
然后你就可以输入mysql -uroot ...
答案3
上述步骤有效,但有一个稍微更简单的方法来引用主机。
自 2021 年起,您需要做的就是将 Windows 主机称为:
hostname.
或者
hostname.local
这将返回相同的IP 地址与上面使用 resolve.conf 文件的出色解决方法一样,并且更加简单。
请注意,wsl 中的 localhost 确实解析为不同的 IP,即正常的 127.0.0.1
这很有道理,基本上它是一个虚拟机。
意外后果:如果您尝试登录 MariaDB,这不算作本地主机 - 因此您必须具有正确的安全设置才能允许从远程计算机(包含的 VM)登录