彻底解决MySQL ERROR:Access denied for user `root`@`localhost` (using password:YES)

149 阅读3分钟

MySQL在使用过程中,可能会遇到登录问题,比如常见的错误信息:“Access denied for user ‘root’@‘localhost’ (using password: YES)”。

本文将分析这个问题的可能原因,并提供一系列解决方案。 如果3种方案都无法解决这个问题,你可能遇到了和博主一样的问题,最后会补充

出现这个Access denied问题的原因有如下可能:

  • MySQL的服务器停止了。
  • 用户的端口号或者IP导致拒绝访问。
  • MySQL的配置文件错误(通常是my.cnf或my.ini)。
  • root用户的密码错误。
  • 权限问题:用户可能没有足够的权限登录。

方案一:重设root密码(适用于忘记密码)

步骤1:停止MySQL服务

Linux系统:

sudo systemctl stop mysql
# 或
sudo systemctl stop mysqld

Windows系统:

net stop mysql
# 或在"服务"管理器中手动停止

步骤2:以跳过权限表模式启动MySQL

Linux系统:

sudo mysqld_safe --skip-grant-tables &

更通用的方法(推荐): 编辑配置文件 /etc/my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 段落下添加:

skip-grant-tables

保存后重启MySQL服务:

# Linux
sudo systemctl restart mysqld

# Windows
net start mysql

步骤3:免密码登录MySQL

mysql -u root

步骤4:重设密码

-- 选择mysql数据库
USE mysql;

-- MySQL 5.7及以上版本使用:
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

-- 如果ALTER命令失败,尝试直接更新用户表:
UPDATE user SET authentication_string=PASSWORD('你的新密码') WHERE User='root';

-- 刷新权限
FLUSH PRIVILEGES;

步骤5:恢复正常模式

  1. 移除配置:编辑配置文件,删除或注释掉 skip-grant-tables
  2. 重启服务
# Linux
sudo systemctl restart mysql

# Windows
net stop mysql
net start mysql

方案二:检查并修复用户权限

如果密码正确但仍无法登录,可能是权限表损坏。

查看root用户当前权限

SHOW GRANTS FOR 'root'@'localhost';

修复权限(需root登录)

如果权限缺失,执行:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

方案三:快速修复小技巧

方法:使用init-file参数

如果不想手动修改配置文件,可以在启动时指定初始化文件:

步骤1:创建一个SQL文件(如 /tmp/reset.sql):

ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;

步骤2:启动MySQL时执行:

mysqld --init-file=/tmp/reset.sql &

步骤3:成功后删除该文件,并正常重启MySQL。


常见问题排查

问题现象可能原因解决方案
ERROR 1045 (28000)密码错误或用户不存在使用方案一重置密码
ERROR 1290 (HY000)处于skip-grant-tables模式重启MySQL并移除该配置
无权限执行操作权限不足或权限表未刷新执行 FLUSH PRIVILEGES;
远程无法连接root仅允许localhost登录创建 root'@'%' 用户或修改Host字段

还有一种可能,我在尝试了上述三种方法之后都无法解决,最后发现,本地电脑同时运行了两个MySQL实例,我修改的其中一个实例,但是连接验证的确实另外一个实例!导致一直失败,所以这时候停止多余的那个实例即可,最终解决了这个问题。

希望这篇文章对大家有帮助,谢谢阅读