在 Windows 系统上配置 MySQL 远程访问并结合花生壳实现外网穿透,主要分为三个核心步骤:MySQL 本地权限配置 、Windows 防火墙设置 、花生壳内网映射配置。
以下是详细的操作指南:
第一步:配置 MySQL 允许远程连接
MySQL 默认仅允许本地(localhost)连接,需要修改配置文件并创建允许远程访问的用户。
1. 修改 MySQL 配置文件 (my.ini)
- 找到配置文件 :
- 通常位于
C:\ProgramData\MySQL\MySQL Server X.X\my.ini(注意ProgramData是隐藏文件夹,需开启"显示隐藏文件")。 - 如果是解压版安装,可能在安装目录下的 `my.ini。
- 通常位于
- 修改绑定地址 :
- 用记事本或代码编辑器打开
my.ini。 - 找到
[mysqld]部分。 - 查找
bind-address行。如果存在且值为127.0.0.1,将其修改为0.0.0.0;如果不存在,则添加一行bind-address = 0.0.0.0。 - 注:
0.0.0.0表示允许所有 IP 地址连接。出于安全考虑,生产环境建议限制特定 IP,但配合花生壳使用时通常设为全开放或由花生壳控制访问。
- 用记事本或代码编辑器打开
- 重启 MySQL 服务 :
- 按
Win + R,输入services.msc回车。 - 找到
MySQL服务(名称可能为MySQL80等),右键点击选择"重新启动"。
- 按
2. 创建远程访问用户并授权
-
登录 MySQL :
- 以管理员身份打开 CMD 或 PowerShell。
- 输入命令:
mysql -u root -p,然后输入密码登录。
-
创建用户并授权 :
-
执行以下 SQL 命令(将
remote_user和P@ssw0rd替换为你想要的用户名和密码):-- 创建用户,'%' 表示允许任意 IP 连接
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'P@ssw0rd';-- 授予所有权限(可根据需求缩小权限范围,如只给 SELECT, INSERT)
GRANT ALL PRIVILEGES ON . TO 'remote_user'@'%' WITH GRANT OPTION;-- 刷新权限使设置生效
FLUSH PRIVILEGES;
sql
-- 创建用户,'%' 表示允许任意 IP 连接 CREATE USER 'remote_user'@'%' IDENTIFIED BY 'P@ssw0rd'; -- 授予所有权限(可根据需求缩小权限范围,如只给 SELECT, INSERT) GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 刷新权限使设置生效 FLUSH PRIVILEGES;- 注意:如果是 MySQL 8.0+ 版本,确保用户的加密插件兼容客户端。如果遇到连接报错,可尝试执行:
ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';
-
第二步:配置 Windows 防火墙
即使 MySQL 配置正确,Windows 防火墙也可能阻止外部连接。
- 打开"控制面板" -> "Windows Defender 防火墙" -> "高级设置"。
- 点击左侧的"入站规则",然后点击右侧的"新建规则"。
- 选择"端口",点击"下一步"。
- 选择"TCP",特定本地端口输入
3306(MySQL 默认端口),点击"下一步"。 - 选择"允许连接",点击"下一步"。
- 勾选所有配置文件(域、专用、公用),点击"下一步"。
- 名称填写"MySQL Remote Access",点击"完成"。
验证方法:在局域网内的另一台电脑上,使用 telnet <本机内网IP> 3306 测试是否连通,或使用 Navicat 等工具通过内网 IP 连接测试。
第三步:配置花生壳内网映射
当本地局域网访问正常后,通过花生壳将内网服务映射到外网。
1. 安装与登录
- 前往贝锐花生壳官网下载 Windows 客户端。
- 注册账号并登录客户端。
- 确保客户端状态显示为"在线"。
2. 添加内网映射
- 在花生壳客户端主界面,点击右下角的 **"+"** 号或 **"内网穿透"** -> **"添加映射"**。
- 填写映射参数 :
- 应用名称 :自定义,如
MyMySQL。 - 映射类型 :选择 TCP(数据库连接通常使用 TCP 协议)。
- 外网域名 :系统会自动分配一个免费域名(如
xxx.oray.net),也可使用自己购买的域名。 - 外网端口:系统随机分配或自定义(若使用免费版,通常为动态端口;若购买服务可使用固定端口)。
- 内网主机 :填写运行 MySQL 的 Windows 电脑的局域网 IP 地址 (可通过 CMD 输入
ipconfig查看 IPv4 地址,例如192.168.1.100)。- 建议:在路由器中为该电脑设置静态 IP 或 MAC 地址绑定,防止内网 IP 变更导致映射失效。
- 内网端口 :填写 MySQL 的服务端口,默认为
3306。
- 应用名称 :自定义,如
- 点击"确定"保存。


4. 获取外网访问地址
保存成功后,花生壳会生成一个外网访问地址,格式通常为:域名:端口(例如 abc123.oray.net:35678)。
第四步:远程连接测试
在外部网络(如手机 4G/5G 或其他非局域网电脑)上,使用数据库管理工具(如 Navicat、DBeaver、MySQL Workbench)进行连接:
- 主机/Host :填入花生壳生成的外网域名 (如
abc123.oray.net)。 - 端口/Port :填入花生壳分配的外网端口 (如
35678,注意不是 3306)。 - 用户名/Username :第一步中创建的
remote_user。 - 密码/Password :对应的密码
P@ssw0rd。
常见问题与排查
-
**连接超时 (Connection Timed Out)**:
- 检查花生壳客户端是否正常运行且在线。
- 检查 Windows 防火墙是否放行了 3306 端口。
- 确认内网主机 IP 是否正确,且该 IP 在局域网内未发生变化。
- 尝试在内网其他机器 telnet 内网 IP 3306,确保 MySQL 服务本身正常。
-
**拒绝访问 (Access Denied)**:
- 检查 MySQL 用户权限是否正确授予(
GRANT语句是否执行成功)。 - 检查用户名和密码是否输入正确。
- 确认 MySQL 用户的主机限制是否为
%或包含你的来源 IP。
- 检查 MySQL 用户权限是否正确授予(
-
SSL 连接错误:
- 如果客户端强制要求 SSL 而服务器未配置,可能会报错。可在连接设置中取消"使用 SSL"选项,或在 MySQL 中执行
ALTER USER 'remote_user'@'%' REQUIRE NONE;禁用该用户的 SSL 强制要求。
- 如果客户端强制要求 SSL 而服务器未配置,可能会报错。可在连接设置中取消"使用 SSL"选项,或在 MySQL 中执行
安全建议
- 强密码策略:务必为远程访问用户设置高强度密码。
- 最小权限原则 :如果不是必须,不要授予
ALL PRIVILEGES,仅授予业务需要的权限(如SELECT,INSERT)。 - 定期更换密码:建议定期更新数据库用户密码。
- 监控日志:定期检查 MySQL 错误日志和花生壳访问日志,发现异常连接及时阻断。
永久解决权限问题
- 修改文件所有者
- 右键
my.ini文件,选择「属性」-「安全」-「高级」。 - 点击「所有者」选项卡的「更改」,输入当前用户名或
Administrators,点击「检查名称」确认后保存。
- 右键
- 添加用户编辑权限
- 在「安全」选项卡点击「编辑」,选择当前用户,勾选「完全控制」「修改」「写入」权限,点击「确定」。
- 修改文件夹权限
- 右键
C:\ProgramData\MySQL\MySQL Server 8.0文件夹,选择「属性」-「安全」-「编辑」,给当前用户添加「完全控制」权限。
- 右键
注意事项
- 编辑
my.ini前建议备份原文件,避免配置错误导致MySQL服务无法启动。 - 若修改权限后仍无法编辑,可尝试重启电脑后再操作。
第四步:远程连接测试,1130-主机'DESKTOP-B9UQM45'不允许连接到此MySQL服务器

出现 ERROR 1130 (HY000): Host 'DESKTOP-B9UQM45' is not allowed to connect to this MySQL server 错误,说明网络连通性已经建立 (即防火墙和花生壳映射已生效,TCP连接成功),但 MySQL 数据库层面的权限验证失败。
这是因为 MySQL 默认的安全策略限制用户只能从特定主机(如 localhost)登录,而您当前的远程客户端主机名或 IP 未被授权。
请按照以下步骤在 Windows 服务器端 修复此问题:
核心解决方案:修改 MySQL 用户权限
你需要登录到安装 MySQL 的 Windows 电脑本地,执行 SQL 命令来允许远程连接。
1. 本地登录 MySQL
在 Windows 服务器上打开 CMD(命令提示符)或 PowerShell,输入以下命令登录 MySQL:
bash
mysql -u root -p
输入你的 root 密码并回车。
2. 执行授权命令
根据你的 MySQL 版本,选择以下一种方式执行。建议创建一个专用的远程用户,或者修改现有用户的 host 属性。
方式 A:创建一个新的远程专用用户(推荐,更安全)
将 remote_user 替换为你想要的用户名,YourStrongPassword 替换为强密码。
sql
-- 1. 创建用户,'%' 表示允许从任何 IP 地址连接
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'YourStrongPassword';
-- 2. 授予该用户所有数据库的所有权限(可根据需求缩小范围,如只给某个库权限)
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 3. 刷新权限,使设置立即生效
FLUSH PRIVILEGES;
sql
-- 1. 创建用户,'%' 表示允许从任何 IP 地址连接 CREATE USER 'remote_user'@'%' IDENTIFIED BY 'YourStrongPassword'; -- 2. 授予该用户所有数据库的所有权限(可根据需求缩小范围,如只给某个库权限) GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 3. 刷新权限,使设置立即生效 FLUSH PRIVILEGES;
方式 B:修改现有 root 用户允许远程连接(方便但不推荐用于生产环境)
如果你坚持使用 root 用户进行远程测试:
sql
-- 1. 切换到 mysql 系统库
USE mysql;
-- 2. 将 root 用户的 host 从 'localhost' 修改为 '%' (允许任意IP)
UPDATE user SET host = '%' WHERE user = 'root';
-- 3. 刷新权限
FLUSH PRIVILEGES;
sql
-- 1. 切换到 mysql 系统库 USE mysql; -- 2. 将 root 用户的 host 从 'localhost' 修改为 '%' (允许任意IP) UPDATE user SET host = '%' WHERE user = 'root'; -- 3. 刷新权限 FLUSH PRIVILEGES;
3. 针对 MySQL 8.0+ 的额外检查(重要)
如果你使用的是 MySQL 8.0 或更高版本,默认的认证插件是 caching_sha2_password,某些旧版客户端(如旧版 Navicat、PyCharm 驱动等)可能不支持,导致连接报错。如果上述步骤后仍无法连接或报认证错误,请执行:

sql
-- 将认证方式修改为兼容性更好的 mysql_native_password ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword'; FLUSH PRIVILEGES;
(如果是修改 root 用户,则将 'remote_user'@'%' 替换为 'root'@'%')
排查与验证
完成上述 SQL 操作后,无需重启 MySQL 服务,直接在外网客户端进行测试。
1. 验证权限是否生效
在服务器本地 MySQL 中执行:
sql
SELECT user, host FROM mysql.user;
确保你使用的用户对应的 host 列包含 % 或你具体的外网 IP。
2. 再次尝试远程连接
在你的远程电脑(即报错的那台 DESKTOP-B9UQM45)上,使用数据库工具(Navicat, DBeaver, Workbench 等)重新连接:
- 主机/Host : 花生壳生成的域名(如
xxx.oray.net) - 端口/Port : 花生壳映射的外网端口(注意:不是 3306,而是花生壳分配的那个端口,如 35678)
- 用户名 : 你在 SQL 中创建的用户(如
remote_user) - 密码: 对应的密码
常见误区提醒
-
**不要混淆"连不上"和"不让进"**:
- 如果报错是
Connection Timed Out,那是防火墙或花生壳映射问题。 - 如果报错是
1130 Host is not allowed,说明网络是通的 ,纯粹是 MySQL 账号权限问题,只需按上述步骤修改 SQL 权限即可,不需要再去动防火墙或花生壳设置。
- 如果报错是
-
Host 匹配机制 :
MySQL 的权限是基于
User+Host组合的。'root'@'localhost'和'root'@'%'是两个不同的账户条目。当你从外网连接时,MySQL 寻找的是'root'@'你的外网IP'或'root'@'%'。如果只有'root'@'localhost',就会报 1130 错误。 -
安全性建议 :
使用
'%'允许所有 IP 连接存在安全风险。如果可能,建议在花生壳控制台查看你的外网出口 IP,然后在 MySQL 中将'%'替换为具体的 IP 地址,例如:sql
CREATE USER 'remote_user'@'203.0.113.5' IDENTIFIED BY 'YourStrongPassword'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'203.0.113.5'; FLUSH PRIVILEGES;这样只有该特定 IP 才能连接,更加安全。
1.在Windows开始搜索输入Mysql,并选择第一个打开。

2.输入安装时的密码。

要授予用户所有数据库的所有权限,需要在 MySQL 命令行中执行 GRANT 语句。以下是具体操作步骤和命令:
1. 登录 MySQL
首先以 root 或具有管理员权限的用户登录 MySQL:
bash
mysql -u root -p
2. 执行授权命令
根据您的需求,选择以下其中一种方式执行 SQL 命令:
方案 A:授予所有数据库的所有权限(全局权限)
如果您希望该用户可以访问服务器上的每一个 数据库并拥有完全控制权(类似 root 用户),请使用 *.* 表示所有数据库和所有表。
-- 将 'remote_user' 替换为您的用户名,'%' 表示允许从任何主机连接
GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION;
-- 刷新权限使设置立即生效
FLUSH PRIVILEGES;
sql
-- 将 'remote_user' 替换为您的用户名,'%' 表示允许从任何主机连接 GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; -- 刷新权限使设置立即生效 FLUSH PRIVILEGES;
- 注意 :
WITH GRANT OPTION允许该用户将自己的权限授予其他用户。如果不需要此功能,可以省略该部分。 - 安全警告 :赋予
*.*的全局权限风险较高,仅建议在测试环境或确需超级管理员权限时使用。
方案 B:仅授予特定数据库的所有权限(推荐)
如果您只想让用户管理某一个 特定的数据库(例如 my_database),请将 *.* 替换为 数据库名.*。
-- 将 'my_database' 替换为实际的数据库名称
GRANT ALL PRIVILEGES ON my_database.* TO 'remote_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
sql
-- 将 'my_database' 替换为实际的数据库名称 GRANT ALL PRIVILEGES ON my_database.* TO 'remote_user'@'%'; -- 刷新权限 FLUSH PRIVILEGES;
- 这种方式遵循"最小权限原则",更加安全。用户只能操作指定的数据库,无法查看或修改其他数据库。
3. 验证权限
执行完上述命令后,您可以使用以下命令检查权限是否已正确授予:
sql
SHOW GRANTS FOR 'remote_user'@'%';
关键参数说明
- **
ALL PRIVILEGES** :代表除GRANT OPTION外的所有权限(包括 SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER 等)。 - **
ON *.*** :第一个*代表所有数据库,第二个*代表所有表。若改为db_name.*则仅限指定数据库。 - **
'remote_user'@'%'** :'remote_user':用户名。'%':主机地址,%通配符表示允许从任何 IP 地址连接。若为了安全,可将其替换为具体的 IP 地址(如'192.168.1.100')。
- **
FLUSH PRIVILEGES**:强制 MySQL 重新加载权限表,确保刚才的更改立即生效,无需重启服务。
常见问题排查
如果执行后仍然报错 1130 Host is not allowed,请确认:
- 您修改的是正确的用户和主机组合(即
'remote_user'@'%'而不是'remote_user'@'localhost')。 - 已经成功执行了
FLUSH PRIVILEGES。 - 如果是 MySQL 8.0+,确保用户认证插件兼容(如使用
mysql_native_password)。