当前位置: 首页 > news >正文

如何在VS code里使用SQLtool连接上WSL上的MySQL服务

流程

先理解这个流程,才能更好地发现问题。
当你使用VS Code的SQLTools工具连接到WSL(Windows Subsystem for Linux)上的MySQL服务器时,中间涉及到以下多个环节和流程:

1. 用户在SQLTools中输入连接信息

在VS Code的SQLTools插件界面,你需要填写一系列连接相关的参数,例如:

  • Connection name:连接的名称,用于标识该连接,方便你在多个连接中区分和管理。
  • Server Address:填写WSL中Ubuntu系统的IP地址,这是SQLTools定位MySQL服务器所在位置的关键信息。
  • Port:MySQL服务默认使用的端口号,一般为3306(如果在WSL中的MySQL服务器修改了默认端口,需要填写实际的端口号)。
  • Database:指定要连接的默认数据库,若不填,后续连接成功后可手动选择。(提前在Linux上的mysql里输入show databases来查看有哪些数据库)
  • UsernamePassword:用于MySQL服务器验证你身份的用户名和密码,只有验证通过才能建立连接。
  • Authentication Protocol:选择认证协议,MySQL 8.0及以上版本默认使用 caching_sha2_password ,如果连接有问题,可以尝试其他协议如 mysql_native_password

2. SQLTools处理和验证连接信息

  • 格式验证:SQLTools会检查你输入的各项信息格式是否正确,例如IP地址格式是否合规、端口号是否在有效范围内等。
  • 必填项检查:确保所有必填的连接参数都已填写,否则会提示你补充完整才能进行下一步连接操作。

3. 建立网络连接

  • 解析IP地址:SQLTools获取你填写的WSL中Ubuntu的IP地址,通过操作系统的网络功能将其解析为对应的网络地址,以便进行后续的网络通信。
  • 发起TCP连接:SQLTools基于你填写的端口号(通常是3306),使用TCP协议向该IP地址对应的端口发起连接请求。这一步就像在现实中尝试拨通一个电话号码,建立起与MySQL服务器通信的“线路”。

4. MySQL服务器响应连接请求

  • 监听端口:WSL中的MySQL服务器会持续监听指定的端口(如3306),等待客户端的连接请求。
  • 接受或拒绝连接
    • 接受连接:如果网络连接正常,MySQL服务器会接收到SQLTools发送的连接请求。然后,它会根据你提供的用户名和密码,结合自身存储的用户权限信息(存储在mysql.user等系统表中)进行身份验证。如果用户名和密码正确,并且该用户拥有连接和访问相关数据库的权限,MySQL服务器会接受连接,并与SQLTools建立起通信会话。
    • 拒绝连接:若用户名或密码错误,或者用户权限不足(例如没有从该IP地址连接的权限),MySQL服务器会拒绝连接,并向SQLTools返回错误信息,告知连接失败的原因。

5. 认证协议处理(如果需要)

  • 协商协议:如果在连接设置中指定了特定的认证协议,SQLTools和MySQL服务器会按照该协议进行身份验证的交互。例如,对于caching_sha2_password协议,会涉及到加密、解密等一系列操作来验证密码的正确性;如果是mysql_native_password协议,则使用相对简单的加密方式进行验证。
  • 协议不兼容处理:如果SQLTools不支持MySQL服务器使用的默认认证协议,就可能导致连接失败。此时你可以在SQLTools的连接设置中更改认证协议,或者在MySQL服务器端修改用户的认证方式,以保证双方能够正常完成认证过程。

6. 连接成功后的操作

  • 建立会话:当身份验证通过后,SQLTools和MySQL服务器之间建立起一个有效的会话,就像两个人成功接通电话并可以正常交流。
  • 执行查询和管理操作:此时,你就可以在VS Code的SQLTools界面中编写SQL语句,发送给MySQL服务器执行,例如查询数据库中的数据、创建或修改表结构、插入或更新数据等。MySQL服务器执行完操作后,会将结果返回给SQLTools,SQLTools再将结果展示在VS Code的相关界面中,方便你查看和处理。

7. 连接关闭

当你在VS Code中手动关闭连接,或者连接因为网络故障、超时等原因中断时,SQLTools会与MySQL服务器终止会话,释放相关的网络资源和数据库连接资源,结束这次连接过程。

可能会遇到的问题

使用VS Code的SQLTools工具连接WSL上的MySQL服务器失败,可能是由网络、MySQL服务器配置、用户权限、认证协议以及SQLTools自身设置等多方面原因导致的,以下是详细分析:

