我使用的是 docker,但是这一期主要是讲解 mysql8 版本修改密码,我相信 linux、windows 和不使用 docker 应该都是可以的。
先说一下我的情况:
我在本地 windows 玩 docker 部署 mysql8.0.25 版本,无问题啦~
然后我在 linux 里面玩,我个人认为,配置流程都是一样的,虽然说也过了有半个月的样子,但是 应该是差不多的。。。
然后出现了这样的问题:
docker 中 mysql 容器启动成功,正常运行,没有报错 没有任何异常。
我在我本地也使用了 Navicat Premium 工具进行连接的,提示:
" Access denied for user 'xxxx'@'xxxx' (using password: YES)"
我在想,会不会是配置问题,没有开启外网可连接,等等假象。
然后我去检查,发现,配置文件 my.cnf 是默认的,我并没有修改, 也开启了 外网可以连接。
那么到底是什么问题?
随后,我打算先进入 docker 容器:
docker exec -it 容器名/容器ID bash
然后连接 mysql
mysql -u root -p
然后输入密码,当我输入后,返回这样的提示:
Access denied for user 'root'@'localhost' (using password: YES)
还是说,用户访问被拒绝。。
我想,是不是我密码输出了,当我去看我初始化的密码(我都删除容器 重新运行好几次了),甚至粘贴复制,还是错误的。
也是尝试百度,各种看资料,给的参考答案是:
重置密码!
what???
行吧,我服软,毕竟纠结了半天,来试试重置一个新的密码
在重置密码的过程中,我特地查阅了一下资料,"说是 mysql 5的版本,和现在 mysql 8的版本,密码的规则是不一样的,所以修改密码的语句,也是不一样的"
首先,我们无法进入 mysql,就是上面会给出错误提示的,那么我们修改密码就无法下手了。
所以,我们要去配置文件 my.cnf 中做手脚
在 my.cnf 文件中,加入:
skip-grant-tables
这一条,就可以不用使用密码,而进行登录了。
不过我尝试了,远程连接的情况下,就是我在本地 windows ,连接 linux 的 mysql 还是不行。
而是在 linux 下进入 docker 的 mysql 容器,就可以不输入密码。
换句话说,就是 mysql 在你哪个 环境系统里,你就在那个环境里,使用命令进入:
mysql -u root -p
还是会弹出输入密码:
这时候,并不需要再输入密码了,直接按回车键就可以了
当我们进来 mysql 服务后,就可以在这里面修改密码了。
首先 我们先连接 mysql 数据库
同学们可以看到,在我们 输入的光标前面,有一个 "mysql>"
其实,这并不是说 我们默认指向的是 mysql 数据库,所以我们需要先连接到 mysql 数据库
这样说可能有点不明白,先看看我们当前有哪些数据库:
show databases;
能看到,里面有个 mysql 数据库的,我们连接它
use mysql;
这样的话,就是说,我们连接到了 mysql 数据库,就可以查看 mysql 数据库里的所有表:
show tables;
就会显示出所有的表,最主要的就是这个 user 表,因为我们是做密码修改。
我们先查看这个表的几个关键字段:
select Host,User,authentication_string from user;
其中,密码我打了马赛克。然后就是 Host 中第一行,应该是 "%", 这里突然变成这样,我暂时也不知所措。。
之所以会打马赛克,是因为 我在此之前,已经修改好了密码,而且密码 即使加密了,也建议不要暴露喔~
好了,我们开始修改密码
首先,先将这个密码设置为空
update user set authentication_string='' where user='root';
再刷新权限
flush privileges;
最后就是修改成我们想要的密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY "123456";
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY "123456";
上面这是两段修改语句。
为啥是两段呢? 第一段,是针对 User = root,Host = localhost 这一行的数据,localhost 这个就是说,修改的是我们本地登录的密码。
如果仅修改了这一行,那么我们在 外网连接时,还是连接不进来的。
所以我们就需要用到第二行 User = root,Host = %
% 的意思,就是说 所有的 任意的,所以外网也就可以用这一行的密码连接。
最后我们再刷新一下权限:
flush privileges;
退出容器,找到 mysql的配置文件 my.cnf 将之前的 "skip-grant-tables" 给删除掉
重启 mysql 容器/服务
无论是内网还是外网,都可以使用我们刚刚设置的密码进行访问了。