要想让外部服务器(比如阿里云 ECS、腾讯云 CVM 或者其他 VPS)能连上宝塔面板里的 MySQL/MariaDB 数据库,核心就两步:放行端口 + 授权用户。
很多人卡在第一步或者第二步没做对。下面我把最稳妥、最常见的几种情况拆解一下,按顺序操作即可。
1. 基础准备:确认环境
首先,你得确定你用的是哪种数据库。宝塔默认装的是 MySQL 5.7 或 8.0,也有 MariaDB。
- MySQL 8.0+:认证插件改成了
caching_sha2_password,老版本的客户端(如某些旧版 Navicat、PHP 代码库)可能会报错Authentication plugin not supported。如果遇到这个问题,后面会讲怎么改回旧版兼容模式。 - 防火墙/安全组:这是最容易忽略的坑。宝塔有自己的“系统防火墙”,但云服务器厂商(阿里、腾讯、华为等)还有自己的“云防火墙/安全组”。只开宝塔防火墙没用,必须同时在云控制台开端口。
2. 具体操作步骤
第一步:修改数据库密码并开启远程访问权限(在宝塔面板内操作)
- 登录宝塔面板。
- 进入左侧菜单 【数据库】 -> 点击你要开放的数据库名旁边的 【管理】。
- 切换到 【权限】 选项卡。
- 你会看到“允许本地连接”和“允许远程连接”。
- 选择 “允许所有主机”(最简单粗暴,适合测试或非生产环境)。
- 或者选择 “指定IP”,填入你外部服务器的公网 IP(更安全,推荐生产环境用这个)。
- 点击 【保存】。
- 关键点:如果之前设置过密码,这里最好重新设置一个强密码,确保生效。
注意:如果你选的是“指定IP”,请确保你填的是外部服务器真实的公网 IP,而不是内网 IP。
第二步:配置宝塔系统防火墙
- 在宝塔面板左侧菜单,找到 【安全】。
- 查看端口列表中是否有
3306(MySQL 默认端口)或3307(MariaDB 默认端口)。 - 如果没有,点击 【添加规则】:
- 端口号:
3306 - 备注:
MySQL Remote - 来源:
0.0.0.0/0(表示允许所有 IP,或者你可以填特定 IP 段)
- 端口号:
- 点击 【放行】。
第三步:配置云服务器厂商的安全组(最重要的一步!)
这一步90%的人都会忘。假设你在阿里云:
- 登录阿里云控制台 -> ECS 实例 -> 找到你的服务器。
- 点击 【安全组】 -> 【配置规则】。
- 点击 【手动添加】 或 【快速创建规则】:
- 方向:入方向
- 协议类型:自定义 TCP
- 端口范围:
3306/3306 - 授权对象:
0.0.0.0/0(测试用)或 填写外部服务器的公网 IP - 优先级:1
- 点击确定。
腾讯云、华为云等操作类似,都是在控制台里找“安全组”或“网络ACL”,放行 TCP 3306 端口。
第四步:验证连接
使用外部服务器上的工具测试连接:
- Linux 命令行:
mysql -h <宝塔服务器公网IP> -P 3306 -u root -p - Windows Navicat/DBeaver:
新建连接,输入宝塔服务器的公网 IP、用户名(通常是 root)、密码,测试连接。
3. 常见问题排查(踩坑指南)
Q1: 连接超时 (Connection Timed Out)
- 原因:防火墙没开,或者云安全组没开。
- 解决:检查宝塔【安全】面板是否放行了 3306;检查云控制台【安全组】是否放行了 3306。两个都要开!
Q2: Access denied for user ‘root’@’xxx’ (Access Denied)
- 原因:密码错误,或者你在宝塔里没给该用户授权远程访问。
- 解决:回到宝塔【数据库】->【权限】,确认是否选择了“允许所有主机”或添加了正确的外部 IP。
Q3: Authentication plugin ‘caching_sha2_password’ cannot be loaded (MySQL 8.0 特有)
- 原因:MySQL 8.0 默认用了新的加密方式,老客户端不支持。
- 解决:
- 在宝塔【数据库】->【管理】->【SQL 语句】中执行以下命令(将
your_password替换为你的实际密码):ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 或者,在宝塔【软件商店】卸载当前 MySQL,重装时选择兼容模式(部分版本支持),或者直接接受新协议,升级你的客户端工具(如新版 Navicat、JDBC 驱动等)。
- 在宝塔【数据库】->【管理】->【SQL 语句】中执行以下命令(将
Q4: 为什么我改了权限还是连不上?
- 检查宝塔面板的【终端】里,直接
telnet <宝塔服务器公网IP> 3306看通不通。如果都不通,肯定是网络层问题(防火墙/安全组)。 - 检查宝塔的
/etc/my.cnf文件,看看有没有bind-address = 127.0.0.1。如果有,注释掉它,然后重启 MySQL 服务。不过宝塔通常会自动处理这个,一般不需要手动改。
4. 安全建议(重要!)
虽然上面说了“允许所有主机”,但在生产环境中,强烈不建议这样做。
- 最佳实践:在宝塔【数据库】->【权限】中,选择 “指定IP”,只填入你需要连接的几台外部服务器的公网 IP。
- 额外加固:如果可能,使用 SSH 隧道来连接数据库,而不是直接暴露 3306 端口到公网。这样即使端口被扫描,也无法直接连接。
总结:宝塔面板设权限 + 宝塔防火墙放行 + 云安全组放行 = 成功连接。 三者缺一不可。
云技术博客