MySQL默认拒绝远程连接,需三步解决:①修改bind-address为0.0.0.0或指定IP并重启服务;②创建'用户'@'%'或限定IP的账号并授权;③开放系统防火墙及云服务器安全组3306端口。
MySQL 安装后默认只监听 127.0.0.1(本地回环),bind-address 配置为 127.0.0.1 或 localhost 时,任何外部 IP 都无法建立 TCP 连接,哪怕防火墙已放行端口。这不是权限问题,是网络层直接被拒。
sudo netstat -tlnp | grep :3306如果只看到
127.0.0.1:3306,说明还没放开/etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf),找到 bind-address 行,改为:bind-address = 0.0.0.0(监听所有 IPv4 接口)或指定内网 IP(如
192.168.1.100)sudo systemctl restart mysql(Ubuntu/Debian)或
sudo systemctl restart mysqld(CentOS/RHEL)
即使 MySQL 监听了 0.0.0.0,用 root@localhost 登录的账号默认不能从其他 IP 连入。MySQL 的用户是“用户名 + 主机名”联合标识,'root'@'localhost' 和 'root'@'%' 是两个完全不同的账号。
SELECT User, Host FROM mysql.user;
CREATE USER 'devuser'@'%' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'devuser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
CREATE USER 'devuser'@'192.168.1.%' IDENTIFIED BY 'strong_password';
caching_sha2_password 插件,某些旧客户端不兼容,可强制指定插件:CREATE USER 'devuser'@'%' IDENTIFIED WITH mysql_native_password BY 'strong_password';
Linux 系统防火墙(ufw / firewalld)和云平台(阿里云、腾讯云等)的安全组规则是两层独立过滤,任一未放行都会导致连接超时(不是拒绝,是无响应)。
sudo ufw allow 3306
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload
TCP,端口范围填 3306,源 IP 建议限制为你的开发机公网 IP(或公司出口 IP),避免设为 0.0.0.0/0
telnet your-server-ip 3306,能连上说明网络层通畅;如果报
Connection refused,说明 MySQL 没监听或服务没启;如果卡住或报超时,大概率是防火墙/安全组拦截很多开发者用 my 测试失败,却没意识到 MySQL 服务端可能开启了
sql -h 123.123.123.123 -u devuser -pskip-name-resolve,此时它不会反向解析客户端 IP 为域名——但如果你在 GRANT 语句里用了域名(比如 'devuser'@'my-laptop.local'),而客户端实际 IP 是 192.168.1.50,就会因主机名不匹配被拒绝。
%),避免依赖 DNSSHOW VARIABLES LIKE 'skip_name_resolve';若值为
ON,就别在 Host 字段写域名mysql -h 192.168.1.100 -P 3306 -u devuser -p(注意
-P 是大写,小写 -p 是密码)Host 填的是服务器真实 IP,不是 localhost 或 127.0.0.1
远程连 MySQL 看似三步:改 bind、授权限、开防火墙,但每步都有隐性依赖。最容易卡住的是 bind-address 没生效(配置文件路径错、多配置文件冲突)、用户 Host 匹配失败(大小写、空格、% 位置)、以及云平台安全组漏配——这三处查一遍,90% 的连接问题就解决了。