网络相关原因

  1. MySQL服务未启动:在WSL的Ubuntu系统中,MySQL服务可能没有正常启动。你可以通过在Ubuntu终端运行sudo systemctl status mysql 查看服务状态。如果服务未运行,使用sudo systemctl start mysql 启动服务,之后再尝试连接。
  2. IP地址错误:填写到SQLTools中的WSL的Ubuntu IP地址有误。你可以在Ubuntu终端使用ip addr show eth0hostname -I 重新确认IP地址,并在SQLTools中修改为正确的地址。
  3. 端口被占用或错误
    • 端口被占用:MySQL默认端口3306可能被其他程序占用,导致MySQL服务无法正常监听该端口。可以在Ubuntu终端使用sudo netstat -tuln | grep 3306 查看端口占用情况。如果被占用,需要停止占用程序,或者修改MySQL的监听端口。
    • 端口填写错误:在SQLTools中填写的端口号与MySQL实际监听的端口不一致,仔细核对端口号是否正确。
  4. 防火墙拦截
    • Ubuntu防火墙:Ubuntu的防火墙(如ufw)可能拦截了外部对MySQL端口的访问。可以尝试临时关闭防火墙(仅用于测试,生产环境需谨慎),运行sudo ufw disable ,若关闭后能连接成功,需配置防火墙规则允许3306端口的流量,如sudo ufw allow 3306/tcp
    • Windows防火墙:WSL运行在Windows环境下,Windows防火墙也可能拦截连接。可以临时关闭Windows防火墙测试连接(仅用于测试),或者在Windows防火墙中添加允许3306端口的入站规则 。
  5. 网络连接问题:WSL与Windows主机之间的网络通信出现故障,或者网络不稳定。你可以尝试重启WSL(在Windows命令提示符中运行wsl --shutdown ,然后重新打开WSL),或者检查网络连接是否正常。

MySQL服务器配置相关原因

  1. 绑定地址设置:MySQL配置文件(通常是/etc/mysql/mysql.conf.d/mysqld.cnf/etc/mysql/my.cnf )中的bind-address 可能被设置为只允许本地连接(如127.0.0.1 ),导致无法从外部通过WSL的IP连接。你可以修改该配置为0.0.0.0 (允许所有IP连接,生产环境建议指定具体IP )或WSL的Ubuntu IP地址,修改后重启MySQL服务(sudo systemctl restart mysql )。
  2. 配置文件错误:MySQL的配置文件中可能存在其他错误配置,导致MySQL服务运行异常,无法正常接受连接。可以查看MySQL的错误日志(路径一般为/var/log/mysql/error.log ),根据日志提示排查和修复配置问题。

用户权限相关原因

  1. 用户名或密码错误:在SQLTools中填写的用户名或密码不正确。可以在Ubuntu终端使用mysql -u [用户名] -p ,输入密码测试能否登录MySQL。如果无法登录,需要重置密码 。
  2. 用户host权限不足:MySQL中用户的host 权限设置限制了从特定IP地址连接。进入MySQL命令行(mysql -u root -p 登录 ),执行SELECT user, host FROM mysql.user WHERE user = [用户名]; 查看允许连接的主机。如果没有% 或WSL的Ubuntu IP地址,需要授权,例如运行GRANT ALL PRIVILEGES ON *.* TO '[用户名]'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; (将[用户名] 替换为实际用户名 )。

认证协议相关原因

  1. 认证协议不兼容:MySQL 8.0及以上版本默认使用caching_sha2_password 认证协议,若SQLTools不支持该协议,会导致连接失败。可以在SQLTools的连接设置中将Authentication Protocoldefault 改为mysql_native_password ,或者在MySQL中修改用户的认证方式为mysql_native_password ,如ALTER USER '[用户名]'@'localhost' IDENTIFIED WITH mysql_native_password BY '[密码]'; FLUSH PRIVILEGES; (将[用户名][密码] 替换为实际信息 )。

SQLTools自身设置相关原因

  1. 连接设置错误:在SQLTools中填写的连接信息(如数据库名称填写错误)可能不符合实际情况,仔细检查各项连接参数是否正确。
  2. 插件问题:SQLTools插件本身存在故障或版本不兼容。可以尝试重新安装SQLTools插件,或者更新到最新版本 。

个人遇到的情况

在这里插入图片描述
下面是我问AI给我提供的解决方案
有几点要注意的:

  • 编辑mysql的配置文件时一定要使用sudo,管理员权限
  • 改完配置后重启MySQL服务

你提供的是 MySQL 配置文件(通常是 /etc/mysql/mysql.conf.d/mysqld.cnf 这类文件)的内容,以下逐行解释关键配置项的含义:

1. 基础身份与进程配置

18 user      = mysql
  • 作用:指定运行 MySQL 服务的系统用户为 mysql
  • 原因:MySQL 以独立用户运行(而非 root),可降低权限风险,避免因服务漏洞导致系统被完全控制。

