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