新建用户无法远程连接主因是MySQL未开放远程访问,需依次排查bind-address配置、用户host匹配及防火墙/安全组设置,缺一不可。

新建用户无法远程连接,90%的情况不是密码错了,而是 MySQL 根本没让它进门——它连认证环节都进不去。必须按顺序排查网络监听、用户 host 匹配、防火墙三道关卡,跳过任何一层都会白忙活。
检查 bind-address 是否允许外部监听
MySQL 默认只绑在 127.0.0.1,远程请求连 TCP 握手都触发不了,自然报错 ERROR 2003 (HY000) 或直接超时。
- 查配置:
grep -i "bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS) - 正确写法是
bind-address = 0.0.0.0(IPv4 全监听),不要注释掉该行——某些旧版本默认即为127.0.0.1 - 改完必须重启:
sudo systemctl restart mysql - 验证是否生效:
ss -tlnp | grep :3306输出应含*:3306,若只有127.0.0.1:3306就说明没生效
确认 'user'@'host' 记录是否匹配客户端来源 IP
MySQL 认证时先查 mysql.user 表,用的是「用户名 + 来源主机」的组合键。你创建了 'app'@'%',但客户端实际连的是 192.168.1.50,而表里还有一条更精确的 'app'@'192.168.1.%',那就会优先匹配后者——如果这条没授权,照样被拒。
- 登录 MySQL 后执行:
SELECT User, Host FROM mysql.user WHERE User = 'app'; - 确保结果中存在一条
app对应的%或具体网段(如192.168.1.%),且Host值和你远程连接时的来源 IP 能匹配 - 别用
UPDATE mysql.user SET Host = '%'粗暴修改 root 或其他系统账号——MySQL 8.0+ 下可能因认证插件冲突导致本地也无法登录 - 推荐重建:先
DROP USER 'app'@'%';,再CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';(兼容旧客户端)
验证防火墙与安全组是否放行 3306 端口
即使 MySQL 监听了所有接口、用户也授权成功,3306 被拦在操作系统或云平台层,连接请求根本到不了 MySQL 进程。
- 服务器本地检查:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS),确认有3306/tcp - 开放端口:
sudo ufw allow 3306或sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 云服务器(阿里云/腾讯云/AWS)必须额外检查「安全组」:入方向规则需明确添加
TCP:3306,源地址不能只填内网段;测试阶段可临时设为0.0.0.0/0 - 快速验证:从远程机器执行
telnet your-server-ip 3306,能连上说明前两层都通了,问题一定出在权限或认证环节
最容易被忽略的是:MySQL 用户的 Host 字段和客户端真实来源 IP 之间存在隐式匹配逻辑,比如 DNS 反查、多网卡绑定、NAT 映射后的 IP 变形,这些都会让看似正确的 'user'@'%' 实际不生效。真遇到连 telnet 都通但就是报 ERROR 1130,就得去查 MySQL 错误日志:tail -f /var/log/mysql/error.log,里面会明确写出“Access denied for user 'app'@'192.168.1.200'”,那个 IP 才是你真正要授权的目标。











