mysql远程连接需同时配置bind-address为0.0.0.0(或指定ip)、创建带mysql_native_password插件的远程用户并授权、刷新权限,且必须开放防火墙及云安全组3306端口,缺一不可。

mysql 默认只监听 127.0.0.1,远程连接必然失败。必须同时改配置、开权限、调认证方式,缺一不可。
修改 bind-address 允许监听外部 IP
MySQL 8.0 默认绑定 127.0.0.1,意味着只响应本机请求。不改这个,后面所有操作都白搭。
- Windows 下打开
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini;Linux 下编辑/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf - 在
[mysqld]段下确认或添加:bind-address = 0.0.0.0(允许所有 IPv4 地址)或指定内网 IP(如bind-address = 192.168.1.100) - 切勿写成
bind-address = ::或留空——MySQL 8.0 不识别 IPv6 通配或空值,会静默回退到127.0.0.1 - 改完必须重启服务:
net stop mysql80 && net start mysql80(Windows)或sudo systemctl restart mysql(Linux)
创建用户并显式指定 mysql_native_password 插件
MySQL 8.0 默认用 caching_sha2_password,但 Navicat、DBeaver、旧版 JDBC 驱动等大多不兼容,直连会报错 ERROR 2059 (HY000)。
- 不要直接改
root用户——生产环境禁止 root 远程登录 - 用以下语句创建专用用户(替换
remote_user和StrongPassw0rd!):CREATE USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPassw0rd!';
-
@'%'表示任意 IP;若只允许某网段,写成@'192.168.1.%'更安全 - 如果已存在同名用户但插件不对,先删掉:
DROP USER 'remote_user'@'%';
授予权限后必须执行 FLUSH PRIVILEGES
权限变更不会自动生效,MySQL 缓存权限表在内存中,不刷新就等于没授权。
- 授权语句必须带主机名(和
CREATE USER中一致):GRANT SELECT, INSERT ON mydb.* TO 'remote_user'@'%';
- 避免用
GRANT ALL ON *.*——最小权限原则:只给业务需要的库和操作 - 执行完
GRANT后,**立刻**运行:FLUSH PRIVILEGES; - 验证是否生效:
SELECT host, user, plugin FROM mysql.user WHERE user = 'remote_user';,确认plugin列是mysql_native_password
别忘了防火墙和云平台安全组
即使 MySQL 配好了,连接仍可能卡在 TCP 层——这是网络层拦截,不是数据库问题。
- 本地防火墙:Windows 开“入站规则”放行
TCP 3306;Linux 用ufw allow 3306或iptables规则 - 云服务器(阿里云/腾讯云/AWS):必须在控制台配置“安全组”,添加入方向规则,协议
TCP,端口3306,源 IP 写具体 IP 或0.0.0.0/0(后者仅测试用) - 容器部署(Docker):确保
-p 3306:3306映射正确,且宿主机防火墙也放行了 3306 - 排查时用
telnet your-server-ip 3306测试端口连通性;不通就不是 MySQL 的问题
实际连不上时,90% 是 bind-address 没生效、plugin 不匹配、或防火墙/安全组漏配——这三处最容易被跳过检查。











