必须修改 bind-address 为 0.0.0.0、创建 mysql_native_password 认证的远程用户、使用 WSL2 网关 IP(如 172.28.16.1)连接,三者缺一不可;还需确保 MySQL 开机自启且防火墙放行 3306 端口。
navicat 无法直连 wsl2 中的 mysql,不是 navicat 的问题,而是 wsl2 网络模型和 mysql 默认绑定策略共同导致的——必须改 bind-address、开远程用户、确认端口可达,三者缺一不可。
修改 mysqld.cnf 允许外部连接
WSL2 默认只监听 127.0.0.1,Windows 主机访问时走的是虚拟网卡 IP,不是回环地址,所以必须放开绑定:
- 编辑配置:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf - 找到
bind-address = 127.0.0.1和mysqlx-bind-address = 127.0.0.1两行 - 全部改为
0.0.0.0(不是注释掉,是显式替换) - 保存后必须重启服务:
sudo systemctl restart mysql - 不改
mysqlx-bind-address会导致 MySQL 8.0+ 的 X Protocol 连接失败,即使普通连接能通
创建带 mysql_native_password 插件的远程用户
MySQL 8.0 默认用 caching_sha2_password,而 Navicat 旧版本(包括多数免费版/教育版)不支持该认证方式,会报错 Authentication plugin 'caching_sha2_password' cannot be loaded:
在 Windows 上执行终端命令,或对比 Windows 与 Linux 的 Shell 语法时使用。建议先检测当前 Shell 是 PowerShell 还是 cmd.exe,再给出相应命令……
- 登录 MySQL:
sudo mysql -u root -p - 创建用户并强制指定插件:
CREATE USER 'naviuser'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_password'; - 授权:
GRANT ALL PRIVILEGES ON *.* TO 'naviuser'@'%' WITH GRANT OPTION; - 刷新:
FLUSH PRIVILEGES; - 验证插件是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user = 'naviuser';—— 输出中plugin列必须是mysql_native_password
在 Windows 中获取 WSL2 实际 IP 并测试端口
不能填 127.0.0.1 或 localhost,因为那是 Windows 自己的回环,不是 WSL2 的;也不能依赖 ifconfig 查到的 172.x 地址(它每次重启可能变),要用稳定方式:
- 在 WSL2 终端运行:
cat /etc/resolv.conf | grep nameserver | awk '{print $2}',输出类似172.28.16.1—— 这就是 Windows 主机在 WSL2 网络中的网关 IP,也是你 Navicat 要填的“主机” - 在 Windows PowerShell(非管理员)中测试连通性:
Test-NetConnection 172.28.16.1 -Port 3306,返回TcpTestSucceeded : True才算通 - 如果失败,检查 WSL2 防火墙:
sudo ufw status,若为active,临时关掉:sudo ufw disable(生产环境请按需开放端口) - Navicat 连接时,“主机”填上面查到的 IP,“端口”保持
3306,“用户名”填naviuser,“密码”填对应密码
为什么有时连上又断、或提示 Access denied?
常见但容易被忽略的点:
- WSL2 每次关机后 IP 可能重置(尤其 Windows 休眠/更新后),
/etc/resolv.conf中的nameserver地址会变,必须重新查 - MySQL 服务没设开机自启:
sudo systemctl enable mysql,否则重启 WSL2 后服务没起来,Navicat 连接超时 - 用了 root 用户但没改认证插件,或改了但没
FLUSH PRIVILEGES,权限不会生效 - Navicat 缓存了旧连接参数,建议新建连接而非复用,避免凭据残留干扰判断

















