WSL2中直接apt install mysql-server安装MySQL 8.0后报“Can't connect”错误,主因是未初始化数据目录、mysqld未真正启动,且默认绑定127.0.0.1、禁用远程登录、使用auth_socket认证;需手动初始化、改bind-address为0.0.0.0、切换mysql_native_password并授权root@'%'。

MySQL 8.0 在 WSL2(Ubuntu)中能直接用 apt install mysql-server 装,但默认配置不支持远程连接、root 密码为空且认证方式为 auth_socket,Windows 主机连不上是常态,不是你配错了。
为什么 sudo apt install mysql-server 装完就报错“Can't connect to local MySQL server”
WSL2 的 Ubuntu 默认没启用 systemd,而 mysql-server 包依赖它启动服务;但 WSL2 实际用的是 service 命令管理进程。常见表现:
-
sudo service mysql start显示成功,但mysql -u root -p仍报ERROR 2002 (HY000) -
ps -ef | grep mysql看不到mysqld进程,或只有mysqld_safe挂着没起来 -
/var/run/mysqld/mysqld.sock文件不存在
根本原因:安装时没初始化数据目录,或 mysqld 启动失败后静默退出。解决方法不是重装,而是手动触发初始化:
- 先停掉残留进程:
sudo service mysql stop - 清空旧数据(首次安装可跳过,但重试前建议执行):
sudo rm -rf /var/lib/mysql - 重新初始化:
sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql - 再启动:
sudo service mysql start
运行 mysql_secure_installation 后还是连不上 Windows 主机
这是因为脚本默认禁用远程 root 登录(Disallow root login remotely? : y),且 MySQL 8.0 默认绑定 127.0.0.1,不监听 WSL2 的虚拟网卡 IP。关键动作有三步,缺一不可:
- 改配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf,找到bind-address行,改成bind-address = 0.0.0.0(不是注释掉,是显式赋值) - 重启服务:
sudo service mysql restart - 进 MySQL 手动开权限:
sudo mysql→ 执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;
注意:mysql_native_password 是必须的——WSL2 + Ubuntu 22.04/24.04 上,caching_sha2_password 驱动在 Windows 端(如 DataGrip、MySQL Workbench)经常握手失败,别硬扛。
从 Windows 主机用 DataGrip 或命令行连 WSL2 的 MySQL 总超时
不是数据库没开,是 WSL2 的网络模型导致的:WSL2 使用虚拟网卡,IP 动态变化,且 Windows 防火墙默认拦 3306。验证和修复顺序如下:
- 在 WSL2 中查当前 IP:
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1,记下类似172.29.128.1的地址 - 在 Windows PowerShell 中测试连通性:
Test-NetConnection 172.29.128.1 -Port 3306—— 如果显示TcpTestSucceeded : False,就是防火墙或 MySQL 没真正监听 - 关掉 Windows 防火墙临时测试(仅调试):
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False - DataGrip 连接时 Host 填上面查到的 WSL2 IP,Port 保持
3306,User 填root,Password 填你设的密码,Driver 选MySQL(不要选MySQL (Legacy))
长期方案:把 WSL2 IP 写进 Windows 的 hosts 文件,并在防火墙里放行 mysqld 进程(路径通常是 /usr/sbin/mysqld,但 Windows 看不到,所以更稳妥的是放行端口 3306 + 允许“专用网络”)。
最常被忽略的一点:每次重启 WSL2(wsl --shutdown 后再打开),它的 IP 会变。别把 IP 写死在 IDE 配置里,要么用脚本自动同步,要么在 Windows 端用 localhost:3306 + SSH 隧道转发——后者更稳,但需要额外配 sshd。


















