问题:
最新版的MySQL,我原来root密码是0916,然后执行了
update mysql.user set authentication_string='root123' where user='root' and host='localhost';
这样一段代码,刷新之后新密码老密码都不能用了,这是个啥情况?
开始:
原本我以为是少加了password,没加密造成的,后来发现,如果加上:
update mysql.user set authentication_string=Password('root123') where user='root' and host='localhost';
在最新的MySQL8.0版本却不能修改成功了。
然后:
先不管密码的问题了,先搞明白怎么回事,于是去mysql官网看到mysql版本8.0已经取消了password字段和password()函数,而且不在支持SET PASSWORD ... =PASSWORD('auth_string')语法:
接着:
我发现了update语句针对的是MySQL5.7之前的操作,而且在5.6和5.7中字段也发生了改变:
在5.7之前修改密码:(使用update修改user表)
update mysql.user set authentication_string=password('123456') where host='localhost' and user='root';
在5.7修改密码:(因为废除了password字段,需要使用authentication_string)
update mysql.user set password=password('123456') where host='localhost' and user='root';
而在8.0已经不能用possword函数和set...语句,只能用:
alter user 'root'@'localhost' identified with mysql_native_password by '123456';
##如遇报错,先执行flush privileges
原因:
在mysql5.7.9版本之后废弃了password字段和password()函数,并且加密方式默认不是使用mysql_native_password.
在mysql8.0以上版本中caching_sha2_password和sha256_password认证插件比mysql_native_password插件提供的密码加密更安全,并且前者加密性能更好。由于caching_sha2_password这样优秀的安全和性能特征,让他作为mysql8.0的默认首选认证插件,而并不是mysql_native_password.
所以mysql8.0默认是caching_sha2_password加密,5.7.9版本后的默认是mysql_native_password.
最后:
说一下mysql不登入修改密码:
1:在命令行输入net stop mysql命令关闭mysql服务
2:使用--skip-grant-tables选项启动mysql服务(服务器将不加载权限判断,任何用户 都能访问数据库)
在命令行输入 mysqld --skip-grant-tables
命令运行之后,用户无法再输入指令,此时如果在任务管理器中可以看到名称为 mysqld的进程,则表示可以用root用户 登录服务器了
3:打开另一个命令行窗口,输入不加密码的登录命令
mysql -u root
登录成功后可以使用update语句修改密码
修改完成后,必须使用flush privileges语句刷新权限表,这样新的密码才能生效
4:将输入mysqld --skip-grant-tables命令的命令行窗口关闭,接下来就可以使用新密码登录mysql服务器了