远程登录被拒绝主因是'user'@'host'不匹配、bind-address未监听外部地址或防火墙未放行3306端口;需依次查mysql.user表、修改bind-address为0.0.0.0、开放防火墙及云安全组规则,并执行FLUSH PRIVILEGES。
远程登录被拒绝,90%不是密码错,而是 MySQL 根本没“认出”你这个连接来源——得从 user@host 匹配、监听地址、防火墙三层依次卡点排查。
报错 Host '192.168.1.50' is not allowed to connect 就是这一层失败的典型信号。MySQL 不看你是谁,只严格比对 user 和 host 字段组合。
SELECT user, host FROM mysql.user WHERE user = 'root'; —— 如果只有 'root'@'localhost',那远程必然拒绝UPDATE mysql.user SET host = '%':MySQL 8.0+ 会报 ERROR 1396,且跳过密码加密逻辑CREATE USER 'root'@'%' IDENTIFIED BY 'StrongPass2026!'; 或 ALTER USER 'root'@'localhost' RENAME TO 'root'@'%';
FLUSH PRIVILEGES;,否则内存缓存不更新,改了也白改即使用户权限全开,如果 mysqld 只绑定了 127.0.0.1,所有远程 TCP 包在系统层就被丢弃,连错误日志都不会记。
/etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf),找 [mysqld] 下的 bind-address
127.0.0.1,改为 0.0.0.0(IPv4 全开)或注释掉该行(MySQL 会默认监听所有接口)sudo systemctl restart mysql(Debian/Ubuntu)或 sudo systemctl restart mysqld(RHEL/CentOS)sudo ss -tlnp | grep :3306,输出中必须含 *:3306 或 0.0.0.0:3306,不能只有 127.0.0.1:3306
端口不通时,telnet your-server-ip 3306 会直接超时或报 Connection refused;前者是防火墙拦截,后者才是 MySQL 层问题。
sudo ufw status(Ubuntu)或 sudo firewall-cmd --list-ports(CentOS),确保含 3306/tcp
sudo ufw allow 3306 或 sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload
0.0.0.0/0
ufw 关了,安全组没开照样连不上MySQL 8.0 默认启用 caching_sha2_password 插件,老客户端(如旧版 Navicat、某些 Python MySQL 驱动)可能握手失败,表现就是“连接被拒绝”,但日志里没有明确提示。
CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'Pass123!';
ALTER USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'Pass123!';
SHOW VARIABLES LIKE 'require_secure_transport';,若为 ON,需在用户授权时加 REQUIRE NONE 或配好证书mysql -h your-ip -u user -p --default-auth=mysql_native_password 快速验证是不是插件问题最易被忽略的是:改完 my.cnf 忘记重启服务,或执行了 GRANT 却漏掉 FLUSH PRIVILEGES;;还有人把安全组规则加在错误的实例上——这些点不卡死,前面所有操作都白费。