闲来无事,打理服务器,自己的服务器总想弄点最新的东西试试,于是搞了Java11和MySQL8,但是MySQL8新版巨坑。
首先是按照这篇文章的方法部署,结果遇到了root用户密码丢失的情况
https://blog.csdn.net/managementandjava/article/details/80039650
报错 ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)
原因是mysql老语法在新数据库中的bug,在mysql8中,大量关于权限与用户的语法失效,会提示语法错误,然而最坑的是那种不会提示语法错误,可以执行,但是会引起用户数据丢失的语法。
比如说这种直接修改数据表的语句
update user set host=’%’ where user=‘root’;
update user set plugin=‘mysql_native_password’ where user=‘root’;
修改过后就会导致密码丢失,当然不仅仅是密码丢失,用户本身也会丢失,当你grant授权时,会提示你
ERROR 1410 (42000): You are not allowed to create a user with GRANT
因为grant时如果没有发现用户会自动创建,但是新版本中不支持了,但是你明明创建了用户,当你再次创建会提示创建失败,只能删掉重新创建。
此时产生了由update了user表产生的用户数据丢失,给出丢失密码的解决方案和我认为MySQL8想让你操作的方法。
同样因为语法问题,老方法不能用了,感谢这篇文章https://blog.csdn.net/managementandjava/article/details/80039650
vim /etc/my.cnf
在末尾加入 skip-grant-tables 后,不验证密码
然后
use mysql;
update user set authentication_string=” where user=’root’;
将 authentication_string置空
接下来就注释掉 /etc/my.cnf 文件里的 skip-grant-tables
service mysqld restart
mysql -uroot -p
不用输入密码直接按回车键
登录成功
ALTER user ‘root’@’%’ IDENTIFIED BY ‘Newpassword!’;
注意我这是 ‘root’@’%’
坑点在与之前是’root’@’localhost’ 修改的密码,后来
update user set host=’%’ where user=’root’;
改成了’root’@’%’ 退出后密码就不能登录了
安装方法按开头引用的那篇文章,当进入数据库后,创建新用户,因为这样可以避免因root用户密码泄露导致的被删库留了勒索信息的事件发生
root只能本地访问,用户只能访问某些库,或者只能增加,修改,查询,不能创建用户或删除之类的。
首先先查看用户
select host,user,plugin from user;
#创建外网登录用户
%表示所有用户,localhost表示本地用户,也可写具体IP地址
create user 'username'@'%' identified by 'password';
#更改加密方式,mysql8引入了新特性 caching_sha2_password;老客户端不支持,改为mysql_native_password 方式;用update会导致用户丢失。要删掉重建。
ALTER USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
#授权
如果要外网访问所有库,就像root用户一样就这样写
grant all privileges on *.* to 'username'@'%';
授予某个库下所有表的权限
grant all privileges on onedatabase.* to 'username'@'%';
授予某个库下某个表的权限
grant all privileges on onedatabase.onetable to 'username'@'%';
授予某个库下某个表的读取权限
grant select on onedatabase.onetable to 'username'@'%';
总结,在MySQL8中,不要对user表进行任何update之类的操作,不然你会永远丢失你的用户