D:\MYSQL\mysql-8.0.24-winx64>mysql -u root -p Enter password: *************** ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
时间: 2025-05-31 07:51:16 浏览: 21
### 解决方案
#### 错误描述
当尝试通过 `root` 用户登录 MySQL 数据库时,如果出现错误提示 `ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)`,这通常表明存在身份验证问题。
---
#### 原因分析
该错误的主要原因可以归纳为以下几个方面:
1. **密码不匹配**
如果输入的密码与存储在 MySQL 中的实际密码不符,则会触发此错误。即使用户认为自己输入的是正确密码,也可能由于字符编码、大小写敏感或其他因素导致实际值不同[^1]。
2. **权限不足**
即使密码正确,但如果用户的权限设置不允许其从特定主机(如 `localhost` 或其他 IP 地址)登录,也会引发此类错误[^3]。
3. **MySQL 配置文件冲突**
若 MySQL 的配置文件(如 `my.cnf` 或 `my.ini`)中包含了错误的参数或路径,可能导致服务启动异常或认证机制失效。
4. **插件限制**
自 MySQL 5.7 起,默认的身份验证插件更改为 `caching_sha2_password`,而某些客户端可能无法支持这种新协议。如果不兼容,可能会表现为 “password mismatch” 类型的错误[^2]。
5. **网络连接问题**
尽管题目提到的是本地 (`localhost`) 连接,但仍需确认是否存在防火墙阻止、端口占用等问题[^1]。
---
#### 排查方法
以下是针对上述每种可能性的具体排查手段:
##### 方法一:重设 Root 密码
可以通过跳过授权表的方式重新设定 root 密码:
```bash
# 停止当前运行的服务
sudo systemctl stop mysql
# 启动临时实例并忽略权限控制
sudo mysqld_safe --skip-grant-tables &
# 使用无密码方式进入数据库管理界面
mysql -u root
# 更新 root 用户的新密码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
EXIT;
# 正常重启服务
sudo systemctl start mysql
```
##### 方法二:检查 Host 权限分配
执行以下 SQL 查询来查看现有账户及其允许访问范围:
```sql
SELECT User, Host FROM mysql.user WHERE User='root';
```
假如发现缺少对应于目标机器地址(比如 `%`, 表示任意位置可连入)记录的话,则应该补充创建相应条目:
```sql
CREATE USER 'root'@'%' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
```
##### 方法三:调整默认认证算法
对于那些老版本驱动程序来说,切换回旧版加密模式可能是必要的解决方案之一:
编辑 `/etc/mysql/my.cnf` 文件,在 `[mysqld]` 下增加下面一行内容保存退出后再重启服务即可生效。
```ini
default_authentication_plugin=mysql_native_password
```
##### 方法四:验证环境变量影响
有时外部定义好的 `$MYSQL_PWD` 变量会影响命令行工具的行为表现形式;因此建议先清除再试一次看看效果如何变化?
```bash
unset MYSQL_PWD && mysql -uroot -p
```
---
#### 示例代码修正
基于 Node.js 应用场景下的案例修改如下所示:
```javascript
const mysql = require('mysql');
let connection = mysql.createConnection({
host : '127.0.0.1', // 显式指定 IPv4 循环接口而非域名解析 localhost
port : 3306,
user : 'root',
password : 'correct_root_password_here',
database : 'test'
});
connection.connect((err) => {
if(err){
console.error(`Error connecting to DB ${err.stack}`);
return;
}
console.log("Connected!");
});
// 测试查询操作...
connection.query('SELECT NOW() as current_time;',(error,result)=>{
if(error){throw error;}
console.table(result);
})
.connection.end();
```
---
### 总结
综上所述,解决 ERROR 1045 的核心在于逐一排除潜在隐患点直至找到根本诱因为止。无论是简单的密码遗忘还是复杂的系统级干扰源都需要耐心细致地去甄别处理才行哦!
阅读全文
相关推荐


















