“Connection refused”通常因MySQL服务未运行或监听配置错误,应先检查服务状态、端口绑定及bind-address设置;Access denied则需核对user@host组合与认证插件兼容性;远程连接失败需排查防火墙、安全组及Docker网络;GRANT后须执行FLUSH PRIVILEGES生效权限。
“Connection refused” 错误绝大多数情况下不是权限问题,而是 mysqld 根本没起来,或者监听地址/端口不对。别急着改用户权限,先看服务状态。
systemctl status mysql 或 systemctl status mysqld(取决于发行版和安装方式)ss -tlnp | grep :3306(或 netstat -tlnp | grep :3306),确认有进程绑定在 0.0.0.0:3306 或 127.0.0.1:3306,而不是只绑定了 127.0.0.1 却从远程连/etc/mysql/my.cnf 或 /etc/my.cnf)中 bind-address 的值:若为 127.0.0.1,则仅本地 socket 可连;需远程访问时应设为 0.0.0.0 或具体网卡 IP(注意防火墙)能连上服务但报 Access denied for user 'xxx'@'yyy',说明认证失败。MySQL 判断用户的依据是 user + host 组合,且 8.0+ 默认用 caching_sha2_password 插件,老客户端可能不兼容。
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
host 是 localhost,那通过 TCP(比如 mysql -h 127.0.0.1)连接时匹配的是 'user'@'127.0.0.1',而非 'user'@'localhost' —— 这俩是不同账户'user'@'%',但务必配合强密码,并确保 s
kip-networking 未启用Client does not support authentication protocol,临时方案是改插件:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
MySQL 用户权限、服务监听都对了,还是连不上?大概率卡在中间层。
ufw status(Ubuntu)或 firewall-cmd --list-ports(CentOS/RHEL)ssh -L 3307:127.0.0.1:3306 user@remote_host,然后连 127.0.0.1:3307
host 以外模式,也会导致外部无法访问执行 GRANT 语句后权限没生效,最常见原因是没刷新权限表。MySQL 不会自动重载内存中的权限缓存。
mysql.user 表或使用 GRANT/REVOKE 后,必须执行:FLUSH PRIVILEGES;
INSERT 或 UPDATE mysql.user 表后也必须 FLUSH,否则变更仅存在磁盘,不生效CREATE USER)会自动触发刷新,但 GRANT 仍需手动 FLUSH(除非用 CREATE USER ... IDENTIFIED BY 一步到位)host 匹配细节和 plugin 兼容性最容易被忽略,尤其是从 5.7 升级到 8.0 后,很多脚本和连接池默认不支持新认证方式。