Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > Access denied for user root @ localhost

MySQL报错:Access denied for user ‘root‘@‘localhost‘解决方法

作者:步行cgn

MySQL报错Access denied for user 'root'@'localhost'通常由密码错误、用户权限配置不当、用户不存在或MySQL服务未运行引起这篇文章主要介绍了MySQL报错:Access denied for user ‘root‘@‘localhost‘解决方法的相关资料,需要的朋友可以参考下

一、错误含义

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

这个错误表示 MySQL 拒绝了 root 用户的连接请求。关键信息:

部分含义
ERROR 1045认证失败错误码
root@localhost用 root 用户从 localhost 连接
using password: YES提供了密码,但密码不对
using password: NO没提供密码(如果显示 NO,说明 -p 后面没输入密码)

二、常见原因

原因说明
密码错误输入的密码与 root 用户的实际密码不一致
密码为空root 用户没有设置密码,但命令中用了 -p
认证插件问题MySQL 8 默认使用 caching_sha2_password,旧客户端不兼容
用户名错误用户不是 root,或 root 不允许从 localhost 连接
端口错误连接到了错误的 MySQL 实例
环境变量干扰MYSQL_PWD 环境变量覆盖了输入的密码

注意:第一条 [Warning] Using a password on the command line interface can be insecure 只是警告,不是错误。它提示你“在命令行里明文写密码不安全”,但不会影响连接。真正的问题是下面的 ERROR 1045。

三、排查步骤

1. 确认密码是否正确

mysql -u root -p

回车后输入密码。如果密码记不清了,尝试以下常见密码:

2. 确认是否真的设置了密码

有些安装方式(如 MySQL 8 的默认安装)会为 root 用户生成一个临时密码,需要查看日志:

# Linux
grep 'temporary password' /var/log/mysqld.log

# Windows,查看 MySQL 数据目录下的 .err 文件

3. 检查是否连接到了正确的实例

# 指定端口
mysql -u root -p -P 3306

# 指定主机
mysql -u root -p -h 127.0.0.1

如果你的机器上装了多个 MySQL 实例,可能连到了错误的那个。

4. 检查环境变量

Windows 下如果设置了 MYSQL_PWD 环境变量,它会覆盖你手动输入的密码:

echo %MYSQL_PWD%

如果有值,清掉它:

set MYSQL_PWD=

四、忘记密码怎么办

如果确实忘了 root 密码,可以跳过权限验证重置。

Windows 下重置

第一步:停止 MySQL 服务

net stop mysql

服务名可能是 mysql、mysql80、MySQL,用 services.msc 查看。

第二步:以跳过权限验证方式启动

mysqld --skip-grant-tables --console

这个命令会占用当前终端,不要关闭。

第三步:新开一个终端,连接 MySQL

mysql -u root

此时不需要密码。

第四步:重置密码

MySQL 8:

FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

MySQL 5.7:

UPDATE mysql.user SET authentication_string = PASSWORD('新密码') 
WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

第五步:重启 MySQL 服务

关闭跳过权限验证的进程,正常启动服务:

net start mysql

用新密码连接验证。

Linux 下重置

# 停止服务
sudo systemctl stop mysqld

# 跳过权限验证启动
sudo mysqld_safe --skip-grant-tables &

# 连接
mysql -u root

# 重置密码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

# 重启
sudo systemctl restart mysqld

五、认证插件问题

MySQL 8 默认使用 caching_sha2_password 插件,部分旧客户端或 JDBC 驱动不兼容,可能表现为“密码正确但认证失败”。

修改认证插件:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
FLUSH PRIVILEGES;

Java 项目中如果连接 MySQL 8 报认证错误,检查 JDBC URL 是否加了参数:

jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai

六、权限问题

如果密码正确但仍被拒绝,可能是 root 用户没有从 localhost 连接的权限。

以跳过权限方式启动后,检查权限表:

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

如果 host 不是 localhost 或 %,可以添加:

CREATE USER 'root'@'localhost' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

七、关于密码安全警告

[Warning] Using a password on the command line interface can be insecure.

这只是提醒:mysql -u root -p123456 这种把密码写在命令行里的方式不安全,因为命令会被记录到 shell 历史中。

推荐方式:

# 交互式输入,密码不回显
mysql -u root -p

# 使用配置文件
mysql --defaults-extra-file=/path/to/my.cnf

my.cnf 内容:

[client]
user=root
password=你的密码

并设置文件权限:

chmod 600 /path/to/my.cnf

八、总结

问题解决方案
密码错误重新输入正确密码
忘记密码跳过权限验证重置
密码为空去掉 -p 或直接回车
认证插件不兼容改为 mysql_native_password
权限不足检查 mysql.user 表的 host 字段
命令行密码警告用交互式 -p 或配置文件

Access denied 的核心就是认证失败,99% 的情况是密码不对。先确认密码是否正确,再检查认证插件和权限表。忘记密码时,跳过权限验证是标准操作,重置后立即恢复正常启动。命令行密码警告不影响连接,但为了安全,建议改用交互式输入或配置文件。

到此这篇关于MySQL报错:Access denied for user ‘root‘@‘localhost‘解决方法的文章就介绍到这了,更多相关Access denied for user root @ localhost内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文