写这篇博客的是因为现在很多都是基于5.7版本的,而且对一些细节讲得不清楚。
很多文章说要先删除mariadb,其实不用的,现在安装了MySQL就会自动被覆盖。
首先就是下载:
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql80-community-release-el7-3.noarch.rpm
这里多说一句,我看到有小白在别人5.7的博客上问为什么下载不了,因为url会随版本更新变化,这个要自己去官网上看https://dev.mysql.com/downloads/repo/yum/.
然后安装
yum -y install mysql-community-server
安装完了开启服务
systemctl start mysqld.service
看默认密码是多少
grep "password" /var/log/mysqld.log
然后就用默认密码登录
mysql -uroot -p
而我在这一步出了问题,提示access deny!
其他博客的方法都是在/etc/my.cnf
里加skip-grant-tables
,这是对的,但是按着做还是有问题,原因就是细节不对,这里我详细一点
首先把服务停掉(重要)
systemctl stop mysqld.service
然后把skip-grant-tables
加到/etc/my.cnf
。
然后在开启服务!
这样打开数据库:
mysql -uroot
这样是不需要密码的,而我们的目的正是设置密码
别的教程会告诉你输grant all privileges on *.* to 'root'@'localhost' identified by '新密码' with grant option;
这是对的,但是它是5,7版本的,不适用于8.0。
正确的方法是:
首先重新加载一下授权表
FLUSH PRIVILEGES;
然后还是不急改密码,先看下用户表再说!
select user,host from user;
结果是:
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
而官网https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html告诉我们这么写:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
道理上没毛病,但是我的root用户的host不是localhost 而是 %,那我就应该这么写:
ALTER USER 'root'@'%' IDENTIFIED BY 'MyNewPass';
因为我们没有改安全规则什么的,所以密码要设的符合安全要求,得同时有大小写特殊符号数字,还得大于8位。
然后保险起见我们反复操作一下:
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED BY 'MyNewPass';
exit;
退出MySQL,再次关闭mysqld服务
然后把/etc/my.cnf
恢复原状!
然后再开启服务,用你的新密码登录,发现可以登录成功了!
总结一下我遇到的问题就是
- 没有正确的停止/开启服务,启停发生在修改配置文件前后,或许只有我这样憨憨修改配置文件不关服务。
- 改密码时照搬官方文档,其实应该根据自己的情况变化一下的。
- 没有把配置文件恢复原状,如果你的配置文件里带着
skip-grant-tables
会导致很多功能不能正常使用,所以一定要恢复原状。很多教程没有写这一点,这个也是根据官方文档传达的精神摸索出来的,官方文档的说法是先带--skip-grant-tables
参数启动服务,再改了密码,关闭服务,再正常启动服务。但是我带了--skip-grant-tables
参数也没有启动成功,可能需要其他参数吧,有点没看懂,但是结合修改配置文件的方法也就成功了,因为原理是一样的。