搞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里配了systemd=true),很多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_password(MySQL 8.0默认插件):
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的密码'; FLUSH PRIVILEGES;然后是重点,创建一个允许从任意主机连接的账号,因为DataGrip从Windows过来时,IP是Windows的局域网地址,不是localhost:
CREATE USER 'dev'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'dev'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;这里%表示不限制来源IP。细心的读者可能会问:如果只想让固定IP连接,是不是就该写'dev'@'192.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改完重启MySQL,netstat里能看到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。
这时候有一堆字段要填,我一个个说:
- Host:localhost
- Port:3306
- User:dev(或者你创建的任何远程账号)
- Password:对应用户的密码
- Database:这里可以先不填,连上之后再选
填完后,DataGrip会自动检测驱动并且下载。这里注意,如果第一次连接报错[08001] Public Key Retrieval is not allowed,这是MySQL 8.0默认认证插件caching_sha2_password和JDBC驱动之间的一种机制限制:客户端想连接,但服务器要求客户端先取公钥,而JDBC默认不允许自动获取公钥。解决办法很简单,在DataGrip连接URL的高级参数里添加allowPublicKeyRetrieval=true,或者切换到"驱动属性"标签页,把allowPublicKeyRetrieval的值改为true,再把useSSL设为false(本地开发不需要加密)。改完再点"测试连接",应该就能看到绿色对勾了。
4.2 为什么localhost能连,但填WSL的IP就连不上?
这个问题我见过很多人问。DataGrip填localhost能连,填WSL的IP(比如172.21.16.23)就连不上,超时或者拒绝连接。原因还是WSL2的NAT网络模型——从Windows路由不到WSL的内部IP,WSL自己跟Windows之间有一个虚拟网卡,但那个网卡的IP段对Windows主机的网络栈是不可路由的。简单说就是:Windows通过WSL2的自动端口转发访问localhost时会偷摸帮包转到WSL,但你直接指定它的内部IP,Windows反而不知道往哪发。所以最佳实践就是一律填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] systemd=true然后WSL里执行wsl --shutdown,重新打开WSL,systemctl就能用了。但本地开发用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 allowed | MySQL 8.0 caching_sha2_password需要客户端获取公钥,JDBC默认不允许 | 连接驱动属性里设allowPublicKeyRetrieval=true |
| FinalShell连接localhost:22,用户名密码对但进错环境 | Windows自带OpenSSH服务占用了22端口 | 停用Windows的OpenSSH Server服务,再启动WSL里的ssh |
| WSL里的MySQL只能本机访问,Windows连不上 | bind-address还是127.0.0.1,或者只监听IPv6 | 配置bind-address=0.0.0.0,同时设置mysqlx-bind-address=0.0.0.0 |
远程账号连接报Access denied for user 'dev'@'localhost' | 账号只授权了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,不要填动态IP |
| Ubuntu 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装WSL2,WSL2里跑Ubuntu,Ubuntu里用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运维之间来回横跳的生产力机器了。