抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Docker Mysql Server 8.0 江湖救急瞎折腾流程

因为在折腾某些服务,需要改改 mysql 的用户密码加密方式为原始的 native,然而,我懒,用了 phpMyAdmin 的图形界面,于是就开始了折腾之旅Fucking

问题

root 用户权限错误,无法登录,密码错误等

浏览器其他服务连接时的提示:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
自己控制台使用 localhost 和 ip 登录的提示。
bash-4.2# mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)

上面的错误是不是很熟悉,新手大多会遇到吧!!!就是密码错误对吧,But,我并不是。但两种登录方式都废了咋办?关键又没有其他用户!!!简直抓狂。

解决办法

该 docker 镜像是yum 的包管理器。其余什么都没有,甚至我无法在容器中停止 sql 服务或者使用网上说的什么 mysql_safe 方式,经过一段时间的尝试,

但功夫不负有心人,让我找到了配置文件,docker 的 mysql server 配置文件位置在/etc/my.cnf,我们需要编辑配置文件,先安装编辑器,我这里装 nano

yum update
yum install nano
nano /etc/my.cnf

加上一行,注释一行

#新增来跳过授权表的授权
skip-grant-tables
#注释这行来允许 DNS 解析
#skip-name-resolve

重启 mysql 容器,接着进容器。执行登录,然后改密码,授权之类的,但是别急,你会遇到下面的各种错误。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql'; 
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mysql';
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'%'
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql';  
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> create user 'root'@'%' identified by 'mysql';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql';  
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'

呵呵呵呵呵呵呵呵。。。有史以来最多错误时。直到我看到一篇文章:解决MySQL修改密码

和我有关吗?没关,我又不是第一次设置密码。。。但是他那句先执行flush privileges;激起了我的好奇。奇迹开始发生、、、看下面的记录吧。

#重点重点
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mysql';
ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'%'

mysql> update user set host = 'localhost' where user ='root';
ERROR 1046 (3D000): No database selected

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> update user set host = 'localhost' where user ='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

咦?成了,刷新数据库,切换完数据库后,我居然改成功了 root 用户的 host。

那么接下来,继续。(root 用户都缺了,鬼知道我那时候改了什么)

mysql> create user 'root'@'%' identified by 'mysql';
Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

接着看下用户表信息:

mysql> select host, user, plugin from user;

是不是有 root 的%以及localhost 了?同时 这时候,其他服务比如 phpmyadmin 应该可以连接了(去 etc/my.conf 把skip-grant-tables,然后重启容器可以进行验证),但是呢,看不到表,或者只有一个 information_schema表,猜一猜都知道,是没权限,因为是上面自己创建的,那么有没有直接授权所有表给 root 的呢?有。参考:恢复mysql 中root 用户的所有权限

mysql> UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='root';
Query OK, 0 rows affected (0.01 sec)
Rows matched: 2  Changed: 0  Warnings: 0

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)

改完退出,去 etc/my.conf 把skip-grant-tables注释掉。现在重启容器,基本上就是 OK 了。

我这里执行的代码非常多,我能明确的就是我不是没有密码,而是有密码,无法登录并且权限有误,用户也有丢失。

总体流程

改配置文件,追加skip-grant-tables

进入容器使用mysql -u root -p登录,先刷新权限FLUSH PRIVILEGES;

切换数据库到 mysql。

检查用户的完整性,是否具备两个 root,host 分别为%以及 localhost。

创建缺失的用户,给新创建的用户授权,给 root 恢复最大权限,刷新权限FLUSH PRIVILEGES;。

取消掉skip-grant-tables的配置。重启容器。祝你好运,多尝试,多刷新权限,对症下药。

以上,急死我了,很多配置都没备份呢。。。


0条评论

发表评论