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

相关推荐
NineData12 小时前
NineData 社区版 V5.4.0 上线:715 条复制对比链路,AI Agent 新增表结构设计发布能力
大数据·数据库·人工智能·mysql·数据库管理工具·ninedata·数据库迁移工具
Java爱好狂.12 小时前
阿里1658页Java面试题总结(含答案)
java·后端·高并发·架构师·java面试·java面试题·java八股文
Thanks_ks12 小时前
从 0.1+0.2 不等于 0.3 说起:聊聊浮点数精度问题
java·python·数值计算·精度丢失·bigdecimal·浮点数·ieee754
云策数链13 小时前
用友 T+Cloud / U8 项目交接时的账套健康度核查清单
数据库·oracle·erp·用友·云策数链
Tt有了t13 小时前
Redis的数据结构
数据结构·数据库·redis
海鸥-w13 小时前
区域名称同步存储实现笔记
java·笔记
ss27313 小时前
PostgreSQL咨询锁的使用
数据库·postgresql
ycydynq13 小时前
django 添加信息时,对外键设置条件
数据库·python·django
Rain的Java大神之路13 小时前
LeetCode 21 合并两个有序链表:一道 Easy 题,凭什么刷掉一半候选人?
java·后端·算法
小白的码BUG之路13 小时前
K8S -- 集群搭建环境基础
java·服务器·kubernetes