远程连不上MySQL的90%原因是四层关卡未全过:MySQL用户权限(Host需为%或具体IP)、bind-address须设为0.0.0.0、宝塔防火墙放行3306端口、云厂商安全组同步放行3306,缺一不可且顺序不能乱。

远程连不上 MySQL,90% 是卡在四层关卡没全过:MySQL 用户权限、bind-address 配置、宝塔/系统防火墙、云厂商安全组。缺一不可,顺序也不能乱。
检查并修改 MySQL 用户的 Host 权限
MySQL 认证是「用户名 + Host」联合判断,'root'@'localhost' 和 'root'@'%' 是两个完全不同的账号。直接改 mysql.user 表风险高,且 MySQL 5.7+ 不推荐 UPDATE 方式。
- 先查当前用户:
SELECT User, Host FROM mysql.user;,确认目标用户是否已有@'%'或具体 IP 的记录 - 若没有,新建专用用户比改 root 更安全:
CREATE USER 'dev'@'192.168.1.50' IDENTIFIED WITH mysql_native_password BY 'StrongPassw0rd!'; - 再授权:
GRANT SELECT, INSERT ON mydb.* TO 'dev'@'192.168.1.50';(避免GRANT ALL ON *.*) - 必须执行:
FLUSH PRIVILEGES;,否则权限不加载到运行时 - MySQL 8.0 默认用
caching_sha2_password插件,旧客户端(如 Navicat 旧版、某些 Python 驱动)会报ERROR 2059,所以建用户时要显式指定mysql_native_password
确认 bind-address = 0.0.0.0 并重启服务
bind-address = 127.0.0.1 是默认值,它让 MySQL 只监听本地回环,外部请求根本收不到——这是“权限开了还是连不上”的真正原因。
- 配置文件路径因系统而异:
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)、/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf(CentOS/RHEL) - 在
[mysqld]段下,确保有:bind-address = 0.0.0.0(不要注释、不要留空、不要写成localhost) - 同时确认没有
skip-networking = ON,有就删掉或设为OFF - 改完必须重启:
sudo systemctl restart mysql(Debian/Ubuntu)或sudo systemctl restart mysqld(CentOS/RHEL) - 验证是否生效:
sudo ss -tlnp | grep :3306,输出中应含0.0.0.0:3306或服务器真实内网 IP,而非仅127.0.0.1:3306
同步放行宝塔防火墙与云平台安全组
宝塔防火墙是系统级,云安全组(阿里云/腾讯云等)是网络层,两者独立生效。只开一个,连接照样被拦在半路。
- 宝塔操作:
【安全】→【防火墙】→【放行端口】→ 输入 3306,协议选 TCP - 云平台操作:去控制台 →
安全组→ 添加入方向规则 → 协议类型TCP,端口范围3306/3306,源 IP 填具体 IP 或最小 CIDR(如192.168.1.0/24),别填0.0.0.0/0 - Linux 系统防火墙(如
firewalld或ufw)也可能干扰,可临时关闭测试:sudo systemctl stop firewalld;通了再按需放行 - 测试是否通:在本地终端执行
telnet your-server-ip 3306,能连上说明网络层通畅;连不上就回头查防火墙或安全组
验证连接失败时怎么快速定位在哪一层
错误信息不能直接当结论。不同层失败表现完全不同,分清才能少走弯路。
-
Host 'x.x.x.x' is not allowed to connect→ 第一层:MySQL 用户权限未匹配,查mysql.user表的Host字段 -
Can't connect to MySQL server on 'x.x.x.x' (10060 / 10061)→ 第二或第三层:要么bind-address没放开,要么防火墙/安全组没放行 -
ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded→ MySQL 8.0 认证插件不兼容,建用户时没指定mysql_native_password -
Access denied for user 'xxx'@'y.y.y.y'→ 密码错,或用户存在但Host不匹配(比如你用192.168.1.50连,但用户是'xxx'@'192.168.1.%',注意%不匹配点号前的数字)
最容易被忽略的是 FLUSH PRIVILEGES 和 bind-address 改完没重启服务。很多配置看着改对了,但服务没重载,等于白改。


















