因为在折腾某些服务,需要改改 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'@'localhost' (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'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql'; ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost'
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'@'localhost' 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'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql'; ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'localhost' 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'@'localhost' 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 以及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'@'localhost'; 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 恢复最大权限,刷新权限FLUSH PRIVILEGES;。
取消掉skip-grant-tables的配置。重启容器。祝你好运,多尝试,多刷新权限,对症下药。
以上,急死我了,很多配置都没备份呢。。。
本站由以下主机服务商提供服务支持:
0条评论