MySQL远程连接需四步:改用户权限为%、放行宝塔防火墙3306端口、云服务器安全组同步放行、修改my.cnf中bind-address为0.0.0.0并重启服务;若仍失败,检查认证插件兼容性。

MySQL 用户权限没开远程,连都连不上
默认安装的 MySQL(包括宝塔面板里的一键部署)只允许 localhost 或 127.0.0.1 本地连接,外部 IP 尝试连接会直接报错:Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server。这不是防火墙问题,是 MySQL 自身权限控制在拦你。
必须先改用户权限,再放端口,顺序不能反:
- 用宝塔进入「数据库」→ 找到对应数据库 → 点「root」或你的目标用户 → 「修改权限」→ 把「访问权限」从
localhost改成%(代表任意主机) - 如果没看到这个选项,说明当前用户是通过命令行创建的,需手动执行 SQL:
GRANT ALL PRIVILEGES ON *.* TO 'your_user'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
- 注意:改完后要重启 MySQL 服务(宝塔界面点「重启」),否则权限不生效
宝塔自带防火墙默认拦 3306,得手动放行
即使 MySQL 允许远程连接了,宝塔的「安全」→ 「防火墙」默认会封掉所有非白名单端口,3306 就在黑名单里。不放行,TCP 连接根本发不到 MySQL 进程。
操作路径很直白:
- 宝塔左侧菜单点「安全」→「防火墙」→「放行端口」
- 输入
3306,协议选TCP,点「放行」 - 确认状态栏显示「已放行」,且没有重复添加(重复添加不会报错,但没必要)
- 如果服务器还套了云厂商(如阿里云、腾讯云),它们的安全组也得同步放行
3306,宝塔防火墙只是系统层,云平台是网络层
MySQL 配置文件绑定了 127.0.0.1,远程连不上
有些版本(尤其是宝塔 8.x 后集成的 MySQL 8.0+)默认在 /www/server/mysql/etc/my.cnf 里写了 bind-address = 127.0.0.1,这会让 MySQL 只监听本地回环,外部请求压根收不到。
必须改配置并重启:
- 用宝塔文件管理器打开
/www/server/mysql/etc/my.cnf - 搜索
bind-address,把它改成bind-address = 0.0.0.0(或直接删掉这一行,MySQL 默认监听所有地址) - 保存后回到宝塔「软件商店」→ 找到 MySQL →「重启」
- 验证是否生效:SSH 里执行
netstat -tlnp | grep :3306,看到0.0.0.0:3306或*:3306才算成功
连上了但被拒绝,检查是不是密码认证插件不兼容
MySQL 8.0 默认用 caching_sha2_password 插件,而很多旧客户端(比如某些 PHP 版本、Navicat 旧版)只支持 mysql_native_password,会报错:Client does not support authentication protocol requested by server。
临时解法(不推荐长期用 root):
- 登录 MySQL 命令行:
mysql -u root -p - 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 再
FLUSH PRIVILEGES; - 如果要用 root 远程,别直接改 root 的认证方式,建议新建专用用户,避免安全隐患
真正该关掉的不是功能,而是粗放式开放——% 权限和裸放 3306 端口本身就有风险。生产环境至少要把 % 换成具体 IP 段,或者加 SSH 隧道、跳板机隔离。

















