mysql远程连接需同时满足三条件:监听外部ip(bind-address设为0.0.0.0或指定ip)、用户host设为%(非localhost)、防火墙及云安全组放行3306端口,缺一不可。

MySQL 默认拒绝远程连接,不是配置漏了,而是它根本没打算让你随便连——bind-address = 127.0.0.1 和 root@localhost 这两个限制必须同时打破,缺一不可。
修改 mysqld.cnf 让 MySQL 监听外部 IP
只改用户权限连不上,因为 MySQL 根本不听外网请求。关键在配置文件里那行 bind-address:
- 路径通常是
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS/RHEL) - 找到
bind-address = 127.0.0.1,改成bind-address = 0.0.0.0(允许所有 IPv4)或具体内网 IP(如bind-address = 192.168.1.100) - 如果配置里有
skip-networking = ON,必须删掉或设为OFF - 改完必须重启服务:
sudo systemctl restart mysql(Debian/Ubuntu)或sudo systemctl restart mysqld(RHEL/CentOS) - 验证是否生效:
sudo ss -tlnp | grep :3306,输出应含0.0.0.0:3306或你指定的 IP,而非仅127.0.0.1:3306
创建或更新用户,让 host 字段支持远程
host 字段才是权限开关,localhost 和 % 是完全不同的访问通道:
- 登录 MySQL:
mysql -u root -p - 切到系统库:
USE mysql; - 查当前用户:
SELECT User, Host FROM user WHERE User = 'root';—— 如果只有localhost,说明还没开远程入口 - MySQL 8.0+ 推荐新建专用用户(别直接动 root):
CREATE USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass123!'; - 授权:
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'remote_user'@'%';(按需缩小权限,别用ALL PRIVILEGES) - 刷新:
FLUSH PRIVILEGES; - 注意:MySQL 8.0 默认认证插件是
caching_sha2_password,旧客户端可能连不上,所以显式指定mysql_native_password
防火墙和云平台安全组必须放行 3306
即使 MySQL 配置全对,网络层拦住照样连不上:
- 本地防火墙(Ubuntu):
sudo ufw allow 3306/tcp - 本地防火墙(CentOS):
sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload - 云服务器(阿里云/腾讯云/华为云):必须在控制台的安全组规则里,添加入方向规则,协议类型 TCP,端口范围
3306/3306,源 IP 可设为0.0.0.0/0(测试用)或具体客户端 IP(生产推荐) - 测试连通性:
telnet your-server-ip 3306—— 如果超时,问题一定出在网络层,不是 MySQL 配置
常见报错和对应排查点
看到错误别急着重配,先定位是哪一层挂了:
-
Host 'x.x.x.x' is not allowed to connect to this MySQL server→ 权限层问题:检查user表中对应用户的host值,不是localhost就不行 -
Can't connect to MySQL server on 'x.x.x.x' (111)→ 网络层问题:ss -tlnp看监听地址、telnet测端口、安全组查规则 - 连接成功但提示
Access denied for user→ 密码或认证插件问题:确认创建用户时用了IDENTIFIED WITH mysql_native_password,尤其对接 Navicat / Workbench 等老客户端 - MySQL 8.0+ 创建用户后仍连不上 → 检查是否执行了
FLUSH PRIVILEGES;,且用户 host 是%而非localhost
真正容易被忽略的是三者必须全部到位:MySQL 进程监听正确地址、用户记录 host 允许远程、网络链路(本地防火墙 + 云安全组)放行端口——少一个,就卡在“以为配好了”的假象里。











