mysql连接被拒绝怎么办_mysql访问权限异常处理

来源:这里教程网 时间:2026-02-28 20:38:26 作者:

连接被拒绝:先确认 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 后,很多脚本和连接池默认不支持新认证方式。

相关推荐