Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL8.x mysql_native_password

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

作者: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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文