MySQL8.x登陆root用户突然提示mysql_native_password的实现

 更新时间:2024年08月26日 09:16:01   作者:weixin_42151614  
本文主要介绍了MySQL 8.x登陆root用户突然提示mysql_native_password,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、在mysql 8.0x版本中,默认的加密认证方式从原来的mysql_native_password 变成了caching_sha2_password,如果我们不在my.cnf里面去设置加密认证方式的话,它默认用的就是caching_sha2_password

2、但现在有一个很奇怪的现象,不知道是何种原因,即便我们创建了用户,并且也设置了caching_sha2_password,但是它默认还是会以mysql_native_password作为认证,这样就会导致mysql_native_password模式被拒绝,因为默认情况下mysql只会接受caching_sha2_password,特别是在部分情况下,root用户的localhost也会变成mysql_native_password,那这样就会导致我们在使用mysql -uroot -p -h localhost登陆的时候直接被拒绝掉,从而显示ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded,这个具体问题不知道是什么原因导致的,后面再去定位,现在只是做个记录,如果出现了这种情况应该怎么做

3、由于我的mysql容器是以docker-compose来运行的,如果我们root用户被挡了,只能以安全模式跳过root认证,需要修改docker-compose的配置文件如下

version: '3.8'

services:
  mysql82:
    image: mysql:8.4
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /mnt/mysql/data:/var/lib/mysql
      - /mnt/mysql/logs:/var/log/mysql
      - /mnt/mysql/conf/my.cnf:/etc/mysql/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: "你自己的root密码"
      TZ: Asia/Shanghai 
      command: --skip-grant-tables

在底部添加command: --skip-grant-tables即可,然后重启容器

4、如果是宿主机安装的方式,需要停止mysql的服务,然后用安全模式启动

systemctl stop mysql

mysqld_safe --skip-grant-tables &

5、修改完毕后,登陆mysql

mysql -uroot -p 

这时候应该是不需要密码直接按回车就能进入

6、查看用户表,看下当前有哪些用户的认证模式是:mysql_native_password

USE mysql;

SELECT User, Host, plugin FROM user;

不出意外的话,如果我们root用户被挡了,那么认证模式肯定变成了mysql_native_password
但是默认情况下mysql_native_password插件又没有启动,所以我们在正常模式下会被挡在外面,这就是问题所在

但问题是我们压根就不知道mysql_native_password是如何被启动的,或者root用户为啥从原来的caching_sha2_password 变成了mysql_native_password

7、如果localhost 的root用户的认证模式变成了mysql_native_password,这也是为何我们没办法进去的原因,我们需要把它改成caching_sha2_password,这样我们就可以登录了

USE mysql;

UPDATE user SET plugin='caching_sha2_password', authentication_string='' WHERE User='root' AND Host='localhost';

FLUSH PRIVILEGES;

注意:我们这里是直接修改root的认证模式,然后authentication_string='' 设置的是一个空的字符串密码,这里不可以直接指定你的root密码,因为是明文的,mysql不允许,也不接受,所以就先保留空,等后面进入到正常模式再去修改

8、将mysql设置成正常模式

如果是docker-compose启动的,把command: --skip-grant-tables这一行推荐注释掉(万一以后还要出现直接打开即可)

然后docker-compose down  && docker-compose up -d 

宿主机安装的情况下,直接ps aux | grep "mysqld_safe --skip-grant-tables"  
把这个进程给kill掉,
然后systemctl start mysql正常启动即可

9、进入到正常模式后,由于localhost的root用户此时是空密码,直接按回车就可以进去,进去之后立即修改root的密码,密码还是可以设置成原来的,然后在改密码的时候再指定认证类型为caching_sha2_password

ALTER USER 'root'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '这里最好是设置成你原来的root密码';

10、修改完成之后,我们退出来重新登录验证一下新修改的密码能不能使用localhost登录进去

mysql -uroot -p

11、如果可以登陆的话,说明我们被挡在外面的问题就解决掉了,接下来就是把其他用户认证类型为mysql_native_password改成caching_sha2_password,这里主要是修改用户的密码和认证方式,所以修改之前最好保持和知道之前原来的密码,这样可以减少很多不必要的操作,特别是如果这个用户是某一个代码里使用的

