mysql登录失败问题
前言
前几天使用账号密码的方式登录自己服务器上的mysql,突然发现被拒绝访问(之前是好的,不知道是不是因为docker重启了丢失了之前的账号配置),于是上网百度解决方案,尝试了好几篇文章的操作才解决,所以用这篇文章重新梳理下解决流程,方便以后遇到类似问题可以快速解决
解决流程
- 使用
docker exec -it <container-id> bash进入mysql容器 - 对
/etc/mysql/conf.d/docker.cnf路径下的文件进行编辑,使用echo 'skip-grant-tables' >> docker.cnf,往文件尾部追加一行skip-grant-tables - 在容器内执行
exit退出容器,并docker restart <container-id>重启容器 - 再次执行
docker exec -it <container-id> mysql进行容器,执行下flush privileges;(根据参考文章所说"不执行的话可能会提示在skip-grant-tables模式下无法修改密码",是否真是如此我没有考证) - 使用
use mysql;和select user,host,plugin from user;查询下用户表。发现没有root用户(原来root用户没了,难怪我登录不了,但是尚不清楚之前创建的root为什么丢失了) - 使用
CREATE USER 'root'@'localhost' IDENTIFIED with mysql_native_password BY 'xxxxxx';(有的文章使用的是ALTER代替CREATE,如果有root,可以使用update user set host = '%' where user = 'root'进行更新),确保root账户的host是%,plugin是mysql_native_password加密方式 - 第6步我遇到了
Operation ALTER USER failed for 'root'@'localhost'这个问题。解决步骤是: 在mysql容器里修改/etc/mysql/my.cnf文件,使用echo 'default_authentication_plugin=mysql_native_password' >> my.cnf,往文件尾部追加一行default_authentication_plugin=mysql_native_password - 重新执行上面的第6步操作,然后执行
flush privileges; - 接着使用
sed -i '$d' <filename>删除/etc/mysql/conf.d/docker.cnf里之前写的skip-grant-tables - 最后再次执行
exit退出容器,并使用docker restart <container-id>重启容器 - 重新使用
mysql -u root -p登录,登录成功
总结
过程中主要遇到的两个问题:
- Access denied for user 'root'@'localhost'
- Operation ALTER USER failed for 'root'@'localhost'
第一个问题主要原因是,我的数据库里没有root账号,所以不能登录。(root账号没了的原因我没找到)
第二个问题引入相关文献说法是:
MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_sha2_password),对此,我们将mysql用户使用的登录密码加密规则还原成mysql_native_password,即可登陆成功
所以需要select user,host,plugin from user;查询表,确认自己root的host值为%,plugin的值是mysql_native_password,并将default_authentication_plugin=mysql_native_password写入到my.cnf文件中