远程连接失败但grant执行成功,说明权限已生效,问题出在mysql监听地址(需注释bind-address=127.0.0.1或设为0.0.0.0并重启服务)、防火墙/安全组未开放3306端口,或mysql 8.0+认证插件不兼容。

远程连接失败但 GRANT 执行成功,说明权限已写入,问题不在 SQL 层
很多人执行完 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'pwd'; 和 FLUSH PRIVILEGES; 就以为万事大吉,结果本地能连、远程死活连不上。这时候权限不是瓶颈,得往下查两层:MySQL 实际监听的地址,以及系统/网络层面是否放行了连接。
bind-address 配置错误是远程连不上的最常见原因
MySQL 默认只监听 127.0.0.1,哪怕你授权了 'user'@'%',它根本收不到外部来的 TCP 包。
- Linux/macOS:检查
/etc/mysql/mysql.conf.d/mysqld.cnf或/usr/local/etc/my.cnf,找到[mysqld]段,确认bind-address不是127.0.0.1(必须注释掉或改为0.0.0.0) - Windows:查
C:\ProgramData\MySQL\MySQL Server X.X\my.ini,同样处理bind-address行 - 改完必须重启服务:
sudo systemctl restart mysql(Linux)、net stop mysql && net start mysql(Windows) - 验证是否生效:在服务器上运行
ss -tln | grep :3306或netstat -an | findstr :3306,输出中应含0.0.0.0:3306或*:3306,而非仅127.0.0.1:3306
防火墙没开 3306 端口,等于在门口砌了堵墙
即使 MySQL 监听了 0.0.0.0,操作系统防火墙或云厂商安全组仍可能拦截入站流量。
- Linux(ufw):
sudo ufw allow 3306;若用 firewalld:sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - Windows:用 PowerShell 运行
New-NetFirewallRule -DisplayName "MySQL Port" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow - 云服务器(阿里云/腾讯云/华为云):必须进「安全组」控制台,手动添加入方向规则,协议 TCP,端口 3306,源 IP 可设为
0.0.0.0/0(测试用)或指定 IP 段 - 别漏掉第三方软件:360、火绒、卡巴斯基等常自带网络防护,需单独放行 mysqld 进程或 3306 端口
容易被忽略的点:MySQL 8.0+ 的默认认证插件和主机名解析
MySQL 8.0 开始,默认认证插件从 mysql_native_password 改为 caching_sha2_password,部分旧客户端(如某些 Navicat 版本、PHP 7.4 以下)不兼容,会静默失败。
- 临时解决(仅测试):
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; FLUSH PRIVILEGES; - 更稳妥的做法是创建用户时显式指定:
CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 另外,如果服务器启用了
skip-name-resolve,但 DNS 解析异常,也可能导致连接卡住;确认配置文件中没有该选项,或确保/etc/hosts里有正确映射











