首先我们需要了解以下几点:
1.MySQL 登录验证的的过程:
MySQL在验证登录时会加载mysql库下的usr表,这个表存放的有登录信息,部分表结构下图
我们在命令行通过常规方式 如 set password 、alter user 等MySQL自带修改密码的命令修改的密码,或者是在创建用户时设置的密码 都是以明文的方式输入,然后服务器会通过插件进行加密存储和验证。
2. 5.7 、8.0在密码验证的不同点
①插件不同,5.7用的是mysql_native_password ,8.0用的是caching_sha2_password
② password() 加密函数在 8.0版本不能用。
③插件和加密的对应关系
版本 | 验证插件 | 加密函数 |
5.7 | mysql_native_password(默认) | password() |
8.0 | caching_sha2_password(默认) | 我不知道 |
解决思路:
第一步:跳过验证登录
1.要有超级管理员的权限
2.修改MySQL的配置文件(用来跳过验证)
vim /etc/my.cf ----windows中是 my.ini
加入如下配置
3.重启MySQL服务
systemctl restart mysqld.service
重启后直接在命令行输入 mysql 即可进入数据库。
第二步:修改 mysql.usr表中的密码和插件(以demo用户为例)
5.7版本
password()加密函数可用的情况,直接用update 修改usr表中的数据,用password加密函数进行加密
update mysql.user set authentication_string=PASSWORD('new_password') where user='demo';
8.0版本
由于不知道 caching_sha2_password 插件要用什么加密函数,所以我直接把插件给换成mysql_native_password。但此时有面临一个问题,8.0中不支持 password()加密函数,所以我们需要在5.7中先用password()加密一下我们的密码。
① 在5.7中对密码进行加密
②修改user表中的 插件和密码
update mysql.user set plugin='mysql_native_password',authentication_string='*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' where user='demo';
第三步:改回配置文件,并重启服务
1.把之前加的那句 加#注释 ,或者删除都可以
2.重启服务
systemctl restart mysqld