MySQL认证失败(典型如错误代码 1045 Access denied)本质是身份校验没通过,不是服务挂了,也不是网络断了。核心要搞清三件事:密码对不对、用户存不存在、能不能从你这台机器连过去。下面分几种常见情况给出直接可用的修复路径。
确认服务在运行且端口可通
很多“登录失败”其实是服务根本没起来,或被防火墙拦住:
Linux 执行sudo systemctl status mysqld,看状态是否为 active (running);若非运行中,用
sudo systemctl start mysqld启动 Windows 检查【服务】里 MySQL 对应的服务名(如 MySQL80),右键启动;或命令行以管理员身份运行
net start MySQL80测试本地连通性:
mysql -u root -p -h 127.0.0.1—— 用 IP 而非 localhost,可绕过 socket 和 DNS 解析问题 检查 3306 端口是否被占用或屏蔽:
telnet 127.0.0.1 3306(Windows)或
nc -zv 127.0.0.1 3306(Linux/macOS)
跳过权限验证重置 root 密码
当你完全记不清 root 密码,又无法用其他账号登录时,需临时禁用权限检查:
先停服务:sudo systemctl stop mysqld(Linux)或
net stop MySQL80(Windows) Linux:执行
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables";Windows:编辑
my.ini,在
[mysqld]下新增一行
skip-grant-tables启动服务:
sudo systemctl start mysqld或
net start MySQL80免密登录:
mysql -u root(不加
-p,也不输密码) 重设密码(MySQL 5.7+ 推荐用
ALTER USER):
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
FLUSH PRIVILEGES;还原配置:删掉
skip-grant-tables或取消环境变量:
sudo systemctl unset-environment MYSQLD_OPTS,再重启服务
检查用户是否存在及 host 匹配
报错
Access denied for user 'root'@'localhost'不代表密码错,可能 root 用户根本没在
'localhost'这条记录里: 登录成功后(哪怕用
skip-grant-tables),执行:
SELECT user, host FROM mysql.user;如果结果里没有
root+
localhost,但有
root+
127.0.0.1或
%,说明你当前连接方式(比如用
mysql -u root -h localhost)匹配不到对应记录 补全用户(允许本地所有方式连接):
CREATE USER 'root'@'localhost' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;远程访问需求?把
localhost换成
%,但务必配合防火墙和强密码使用
留意密码策略与配置干扰
新版本 MySQL(尤其启用了
validate_password插件)会拒绝弱密码,而配置文件里的某些设置也会静默阻断登录: 重设密码时报 “Your password does not satisfy the current policy requirements”,说明密码太简单。必须含大小写字母 + 数字 + 特殊字符,长度 ≥8,例如:
NewPass123!检查
my.cnf或
my.ini中是否有:
skip-networking→ 会关闭 TCP 连接,只留本地 socket
bind-address = 127.0.0.1→ 默认就限制本地,但若你用
localhost连,有时会走 socket,有时走 TCP,行为不一致;改成
0.0.0.0可统一处理(注意安全) Windows 下确认
my.ini文件权限不是“完全控制”开放给 Everyone,避免 MySQL 拒绝加载配置
