修改 MySQL 用户的 host 值为 %
MySQL 默认安装后,
root用户的
host是
'localhost',只允许本机连接。远程访问需要将其改为
'%'(匹配任意主机),或指定 IP 更安全。 先用本地命令行登录:
mysql -u root -p执行授权语句(注意:MySQL 8.0+ 不再支持直接 UPDATE mysql.user):
CREATE USER 'root'@'%' IDENTIFIED BY 'your_password';<br>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;刷新权限:
FLUSH PRIVILEGES;验证修改是否生效:
SELECT user, host FROM mysql.user WHERE user = 'root';——应看到
host列包含
%
检查并关闭防火墙或放行 3306 端口
即使 MySQL 允许远程连接,系统防火墙也可能拦截请求。常见错误现象是“Connection refused”或“timeout”,但
telnet your_ip 3306不通。 Ubuntu/Debian:
sudo ufw allow 3306或临时禁用:
sudo ufw disableCentOS/RHEL 7+:
sudo firewall-cmd --permanent --add-port=3306/tcp<br>sudo firewall-cmd --reloadWindows Server:在“高级安全 Windows 防火墙”中新建入站规则,开放 TCP 3306
确认 MySQL 绑定地址是否监听外部 IP
MySQL 默认可能只绑定
127.0.0.1,导致即使用户和防火墙都配对了,仍无法远程连接。 编辑配置文件:
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)或
/etc/my.cnf(CentOS) 查找
bind-address行,改为:
bind-address = 0.0.0.0(监听所有 IPv4 接口)
或更安全地指定内网 IP,如:
bind-address = 192.168.1.100重启服务:
sudo systemctl restart mysql(Ubuntu)或
sudo systemctl restart mysqld(CentOS) 验证监听状态:
sudo netstat -tuln | grep :3306——输出中应含
*:3306或具体 IP:3306,而非仅
127.0.0.1:3306
MySQL 8.0+ 的密码认证插件兼容性问题
MySQL 8.0 默认使用
caching_sha2_password插件,部分旧客户端(如某些 Python pymysql 版本、Navicat 旧版)不支持,会报错
Authentication plugin 'caching_sha2_password' cannot be loaded。 临时兼容方案(不推荐长期使用):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';<br>FLUSH PRIVILEGES;更稳妥做法是升级客户端驱动,或连接时显式指定插件(如 Python 中加参数
auth_plugin='caching_sha2_password') 检查当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
MySQL 远程访问失败时,90% 的情况卡在 bind-address、防火墙、用户 host 三者之一;密码插件问题多出现在 MySQL 8.0+ 与老工具混用场景,容易被忽略。
