mysql 登录报错:ERROR 1045(28000):Access denied for user ‘root‘@‘localhost‘ (using password Yes)

本文主要针对用户名、密码正确,但是登录不了mysql的问题的分析与解决。其他情况可再参考其他的贴子或资料,本文中不会再做过多介绍。

一:报错图片信息

问题分析:

提示信息翻译:错误 1045(28000):用户 'root'@'localhost' 的访问被拒绝(使用密码:是)

从翻译过来的错误信息中,我们可知数据库拒绝了我们的访问,才导致我们不能正常访问它。那么究竟是什么原因导致它给我们反馈了这个提示信息呢?我查阅了一些贴纸,出现这种问题的原因有以下:

  1. 用户密码或用户信息错误

  2. 缺少权限

3......(其他后续)

但是根据我的实际情况,我的问题原因不在以上之列,所以还是得具体问题,具体分析。我这里遇到的问题是用户名、密码正确,但是登录mysql却登录不了,总是返回用户访问被拒绝,也就是上边图片中的错误。

二:问题分析

  1. 根据我出现的问题,我猜测可能是密码过期了,于是我想尽办法去修改用户密码(根据各种up主提供的材料),但最终还是没有解决。

  2. 查询用户

用过跳过mysql的方式,进入数据库后,使用以下语句查询用户信息

复制代码
select user,host from user;

查询后发现,user表中没有了root 用户,因此导致了使用root用户登录系统被拒绝。那么是什么原因导致了root用户丢失呢?

三:解决办法

针对丢失了root用户导致mysql登录被拒绝的问题的解决办法

  1. 停止mysql服务

    net stop mysql

2.在my.ini中增加skip-grant-tables 参数,如果启动服务后服务又立即停止,则需要增加shared-memory 参数 ,此步骤主要是为了免密登录mysql(PS 此步骤可以直接 在cmd中直接输入:mysqld --console --skip-grant-tables --shared-memory)

(1)在my.ini中配置(shared-memory在启动服务后如果服务自动停止)

(2)在命令行编辑器中直接使用mysqld --console --skip-grant-tables --shared-memory

以上两种都能够免密进入到mysql,只是第二种需要一个单独的命令行编辑器中启动,并且不能关闭命令行编辑器。可根据实际情况进行选择

  1. 使用mysql -u root 命令直接进入mysql中
  1. 进入mysql后,需要使用use mysql命令切换到mysql数据库
  1. 进入mysql后,使用select user,host from user;语句查询用户表中有哪些用户,正常情况下user表中应包含以下用户信息:

如果查询的结果中没有root用户,则root用户可能已经丢失了。

此时可使用以下命令创建root 用户

复制代码
# 创建sql
create user 'root'@'localhost' identified by '123456';
# 如果执行此语句报错,提示"The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement" 此时需要使用flush privileges;语句刷新,刷新后可执行create 语句。
# 当然如果不使用create 创建,那么可以使用insert into 语句将用户信息插入user表内,具体如下:
insert into user(User,authentication_string,ssl_cipher,x509_issuer,x509_subject) values('root','','','','');

6 分配权限:

复制代码
# 分配权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@localhost WITH GRANT OPTION;
  1. 更新user表(设置mysql允许其他主机访问)

    update user set host='%' where user='root';

更新成功后建议使用flush privileges;刷新一下

以上步骤完成后使用quit退出mysql,然后停止mysql服务,在配置文件中注释掉之前加的参数(如果是直接采用在cmd中输入mysqld --console --skip-grant-tables --shared-memory的方式进入的,直接关闭当前的cmd窗口,然后启动服务即可),然后再启动服务。当mysql服务重新启动成功后,使用mysql -u root -p 并输入密码的方式可成功访问mysql

四:mysql设置密码永久不过期

此章节,主要用户验证以上问题是否是密码过期问题导致

复制代码
# 设置密码永久不过期
alter user 'root'@'localhost' password expire never;
# 注意 如果host被更改为% ,则需要使用以下语句进行设置,否则系统会报"ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'"的错误
alter user 'root'@'%' password expire never;
相关推荐
alexhilton5 小时前
将应用迁移到Navigation 3:痛点、加班和紧急修复
android·kotlin·android jetpack
这个DBA有点耶9 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
杉氧10 小时前
Navigation Compose 深度实践:如何优雅地串联起你的全栈 App?
android·架构·android jetpack
这个DBA有点耶11 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技11 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend12 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
雨白13 小时前
指针与数组的核心机制
android
ClouGence15 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
黄林晴18 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋19 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android