mysql在WSL环境中安装与使用注意事项

来源:这里教程网 时间:2026-02-28 20:38:26 作者:

WSL 中 MySQL 安装失败常见原因

在 WSL(尤其是 WSL2)里直接

sudo apt install mysql-server
通常能成功,但后续启动失败、无法连接或服务自动退出,多半是因 systemd 不可用或资源限制导致。WSL1 默认无 systemd,WSL2 虽支持但需手动启用,而 MySQL 8.0+ 的
mysqld
默认依赖 systemd 管理 socket 和服务状态。

检查是否启用了 systemd:运行
ps -p 1 -o comm=
,输出
systemd
才表示已启用;否则会 fallback 到
sysvinit
,但 MySQL 包可能未安装对应脚本
若未启用 systemd,建议改用
mysql-server-8.0
的非 systemd 版本(如 Ubuntu 22.04+ 的
mysql-server
包实际已适配),或手动以守护进程方式启动:
sudo mysqld --user=mysql --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock --port=3306 --pid-file=/var/run/mysqld/mysqld.pid &
WSL2 内存默认限制较紧(尤其 Windows 内存不足时),
mysqld
启动后可能被 OOM killer 杀掉;可在
/etc/wsl.conf
中添加:
[wsl2]
memory=2GB
swap=1GB
,然后重启 WSL(
wsl --shutdown
+ 重新打开)

初始化 root 密码与跳过权限验证的实操区别

MySQL 5.7+ 默认禁用空密码 root 登录,且首次启动后不会生成临时密码(不像旧版会打印到 error log)。如果

sudo mysql
直接报
Access denied
,说明没设密码或认证插件不匹配。

安全初始化推荐用
sudo mysql_secure_installation
,它会引导设置 root 密码、禁用匿名用户、删除 test 数据库等——但前提是
mysqld
已正常运行且 socket 可达
若卡在登录环节,可临时跳过权限验证:先停止服务(
sudo service mysql stop
或 kill
mysqld
进程),再用
sudo mysqld --skip-grant-tables --skip-networking &
启动,此时
mysql -u root
可免密登录,接着执行:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password';
注意:WSL 中
localhost
127.0.0.1
行为一致,但若用 TCP 连接(如从 Windows 主机连 WSL 的 MySQL),需确认
bind-address
/etc/mysql/mysql.conf.d/mysqld.cnf
中设为
0.0.0.0
或注释掉,并开放
port = 3306

从 Windows 主机连接 WSL 中 MySQL 的网络配置要点

WSL2 使用虚拟网卡,其 IP 每次启动可能变化,且 Windows 防火墙默认拦截 3306 端口。直接填

localhost:3306
从 Windows 连不上,必须用 WSL2 的实际 IP。

在 WSL 中运行
ip addr show eth0 | grep "inet " | awk '{print $2}' | cut -d/ -f1
获取当前 IPv4 地址(如
172.28.12.19
在 Windows PowerShell(管理员)中执行:
netsh interface portproxy add v4tov4 listenport=3306 listenaddress=127.0.0.1 connectport=3306 connectaddress=172.28.12.19
,这样 Windows 上就能用
127.0.0.1:3306
访问
确保 MySQL 用户允许远程连接:登录后执行
CREATE USER 'dev'@'%' IDENTIFIED BY 'pass'; GRANT ALL ON *.* TO 'dev'@'%'; FLUSH PRIVILEGES;
;注意
'%'
不包含
localhost
,所以本地仍要用
'root'@'localhost'
Windows 防火墙要放行入站规则:控制面板 → Windows Defender 防火墙 → 高级设置 → 入站规则 → 新建规则 → 端口 → TCP 3306 → 允许连接

数据目录迁移与权限问题(尤其挂载 Windows 文件系统时)

把 MySQL

datadir
改到
/mnt/c/...
下看似方便备份,但会导致启动失败或数据损坏——NTFS 文件系统不支持 Unix 套接字、硬链接、文件锁等 MySQL 依赖的底层特性。

绝对不要将
datadir
设为
/mnt/c/...
或任何跨文件系统路径;只允许保留在 WSL 的 ext4 分区(如
/var/lib/mysql
/home/user/mysql-data
若需定期导出到 Windows,用
mysqldump
mysqlpump
生成 SQL 文件,再复制到
/mnt/c/...
;导入同理,先复制进 WSL,再用
mysql
命令执行
修改
datadir
后必须同步更新 AppArmor 配置(Ubuntu):编辑
/etc/apparmor.d/usr.sbin.mysqld
,添加新路径的读写权限,然后执行
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
权限错误典型现象:启动时报
Can't start server : Bind on unix socket: Permission denied
,检查
/var/run/mysqld/
目录属主是否为
mysql:mysql
,并确认 SELinux/AppArmor 未拦截

WSL 环境下 MySQL 最容易被忽略的是 systemd 依赖和 Windows/WSL 网络边界——不是“装上了就能用”,而是得明确知道哪一步在哪个环境里生效、socket 走的是 Unix 域还是 TCP、以及权限模型如何跨层传递。

相关推荐