Windows下用WSL搭建Linux开发环境:MySQL 8.0安装、SSH连接与DataGrip远程管理

发布时间:2026/9/7 15:04:42
Windows下用WSL搭建Linux开发环境:MySQL 8.0安装、SSH连接与DataGrip远程管理 搞Windows开发的人想学Linux和MySQL最头疼的就是两套环境来回切换。以前要么装双系统重启一次十分钟要么开虚拟机内存和CPU被吃掉一截风扇转得比吹风机还响。后来出了WSL情况就好多了——直接在Windows里跑一个真正的Linux子系统不是模拟器是内核级的轻量虚拟化启动只要一两秒内存占用可以控制在几百MB还能在Windows资源管理器里直接访问Linux的文件。这篇文章我就把整套流程掰开揉碎讲一遍从WSL的安装、Linux版MySQL 8.0的部署到用FinalShell走SSH连进子系统、用DataGrip以JDBC方式远程连MySQL全程带步骤、带踩坑记录适合刚从Windows转过来、没怎么碰过Linux和MySQL的新手也适合想让本地方便练手的开发老手。先说清楚这文章核心解决什么痛处。很多人下了个MySQL压缩包往Windows一装用着确实没问题但总觉得Linux才是生产环境主战场光在Windows上敲MySQL心里没底。而WSL恰好提供一个退可守、进可攻的中间态Windows上写代码Linux里跑数据库两边文件互访网络互通开发完直接移植到云服务器也不违和。FinalShell则解决想用图形化界面管Linux但不想装VMware的问题DataGrip解决想在IDE里写SQL、看ER图、远程调试MySQL的问题。这套组合装完了你的Windows就变成了一台可以随时在图形化与命令行之间切换的开发机。1. 环境准备Windows上的WSL安装与初始化WSL这玩意儿其实存在很久了早年是WSL1也就是翻译系统调用的兼容层快是快但很多跟内核相关的软件跑不了比如Docker。后来微软推出了WSL2用真正的Hyper-V虚拟机跑一个精简Linux内核兼容性大幅提高MySQL、Docker、CUDA这些都能跑。所以第一步就是把系统升级到支持WSL2的版本一般建议Windows 10 2004以上或者Windows 11然后以管理员身份打开PowerShell或CMD输入wsl --install这个命令会一次性帮你把WSL功能、虚拟机平台、默认的Ubuntu发行版全部装好。装完提示重启就重启重启后会自动进入Ubuntu初始化界面让你设置一个Linux用户名和密码。注意这个用户名和密码跟你Windows的登录账号完全独立之后每次进WSL用的都是它。如果你的系统之前装过旧版WSL或者执行wsl --install太慢、卡住那就多半是网络问题。打开Windows设置里的可选功能看看适用于Linux的Windows子系统和虚拟机平台这两个复选框有没有勾上勾上后重启然后去官网手动下载WSL2内核更新包。装完内核包再跑wsl --set-default-version 2把默认版本切成WSL2。这个操作不难就是网速如果不行会很折磨。更省心的做法是换Ubuntu镜像源下载但这里先不展开后文会有镜像配置。进入Ubuntu之后第一件事是换apt源。默认走Ubuntu官方源国内服务器访问慢得想摔键盘。我用的是阿里云镜像操作方式是先把源列表备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt updateUbuntu 24.04如果发现sources.list是空的别慌那是新版本改用/etc/apt/sources.list.d/ubuntu.sources了。用vim或nano把里头的http://archive.ubuntu.com/ubuntu/替换成http://mirrors.aliyun.com/ubuntu/再update即可。顺带装几个基础工具后面都用得上sudo apt install -y net-tools vim curl wget这里有个细节WSL2的网络模式是NAT子系统里会有一个动态IP而你从Windows访问Linux时其实走的是Windows的localhost自动转发机制。也就是说WSL里的服务监听在某个端口你直接在Windows浏览器敲localhost:端口就能访问。这个特性对我们后面FinalShell和DataGrip的连接非常关键后面会反复用到。2. MySQL 8.0在WSL里的安装与配置2.1 用apt安装MySQL并完成初始化Ubuntu的软件仓库里就有MySQL直接用apt装就行sudo apt install -y mysql-server装完以后先启动服务。注意因为WSL2默认不开systemd除非你手动在/etc/wsl.conf里配了systemdtrue很多Linux教程里的systemctl start mysql在这里会直接报错。别慌用sudo service mysql start这个命令是走init.d脚本的WSL环境完全兼容。启动后验证一下sudo service mysql status ps aux | grep mysqld sudo mysql -uroot如果能看到mysqld进程并且sudo mysql能直接进MySQL命令行说明安装成功。这里解释一下为什么sudo mysql不需要密码——Ubuntu的MySQL 8.0默认root用户用的是auth_socket认证插件Linux系统下的root用户直接通过socket登入根本不校验密码。这个设计对本地开发很友好但对我们后面要远程连接MySQL来说就是个拦路虎了因为DataGrip走的是TCP/IP不会用socket必须要给root或专用账号设置密码。2.2 修改root认证方式与创建远程用户先把root账号的密码设好同时把认证插件切换成caching_sha2_passwordMySQL 8.0默认插件ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY 你的密码; FLUSH PRIVILEGES;然后是重点创建一个允许从任意主机连接的账号因为DataGrip从Windows过来时IP是Windows的局域网地址不是localhostCREATE USER dev% IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON *.* TO dev% WITH GRANT OPTION; FLUSH PRIVILEGES;这里%表示不限制来源IP。细心的读者可能会问如果只想让固定IP连接是不是就该写dev192.168.1.100是的安全要求高的场景确实该这么干但本地开发图省事%够用了。另外一个容易踩的坑是MySQL会默认监听3306端口但是只绑定127.0.0.1也就是只让本机连。Windows上的DataGrip从外部连过来即使账号权限都对了也会报Connection refused。所以一定要修改监听地址。2.3 bind-address与IPv6监听坑打开MySQL配置文件sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到bind-address这一行默认是127.0.0.1把它改成bind-address 0.0.0.0注意MySQL 8.0的坑来了光改bind-address可能不够某些版本因为同时启用了IPv6改完0.0.0.0之后实际监听会变成*或者只有[::]IPv6地址从Windows用IPv4的localhost访问3306端口依然会被拒。怎么排查重启MySQL后跑sudo service mysql restart netstat -tlnp | grep 3306如果你看到类似tcp6 0 0 :::3306 :::* LISTEN而没有IPv4的0.0.0.0:3306那基本就是踩中IPv6监听的坑了。解决办法是在mysqld.cnf里同时设置bind-address 0.0.0.0 mysqlx-bind-address 0.0.0.0老版本客户端连不上时可以顺手把skip-name-resolve打开跳过域名反解能省好多连接超时的烦恼skip-name-resolve改完重启MySQLnetstat里能看到0.0.0.0:3306在监听这时候Windows侧就能通过localhost:3306访问到WSL里的MySQL了。先不用急着开工具连先验证一遍端口映射通不通——Windows PowerShell里敲Test-NetConnection localhost -Port 3306如果TcpTestSucceeded显示True说明WSL2的端口转发链路是通的。如果显示False多半是防火墙或刚才的IPv6监听问题回头把那两个参数再检查一遍。3. FinalShell远程连接WSL的SSH通道3.1 WSL里启动SSH服务FinalShell要连WSL本质是SSH远程连接。WSL自带的Ubuntu镜像里可能已经预装了OpenSSH Server但默认不一定启动了。先检查sudo apt install -y openssh-server sudo service ssh start sudo service ssh status注意一点WSL的sshd有时候会因为缺/run/sshd目录而启动失败报错内容类似Missing privilege separation directory: /run/sshd。直接创建目录再启动sudo mkdir -p /run/sshd sudo service ssh startSSH服务启动后Windows侧连localhost:22就能转发到WSL内部。但这里有个非常隐蔽的坑Windows 10和Windows 11自带了一个OpenSSH Server服务如果你开启过那个服务它已经占用了22端口。那么FinalShell连localhost:22实际连到的是Windows自带的SSH而不是WSL里的SSH。后果就是你输入WSL的用户名密码要么报错要么进到一个跟WSL完全不沾边的PowerShell环境。排查方法也很简单在WSL里跑sudo service ssh stop然后Windows PowerShell里跑netstat -ano | findstr :22看那个LISTENING的PID对应的是不是Windows的sshd.exe。如果是在服务管理器里把OpenSSH SSH Server停掉并设为禁用再回WSL启动ssh。这样Windows的22端口就让给WSL了。3.2 FinalShell新建SSH连接的三要素打开FinalShell点左上角文件夹图标新建连接选SSH连接。主机IP填localhost端口填22用户名填WSL里那个Linux用户名密码填你设置的那个密码。为什么填localhost而不是WSL的动态IP前面说过WSL2做了localhost自动转发填localhost最稳定。动态IP每次重启都可能变填它纯属自己给自己找麻烦。FinalShell连上后你会看到左侧栏出现了完整的Linux目录树右侧是一个终端窗口。这个工具最大的好处是文件管理可视化直接拖拽上传下载还能监控CPU、内存、磁盘实时占用。在WSL里跑sudo service mysql status都能直接在FinalShell窗口里看到不用来回切窗口。说实话很多人后来宁可开FinalShell也不要直接用Windows Terminal图的就是这个直观。SSH连上后MySQL肯定也通了。因为FinalShell只是个命令行入口你在里面输入mysql -udev -p输入密码就能直接操作WSL里的MySQL了。到这里Windows里操作Linux中的MySQL这个需求的最基础版本已经实现了。但只停留在命令行还不过瘾接下来上DataGrip用IDE连数据库写SQL、看表结构、跑查询计划。4. DataGrip远程连接MySQL的配置实战4.1 下载与建立数据库连接DataGrip是JetBrains家的数据库IDE支持几乎所有主流数据库界面跟IntelliJ IDEA、PyCharm同源用过JetBrains全家桶的人上手零成本。装好之后打开DataGrip点击左上角加号数据源选MySQL。这时候有一堆字段要填我一个个说HostlocalhostPort3306Userdev或者你创建的任何远程账号Password对应用户的密码Database这里可以先不填连上之后再选填完后DataGrip会自动检测驱动并且下载。这里注意如果第一次连接报错[08001] Public Key Retrieval is not allowed这是MySQL 8.0默认认证插件caching_sha2_password和JDBC驱动之间的一种机制限制客户端想连接但服务器要求客户端先取公钥而JDBC默认不允许自动获取公钥。解决办法很简单在DataGrip连接URL的高级参数里添加allowPublicKeyRetrievaltrue或者切换到驱动属性标签页把allowPublicKeyRetrieval的值改为true再把useSSL设为false本地开发不需要加密。改完再点测试连接应该就能看到绿色对勾了。4.2 为什么localhost能连但填WSL的IP就连不上这个问题我见过很多人问。DataGrip填localhost能连填WSL的IP比如172.21.16.23就连不上超时或者拒绝连接。原因还是WSL2的NAT网络模型——从Windows路由不到WSL的内部IPWSL自己跟Windows之间有一个虚拟网卡但那个网卡的IP段对Windows主机的网络栈是不可路由的。简单说就是Windows通过WSL2的自动端口转发访问localhost时会偷摸帮包转到WSL但你直接指定它的内部IPWindows反而不知道往哪发。所以最佳实践就是一律填localhost。FinalShell里头其实也一样别去填WSL的IP除非你手动配置了端口转发规则否则填了也是白搭。4.3 DataGrip的常用操作与MySQL命令行的互补关系DataGrip连上之后左边数据库树会展示所有schema点开就能看到表、视图、存储过程、函数、触发器等对象。双击表可以看前500行数据右键表格可以生成各种SQL模板写SQL有自动补全和错误检查跑慢查询还能看执行计划。对我个人来说DataGrip最大的优势是写复杂查询和调存储过程的时候舒服太多在命令行里写错一个逗号就得整句重敲在IDE里随便改。再加上它支持SSH隧道以后连不上云服务器上的MySQL可以在连接配置里先建一个SSH隧道到跳板机再走内网连数据库跟WSL这套本地玩法完全是同一套逻辑。但DataGrip不是银弹。数据库管理员日常要做的事有很多在命令行里更高效比如查看数据库状态、配置读写分离、跑EXPLAIN ANALYZE这些都是DataGrip能看但不一定能顺手操作的。所以我个人的习惯是查询、开发、调试用DataGrip系统状态排查、服务启停、权限管理用FinalShell里的命令行。两套工具配合起来效率至少翻倍。5. 常用Linux命令与MySQL运维速查既然流程已经跑通了我再顺手把这段时间用得最多的几个Linux命令和MySQL运维命令整理一下都跟前面的环境有关。这些命令不是拿来背的是让你在遇到问题时知道去哪里看、怎么排查。5.1 服务管理类命令WSL2默认没开systemd所以服务管理走的是service命令。要记住的就这么几个sudo service mysql start sudo service mysql stop sudo service mysql restart sudo service mysql status sudo service ssh start如果你真的想在WSL2里用systemd也可以做到。在Windows用户目录下新建一个.wslconfig文件WSL里编辑/etc/wsl.conf加上以下内容[boot] systemdtrue然后WSL里执行wsl --shutdown重新打开WSLsystemctl就能用了。但本地开发用service完全够反而更省内存。5.2 网络排查与端口确认命令# 查看MySQL监听状态 netstat -tlnp | grep 3306 # 查看SSH监听状态 netstat -tlnp | grep 22 # 查看所有监听端口 netstat -tlnp如果你发现3306端口对不上优先去看mysqld.cnf里的bind-address和mysqlx-bind-address。如果是22端口对不上优先进FinalShell或者Windows服务列表排查是不是被Windows自带SSH占了。5.3 MySQL基础运维命令# 进入命令行 mysql -udev -p # 查看所有数据库 SHOW DATABASES; # 切换数据库 USE mysql; # 查看所有用户及认证插件 SELECT user, host, plugin FROM mysql.user; # 查看某用户权限 SHOW GRANTS FOR dev%; # 刷新权限 FLUSH PRIVILEGES;6. 常见问题与排查技巧实录踩过的坑写出来才有价值我把这些天遇到过的高频问题按现象、原因、解决三列整理成一张速查表方便你出问题时照着查现象主要原因解决办法DataGrip报[08001] Public Key Retrieval is not allowedMySQL 8.0 caching_sha2_password需要客户端获取公钥JDBC默认不允许连接驱动属性里设allowPublicKeyRetrievaltrueFinalShell连接localhost:22用户名密码对但进错环境Windows自带OpenSSH服务占用了22端口停用Windows的OpenSSH Server服务再启动WSL里的sshWSL里的MySQL只能本机访问Windows连不上bind-address还是127.0.0.1或者只监听IPv6配置bind-address0.0.0.0同时设置mysqlx-bind-address0.0.0.0远程账号连接报Access denied for user devlocalhost账号只授权了localhost没有%或对应IP段用CREATE USER dev%重新建账号并授权sudo mysql -uroot能进普通用户进不去root用的是auth_socket插件只认系统root用户给root设密码并切换认证插件或另建远程用户WSL安装时一直卡住或wsl --install太慢下载WSL内核或镜像时网络受限手动勾选Windows功能下载WSL2内核包镜像源换成阿里云/清华源重启WSL之后FinalShell连不上WSL2的IP每次重启会变化但localhost映射是固定的FinalShell和DataGrip的主机地址都填localhost不要填动态IPUbuntu 24.04改了sources.list没反应新版apt换了配置文件路径去/etc/apt/sources.list.d/ubuntu.sources里改源这些坑里我个人觉得最隐蔽的就是IPv6监听那个因为报错信息非常误导人。你看到MySQL明明起来了netstat也显示3306在监听但Windows的localhost就是连不上。如果没经验可能会去查防火墙、查驱动、查账号权限折腾半天最后发现只是差一行mysqlx-bind-address。所以我把这条放在速查表里希望大家看到了就能直接绕过去。另外有一个经验要分享在WSL里装任何需要网络下载的软件第一反应先确认apt源是不是国内的。MySQL装不上、Python装不上跟系统配置半毛钱关系没有八成是源的问题。把源换成阿里云再跑一次sudo apt update世界瞬间清净。7. 结语与前路拓展文章写到这里核心的链路已经全部跑通了Windows装WSL2WSL2里跑UbuntuUbuntu里用apt装MySQL 8.0配置远程账号和监听地址FinalShell通过SSH连进子系统做命令行管理和文件传输DataGrip通过JDBC协议连接MySQL做SQL开发。整套环境跑下来既不占用双系统那样的大块磁盘也不需要虚拟机那样时刻拿内存来换真正做到了在Windows上无缝操作Linux里的MySQL。我个人做完这套环境后最大的体会是WSL的价值不在于替代生产Linux服务器而在于最大程度降低本地环境与生产环境不一致的焦虑。以前写个存储过程要先在Windows的MySQL里测一遍再扔到服务器上跑一遍经常出现本地好好的服务器就报错的尴尬。现在直接在WSL里开发调试命令、路径、权限模型都跟云服务器保持一致部署的时候就踏实多了。最后再分享一个小技巧FinalShell里可以添加端口转发把WSL里的3306转发到Windows的3306端口。按理说WSL2的localhost转发已经够用了但如果你同时起了多个WSL发行版比如Ubuntu和Debian并行端口映射会互相干扰这时手动在FinalShell里指定转发反而能精准控制哪个子系统对外提供服务。更进一步你还可以在WSL里跑Docker把MySQL装进容器再用同样的方式远程连接——思路是一样的只不过底层从系统服务换成了容器服务。到那一步你手里的这台Windows就真的是一台能随时在图形化开发与Linux运维之间来回横跳的生产力机器了。