假设root用户已经登录进来了,说明root用户的认证模式已经改回来了

接下来我们在查看一下其他用户的认证情况

USE mysql;

SELECT User, Host, plugin FROM user;

根据结果提示,把mysql_native_password的用户都改成caching_sha2_password

这里的修改认证类型主要是通过修改该用户的密码,然后再重新指定认证类型

但是在修改之前,最好将该用户的密码修改成和之前一样的,这样可以减少很多不必要的麻烦,当然你也可以使用新的自定义密码

#假如我现在需要将javatest这个用户的认证类型从原来的mysql_native_password改成caching_sha2_password,使用如下SQL语句即可,但是修改之前要看一下该用户之前授权的远程IP地址是什么,要严格的对应上,我这里是%,你们根据实际情况修改

ALTER USER 'javatest'@'%' IDENTIFIED WITH 'caching_sha2_password' BY '该用户的新密码';

#刷新权限
FLUSH PRIVILEGES;

12、到此完成

到此这篇关于MySQL 8.x登陆root用户突然提示mysql_native_password的文章就介绍到这了,更多相关MySQL 8.x登陆root用户突然提示mysql_native_password内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中any、some和all的用法实例

    MySQL中any、some和all的用法实例

    最近一直在练习MYSQL的多表查询,基本上每个查询语句我都会写至少两次,下面这篇文章主要给大家介绍了关于MySQL中any、some和all用法的相关资料,需要的朋友可以参考下
    2022-11-11
  • MYSQL中文乱码问题的解决方案

    MYSQL中文乱码问题的解决方案

    mysql是我们项目中非常常用的数据型数据库,但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况这篇文章主要给大家介绍了关于MYSQL中文乱码问题的解决方案,需要的朋友可以参考下
    2022-06-06
  • Windows平台下MySQL常用操作与命令

    Windows平台下MySQL常用操作与命令

    Windows平台下MySQL常用操作与命令,学习mysql的朋友可以参考下。
    2011-09-09
  • MySQL如何使用DATE_FORMAT()对查询结果按日、周、月分组统计

    MySQL如何使用DATE_FORMAT()对查询结果按日、周、月分组统计

    这篇文章主要介绍了MySQL如何使用DATE_FORMAT()对查询结果按日、周、月分组统计问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Linux连接mysql报错:Access denied for user ‘root’@‘localhost’(using password: YES)的解决方法

    Linux连接mysql报错:Access denied for user ‘root’@‘localhost’(usi

    这篇文章主要给大家介绍了关于Linux连接mysql数据库报错:Access denied for user ’root‘@’localhost‘(using password: YES)的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • 简单了解MySQL union all与union的区别

    简单了解MySQL union all与union的区别

    这篇文章主要介绍了简单了解MySQL union all与union的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • MySQL官方导出工具mysqlpump的使用

    MySQL官方导出工具mysqlpump的使用

    备份恢复是 DBA 绕不开的核心话题,市面上也有很多开源的备份恢复方案,不过官方的 mysqldump 一直是处于鄙视链底端的那个。终于,官方在 MySQL5.7 之后新添加了一个备份工具:mysqlpump,本文将简单的介绍该工具的使用
    2021-05-05
  • mysqldumpslow用法示例(慢查询)

    mysqldumpslow用法示例(慢查询)

    这篇文章主要介绍了mysqldumpslow是mysql自带的用来分析慢查询的工具,需要的朋友可以参考下
    2016-08-08
  • MySQL实现数据批量更新功能详解

    MySQL实现数据批量更新功能详解

    最近需要批量更新大量数据,习惯了写sql,所以还是用sql来实现,下面这篇文章主要给大家总结介绍了关于MySQL批量更新的方式,需要的朋友可以参考下
    2023-02-02
  • mysql数据库之索引详细介绍

    mysql数据库之索引详细介绍

    大家好,本篇文章主要讲的是mysql数据库之索引详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论