MySQL登录报错ERROR 1045 (28000)的解决方法

许南星
许南星
发布时间:2026-10-13 | 2人浏览过
原创

本文旨在解决MySQL登录时报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 的问题。该错误常因数据库中存在的空用户(Anonymous User)干扰了权限验证机制所致。下面介绍如何通过停止MySQL服务、移除空用户并重启来恢复访问。

问题现象

在Linux系统中,即使已知root用户密码,使用命令 mysql -u root -p 登录时仍可能频繁出现以下报错:

[root@localhost ~]# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

这种 intermittent(间歇性)失败或部分情况下能登录的现象,往往指向身份验证表的配置异常。

解决方案原理

当MySQL的 user 表中存在 user 字段为空的用户记录时,连接请求可能会匹配到这些匿名账户,从而拒绝使用 root 身份的密码验证。我们需要以“跳过授权表”的方式进入数据库,手动清理这些空用户记录。

详细操作步骤

第1步:停止MySQL服务

为了安全地修改系统级配置,首先需要暂停正在运行的MySQL进程。根据系统环境执行以下命令:

# service mysql stop

第2步:以跳过授权模式启动MySQL

使用 mysqld_safe 启动服务,并通过参数 --skip-grant-tables 暂时忽略权限检查,允许无需密码直接访问。同时建议加上 --skip-networking 以提高安全性,仅允许本地访问。

# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &

此时后台会启动一个新的MySQL进程,由于跳过了权限验证,可以直接登录。

第3步:登录MySQL服务器

在新终端中,直接输入登录命令。由于跳过了授权表,无需输入密码即可进入命令行:

# mysql -u root mysql

第4步:定位空用户数据

进入数据库后,切换到 mysql 系统库,并查询用户表以确认是否存在空用户:

mysql> use mysql;
mysql> select user,host,password from user;

预期结果中,若发现 user 列为空的记录,即说明存在空用户问题。示例如下:

+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | %                     | mima     |
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+

第5步:删除空用户记录

找到所有 user 值为空的行并将其删除,以消除对身份验证的干扰:

mysql> delete from user where user='';

执行成功后,建议执行 flush privileges; 确保内存中的权限表同步(虽然重启也会生效,但这是个好习惯):

mysql> flush privileges;

第6步:退出并正常重启MySQL

退出当前的命令行界面,然后重新启动正常的MySQL服务:

mysql> quit
# service mysql start

完成验证

服务重启后,再次尝试使用正常命令和密码进行登录:

mysql -u root -p

若能成功进入 mysql> 提示符,则说明问题已解决。

简要总结

以上关于解决MySQL登录ERROR 1045错误的详细内容。如果在操作过程中遇到其他MySQL配置或性能优化问题,欢迎继续关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表