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;
相关推荐
Hello.Reader24 分钟前
Flink SQL Materialized Table 语句CREATE / ALTER / DROP介绍
数据库·sql·flink
Boilermaker199230 分钟前
[MySQL] 服务器架构
数据库·mysql·架构
云老大TG:@yunlaoda36035 分钟前
如何通过华为云国际站代理商CSBS进行备份策略设置?
运维·数据库·华为云
一 乐1 小时前
酒店预约|基于springboot + vue酒店预约系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
NineData1 小时前
NineData第三届数据库编程大赛:用一条SQL解数独问题
数据库·云计算·ai编程
龙之叶1 小时前
Android如何通过adb命令push文件后在媒体库中显示
android·adb
来自于狂人2 小时前
华为云Stack服务实例创建失败通用排查对照表(备考+生产故障定位必备)
服务器·数据库·华为云
墨者阳2 小时前
数据库的自我修炼
数据库·sql·缓存·性能优化
Just_Paranoid2 小时前
【Settings】Android 设备信息相关参数的获取
android·5g·wifi·ip·sn·network
qualifying2 小时前
MySQL——表的操作
数据库·mysql