MySQL默认禁止远程连接是出于安全策略,root用户仅授权localhost/127.0.0.1访问;需检查user表host字段、修改bind-address为0.0.0.0、放行3306端口、用GRANT或CREATE USER显式授权并指定兼容认证插件,最后FLUSH PRIVILEGES。

MySQL安装后默认禁止远程连接,不是配置遗漏,而是安全策略主动限制——root用户只允许从localhost或127.0.0.1登录,这是初始化时写死的权限规则。
检查当前用户 host 限制是否为本地独占
远程连不上,第一步不是改配置,而是确认权限表里有没有“能从外面来”的记录。直接登录服务器执行:
mysql -u root -p use mysql; SELECT User, Host FROM user WHERE User = 'root';
如果结果里只有 localhost、127.0.0.1、::1 这几行,说明 root 确实被锁死了——它根本没被授权从其他 IP 登录。
- 不要直接
UPDATE user SET host = '%',MySQL 8.0+ 的root用户可能因认证插件冲突导致更新后无法登录 - 优先用
GRANT语句新建远程访问能力,而不是暴力覆盖host字段 - 执行完必须
FLUSH PRIVILEGES;,否则权限不生效
用 GRANT 授权 root@'%' 但要注意认证插件兼容性
MySQL 5.7 和 8.0 对 root 的默认认证插件不同:mysql_native_password 兼容性好,caching_sha2_password 在部分客户端(如旧版 Navicat、某些 Python 驱动)会报 Authentication plugin 'caching_sha2_password' cannot be loaded。
安全起见,建议显式指定插件再授权:
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_strong_password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
- 不要复用本地
root密码明文,CREATE USER会重置密码并绑定插件 - 如果已有
root@'%' 记录但连不上,先DROP USER 'root'@'%';再重建 -
GRANT ... WITH GRANT OPTION是必须的,否则远程登录后无法管理其他用户
bind-address 和防火墙是两个独立关卡
即使权限开了,bind-address = 127.0.0.1(默认值)会让 MySQL 只监听本地回环口,外部请求根本进不来;而云服务器的安全组(如阿里云/腾讯云)或系统防火墙(ufw/firewalld)又会把 3306 端口拦在第二道门。
- 编辑
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)或/etc/my.cnf(CentOS),找到bind-address行,改为bind-address = 0.0.0.0或注释掉整行 - 重启服务:
sudo systemctl restart mysql,再用sudo ss -tlnp | grep :3306确认监听的是*:3306而非127.0.0.1:3306 - 云服务器必须在控制台配安全组规则:入方向开放 TCP 3306,源 IP 建议填具体客户端 IP 或最小化网段,别无脑填
0.0.0.0/0
远程连接失败时最常被忽略的验证点
很多人改完权限、放开 bind、开好防火墙,还是连不上,问题往往卡在中间环节:
- 客户端用的是 IPv4 还是 IPv6?
root@'%' 不匹配 IPv6 地址,要单独加root@'::%' - MySQL 日志里是否有
Access denied for user?说明权限或密码错;如果是Connection refused,说明端口没通或服务没监听 - 用
telnet your-server-ip 3306或nc -zv your-server-ip 3306测试端口可达性,比客户端报错更早定位网络层问题 - 某些云主机(如腾讯云轻量)默认关闭公网 IP,需在控制台单独申请并绑定弹性公网 IP
真正卡住的,往往是 bind-address 没生效、安全组漏配、或者 MySQL 8.0 的认证插件不兼容这三处中的某一个——逐个排除比反复重试更快。











