连接被拒绝:先确认 MySQL 服务是否在运行
“Connection refused” 错误绝大多数情况下不是权限问题,而是
mysqld根本没起来,或者监听地址/端口不对。别急着改用户权限,先看服务状态。 Linux 上执行
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却从远程连 查看 MySQL 配置文件(通常是
/etc/mysql/my.cnf或
/etc/my.cnf)中
bind-address的值:若为
127.0.0.1,则仅本地 socket 可连;需远程访问时应设为
0.0.0.0或具体网卡 IP(注意防火墙)
ERROR 1045 / Access denied:重点查 host 和 authentication plugin
能连上服务但报
Access denied for user 'xxx'@'yyy',说明认证失败。MySQL 判断用户的依据是
user+
host组合,且 8.0+ 默认用
caching_sha2_password插件,老客户端可能不兼容。 登录 MySQL 后执行:
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'@'%',但务必配合强密码,并确保
skip-networking未启用 遇到
Client does not support authentication protocol,临时方案是改插件:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
远程连接失败但本地 OK:检查系统级网络限制
MySQL 用户权限、服务监听都对了,还是连不上?大概率卡在中间层。
确认服务器防火墙放行 3306 端口:ufw status(Ubuntu)或
firewall-cmd --list-ports(CentOS/RHEL) 云服务器(如阿里云、AWS)必须检查安全组规则,开放对应端口和源 IP 段 若用 SSH 隧道连接,确保本地端口转发命令正确,例如:
ssh -L 3307:127.0.0.1:3306 user@remote_host,然后连
127.0.0.1:3307某些 Docker 部署中,容器未暴露端口或 network mode 设为
host以外模式,也会导致外部无法访问
GRANT 后仍无效:别忘了 FLUSH PRIVILEGES
执行
GRANT语句后权限没生效,最常见原因是没刷新权限表。MySQL 不会自动重载内存中的权限缓存。 每次修改
mysql.user表或使用
GRANT/
REVOKE后,必须执行:
FLUSH PRIVILEGES;注意:直接
INSERT或
UPDATE
mysql.user表后也必须
FLUSH,否则变更仅存在磁盘,不生效 MySQL 8.0+ 中部分操作(如
CREATE USER)会自动触发刷新,但
GRANT仍需手动
FLUSH(除非用
CREATE USER ... IDENTIFIED BY一步到位) 实际排查时,
host匹配细节和
plugin兼容性最容易被忽略,尤其是从 5.7 升级到 8.0 后,很多脚本和连接池默认不支持新认证方式。
