MySQL 报错:Access denied for user ‘root‘@‘localhost‘ 详解

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. 确认密码是否正确

bash 复制代码
mysql -u root -p

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

  • 空密码(直接回车)
  • root
  • 123456
  • 安装 MySQL 时设置的密码

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

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

bash 复制代码
# Linux
grep 'temporary password' /var/log/mysqld.log

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

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

bash 复制代码
# 指定端口
mysql -u root -p -P 3306

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

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

4. 检查环境变量

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

bash 复制代码
echo %MYSQL_PWD%

如果有值,清掉它:

bash 复制代码
set MYSQL_PWD=

四、忘记密码怎么办

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

Windows 下重置

第一步:停止 MySQL 服务

bash 复制代码
net stop mysql

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

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

bash 复制代码
mysqld --skip-grant-tables --console

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

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

bash 复制代码
mysql -u root

此时不需要密码。

第四步:重置密码

MySQL 8:

sql 复制代码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

MySQL 5.7:

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

第五步:重启 MySQL 服务

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

bash 复制代码
net start mysql

用新密码连接验证。

Linux 下重置

bash 复制代码
# 停止服务
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 驱动不兼容,可能表现为"密码正确但认证失败"。

修改认证插件:

sql 复制代码
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 连接的权限。

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

sql 复制代码
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

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

sql 复制代码
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 历史中。

推荐方式:

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

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

my.cnf 内容:

ini 复制代码
[client]
user=root
password=你的密码

并设置文件权限:

bash 复制代码
chmod 600 /path/to/my.cnf

八、总结

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

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

bash 复制代码
mysql -u root -p

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

  • 空密码(直接回车)
  • root
  • 123456
  • 安装 MySQL 时设置的密码

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

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

bash 复制代码
# Linux
grep 'temporary password' /var/log/mysqld.log

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

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

bash 复制代码
# 指定端口
mysql -u root -p -P 3306

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

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

4. 检查环境变量

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

bash 复制代码
echo %MYSQL_PWD%

如果有值,清掉它:

bash 复制代码
set MYSQL_PWD=

四、忘记密码怎么办

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

Windows 下重置

第一步:停止 MySQL 服务

bash 复制代码
net stop mysql

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

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

bash 复制代码
mysqld --skip-grant-tables --console

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

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

bash 复制代码
mysql -u root

此时不需要密码。

第四步:重置密码

MySQL 8:

sql 复制代码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

MySQL 5.7:

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

第五步:重启 MySQL 服务

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

bash 复制代码
net start mysql

用新密码连接验证。

Linux 下重置

bash 复制代码
# 停止服务
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 驱动不兼容,可能表现为"密码正确但认证失败"。

修改认证插件:

sql 复制代码
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 连接的权限。

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

sql 复制代码
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

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

sql 复制代码
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 历史中。

推荐方式:

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

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

my.cnf 内容:

ini 复制代码
[client]
user=root
password=你的密码

并设置文件权限:

bash 复制代码
chmod 600 /path/to/my.cnf

八、总结

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

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

相关推荐
一个有温度的技术博主2 小时前
深拷贝和浅拷贝:一次“搬家”事故
java·后端
鱼宵2 小时前
Spring AI 生产化改造:记忆落 Redis、向量落 ES,重启再也不丢
人工智能·redis·spring·elasticsearch·springai
for_ever_love__2 小时前
Redis 数据类型全景:五种基础类型怎么用、什么时候用
数据库·redis·数据类型·hash·使用场景·zset·排行榜
SmartSoftHelp开发辅助优化2 小时前
SmartSoftHelp DeepCore XSuite Pro Global Eco AIAgent 2026.V29 专业国际版
数据库·oracle
程序员清风2 小时前
AI时代建议学点自己真正感兴趣的!
java·后端·面试
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: Nacos 配置热更新
java·spring·spring cloud
honsor2 小时前
以太网温湿度传感器:RJ45直连机房的环境监控新方案
运维·网络·数据库·物联网·安全·云计算·github
西索斯coding2 小时前
Kimi k2.7-code-highspeed 接入 Cline 教程:baseURL 路由变更 + model_id 正确写法
java·服务器·数据库·ai
浪子明X3 小时前
MongoDB 迁移方案评审:用双写窗口和回放样本控制切换风险
数据库·mongodb