2. 进程与通信文件

19 # pid-file  = /var/run/mysqld/mysqld.pid
20 # socket    = /var/run/mysqld/mysqld.socket
  • pid-file
    • 注释状态(# 开头),表示未启用。若启用,MySQL 会将进程 ID(PID)写入该文件,用于系统管理(如 systemctl 控制服务)。
  • socket
    • 注释状态,表示未启用。若启用,本地客户端(如 mysql 命令行)会通过该 Unix 套接字文件通信,比 TCP/IP 更快(但仅适用于本地连接)。

3. 网络与端口

21 # port      = 3306
31 bind-address        = 127.0.0.1
32 mysqlx-bind-address = 127.0.0.1
  • port
    • 注释状态,默认值为 3306(MySQL 经典端口)。若启用,MySQL 会监听该 TCP 端口,允许远程连接。
  • bind-address
    • 设置 MySQL 监听的 IP 地址为 127.0.0.1(仅本地回环)。这意味着仅允许本机连接,外部(包括 WSL 宿主机、其他机器)无法访问。
    • 若要允许远程连接(如 VS Code 从 Windows 连接 WSL 的 MySQL),需改为 0.0.0.0(监听所有 IP)或具体的 WSL IP(如 172.31.98.86)。
  • mysqlx-bind-address
    • MySQL 8.0 新增的 X Protocol 端口(默认 33060),用于 MySQL Shell、Document Store 等功能,同样限制为本地连接。

4. 数据存储

22 # datadir   = /var/lib/mysql
  • 作用:指定 MySQL 数据文件的存储目录(如表数据、索引、日志)。
  • 注释状态:未启用时,MySQL 会用默认路径(通常也是 /var/lib/mysql)。

5. 临时目录

27 # tmpdir        = /tmp
  • 作用:指定 MySQL 存储临时文件的目录(如排序、分组操作的临时表)。
  • 注释状态:未启用时,使用系统默认的临时目录(通常是 /tmp)。

6. 连接安全说明

29 # Instead of skip-networking the default is now to listen only on
30 # localhost which is more compatible and is not less secure.
  • 解释
    • MySQL 旧版用 skip-networking 关闭网络监听,新版默认改为 bind-address = 127.0.0.1,仅监听本地。
    • 这样更兼容(本地客户端无需配置网络),且更安全(默认拒绝远程连接,需显式开放)。

7. 性能调优(示例)

35 # key_buffer_size     = 16M
36 # max_allowed_packet  = 64M
37 # thread_stack        = 256K
  • key_buffer_size:MyISAM 引擎的索引缓存大小(InnoDB 用 innodb_buffer_pool_size),注释状态表示未自定义,用默认值。
  • max_allowed_packet:允许的最大数据包大小(影响大查询、大字段传输),默认 64M
  • thread_stack:每个线程的栈大小,影响复杂查询的内存使用。

关键问题:远程连接失败的核心原因

你的配置中 bind-address = 127.0.0.1 是导致 VS Code 无法连接的直接原因!

解决方法(允许远程连接):
  1. 编辑配置文件,修改 bind-address
    bind-address = 0.0.0.0  # 监听所有IP,或指定具体WSL IP(如172.31.98.86)
    
  2. 重启 MySQL 服务:
    sudo systemctl restart mysql
    
  3. 确保防火墙允许 3306 端口(或自定义端口)。

总结

  • 配置文件的核心作用是限制 MySQL 仅本地访问,需修改 bind-address 才能允许远程连接。
  • 其他配置(如 portsocket)可根据需求启用,性能调优项需结合实际业务场景调整。

修改后,再配合正确的用户权限、密码,即可解决 VS Code 连接被拒绝的问题。

补充

仅仅修改ip地址还不够,还要往Windows的防火墙添加白名单。
无论是Windows防火墙还是Ubuntu系统中的防火墙(常见的是UFW,即Uncomplicated Firewall ),都支持设置白名单,允许特定IP地址或IP地址段访问指定端口,以下是具体设置方法:

Windows防火墙设置白名单

  1. 打开高级安全Windows防火墙
    • 按下 Win + R 组合键,打开“运行”对话框,输入 wf.msc 并回车,即可打开“高级安全Windows防火墙”窗口。
  2. 创建入站规则
    • 在左侧导航栏中,点击“入站规则”,然后在右侧点击“新建规则”。
    • 在弹出的“新建入站规则向导”中,选择“端口”,点击“下一步”。
    • 选择“TCP”,并在“特定本地端口”中输入MySQL使用的端口号,通常是 3306 ,点击“下一步”。
    • 选择“允许连接”,点击“下一步”。
  3. 设置作用域
    • 在“作用域”页面,“此规则应用于所有IP地址”保持默认即可(代表所有访问该端口的请求)。
    • 若只想允许特定IP地址或IP地址段访问,可以在“远程IP地址”处,选择“下列IP地址”,然后点击“添加”,输入你想要设置为白名单的IP地址或IP地址段。比如,如果你想允许 172.xx.xx.xx(自己所查到的ip地址) 这个IP地址访问,可以输入该IP地址;如果是一个IP地址段,例如 172.31.90.0/24 (表示 172.31.90.0172.31.90.255 这个范围内的IP地址 )。
    • 点击“下一步”。
  4. 设置配置文件
    • 选择该规则适用的配置文件,默认情况下三个选项(域、专用、公用)都勾选即可,这表示在不同的网络环境下该规则都生效。
    • 点击“下一步”。
  5. 指定规则名称
    • 在“名称”框中,输入一个容易识别的名称,比如“MySQL白名单访问”,也可以在“描述”框中输入一些描述信息,方便后续管理。
    • 点击“完成”,这样就成功添加了允许特定IP访问MySQL端口的白名单规则。

Ubuntu防火墙(UFW)设置白名单

  1. 安装UFW(如果未安装)
    在Ubuntu终端中,执行以下命令检查UFW是否已安装:
sudo ufw status

如果提示未安装,可以使用以下命令安装:

sudo apt-get install ufw
  1. 启用UFW
    执行以下命令启用UFW:
sudo ufw enable
  1. 添加白名单规则
    要允许特定IP地址访问MySQL端口(默认为3306 ),执行以下命令:
sudo ufw allow from 172.xx.xx.xx to any port 3306

172.xx.xx.xx 替换为你想要设置为白名单的实际IP地址。如果要允许一个IP地址段访问,可以使用CIDR表示法,例如:

sudo ufw allow from 172.31.90.0/24 to any port 3306

这表示允许 172.31.90.0172.31.90.255 这个范围内的IP地址访问3306端口。
4. 查看规则状态
执行以下命令查看UFW规则状态:

sudo ufw status

确认添加的白名单规则已生效。

通过以上步骤,你可以在不关闭防火墙的情况下,设置白名单来允许特定IP地址或IP地址段访问MySQL服务器,从而解决连接超时问题。

http://www.lryc.cn/news/597099.html

相关文章:

  • 【软件系统架构】系列七:物联网云平台系统性能深入解析
  • 线性神经网络(深度学习-李沐-学习笔记)
  • 探索大语言模型(LLM):提升 RAG 性能的全方位优化策略
  • 我考PostgreSQL中级专家证书二三事
  • 论文略读:REMEDY: RECIPE MERGING DYNAMICS IN LARGE VISION-LANGUAGE MODELS
  • vue3笔记(2)自用
  • 微软2025教育AI报告:教育群体采用AI的比例显著提升
  • 技术速递|使用 Semantic Kernel 与 A2A 协议构建多智能体解决方案
  • Qt 样式表(QSS):打造个性化界面
  • 【前端】【Vue DevTools】Vue DevTools 进阶:用 Trae / Cursor 替换 VSCode 打开文件(跳转行列无误)
  • 论文略读:Knowledge is a Region in Weight Space for Finetuned Language Models
  • iOS上使用WebRTC推拉流的案例
  • 想曰加密工具好用吗?本地安全、支持多算法的加密方案详解
  • ZLMediaKit流媒体服务器WebRTC页面显示:使用docker部署
  • 基于Matlab传统图像处理技术的车辆车型识别与分类方法研究
  • 【第三章自定义检视面板_创建自定义编辑器_如何创建自定义PropertyDrawer(9/9)】
  • 第六章 W55MH32 UDP Multicast示例
  • 在离线 Ubuntu 22.04机器上运行 ddkj_portainer-cn 镜像 其他相关操作也可以复刻 docker
  • CCD工业相机系统设计——基于FPGA设计
  • 【后端】FastAPI的Pydantic 模型
  • 【Linux-云原生-笔记】keepalived相关
  • 蒙牛社交电商的升级路径研究:基于开源链动2+1模式、AI智能名片与S2B2C商城小程序源码的融合创新
  • 轻量化RTSP视频通路实践:采集即服务、播放即模块的工程解读
  • 【Redis】在Ubentu环境下安装Redis
  • RCE随笔-奇技淫巧(2)
  • 【Linux-云原生-笔记】Haproxy相关
  • ros0基础-day18
  • OCP NIC 3.0 Ethernet的multiroot complex和multi host complex的区别
  • Android多开实现方案深度分析
  • 【硬件】Fan in和Fan out