MySQL 8.0远程连接失败主因是bind-address=127.0.0.1、防火墙/安全组未放行3306端口、默认认证插件caching_sha2_password不兼容;需改bind-address为0.0.0.0、开放端口、创建用户时指定mysql_native_password插件并刷新权限。

MySQL 8.0 默认拒绝远程连接,宝塔只是界面,底层还是它说了算
宝塔装完 MySQL 后点“添加用户”勾了“允许远程访问”,但用 Navicat 或命令行连不上——大概率不是宝塔 bug,而是 MySQL 8.0+ 的默认认证插件和 host 限制双重生效。宝塔界面上的“%”看似放行所有 IP,实际创建用户时若没显式指定 host 或用了 mysql_native_password 以外的插件(比如 caching_sha2_password),连接就会被静默拒绝。
- 检查当前用户实际生效的
host:登录 MySQL 执行SELECT user, host FROM mysql.user;,确认你建的用户对应的是%而非localhost - MySQL 8.0+ 新建用户默认用
caching_sha2_password,部分客户端(尤其是旧版 Navicat、某些 Python 驱动)不兼容,得手动指定插件:CREATE USER 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass'; - 宝塔“添加用户”表单里填的“数据库”是授权范围,不是用户名;真正决定能否远程的是
@'%'这部分,不是勾选框
防火墙和安全组才是第一道拦路虎,别只盯着 MySQL 配置
连不上 ≠ MySQL 没开远程。90% 的真实失败案例卡在系统层:Linux 防火墙(ufw 或 firewalld)或云厂商安全组没放行 3306 端口。宝塔面板本身监听 8888,和 MySQL 完全无关。
- 查 Linux 防火墙状态:
sudo ufw status(Ubuntu)或sudo firewall-cmd --state(CentOS) - 开放端口:
sudo ufw allow 3306或sudo firewall-cmd --permanent --add-port=3306/tcp,然后 reload - 阿里云/腾讯云后台必须单独配置安全组规则,源 IP 建议先设为
0.0.0.0/0测试,验证通了再收紧 - 宝塔“安全”页面里的“放行端口”只管面板自身端口,对 MySQL 无效
bind-address = 127.0.0.1 是 MySQL 的硬性枷锁,改错位置等于白干
MySQL 配置文件里 bind-address 决定它监听哪个网卡。默认值 127.0.0.1 表示只响应本机请求,哪怕用户权限、防火墙全开,外部请求也根本送不到 MySQL 进程。
- 找到真实生效的配置文件:
mysql --help | grep "Default options",重点看/etc/my.cnf或/www/server/mysql/etc/my.cnf(宝塔常用路径) - 修改
bind-address:改成0.0.0.0(监听所有 IPv4 地址)或具体服务器内网 IP;不要删掉这行,留空可能触发默认回退到127.0.0.1 - 改完必须重启 MySQL:
sudo systemctl restart mysqld或宝塔面板里点“重启”——仅重载配置(reload)不生效 - 注意:有些宝塔版本会把
my.cnf分成多段([mysqld]和[client]),bind-address必须放在[mysqld]下,放错段落无效
授权语句没刷新权限表,或者权限粒度太细导致连不上
用 GRANT 授权后不执行 FLUSH PRIVILEGES;,或只授了 SELECT 却用 root 方式连接(需要 USAGE 权限),都会表现为“连接成功但立刻断开”或“Access denied for user”。
- 最小必要授权示例(连库+读写):
GRANT SELECT, INSERT, UPDATE, DELETE ON `mydb`.* TO 'myuser'@'%';,注意反引号包裹数据库名 - 必须跟一句:
FLUSH PRIVILEGES;,否则内存权限缓存不变 - 如果要用
root权限类操作(如SHOW DATABASES),需额外授GRANT OPTION或直接给ALL PRIVILEGES(不推荐生产环境) - 测试连接时,用
mysql -h your_server_ip -u myuser -p,别用localhost(会走 socket,绕过网络层检测)
真正卡住人的,往往是 bind-address 没改、防火墙没开、或 MySQL 8.0 的认证插件不匹配这三件事叠在一起。调一个地方就去试一次,别堆着改完才验证——顺序错了,日志里就全是误导信息。

















