当前位置:   article > 正文

MySQL 8.0 修改密码的那些折腾事_update user set plugin='caching_sha2_password' whe

update user set plugin='caching_sha2_password' where user ='root';密码被清空

MySQL 8.0 修改密码过程

问题背景:安装好 MySQL 后,在初始化 root 账户密码的过程设置错了选项,导致无法登录。

step.1 进入 mysql 的命令行界面

修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件,添加 skip-grant-tables 选项使得可以以 root 账户免密码登入。

[mysqld]
#
# * Basic Settings
#
user            = mysql
# pid-file      = /var/run/mysqld/mysqld.pid
# socket        = /var/run/mysqld/mysqld.sock
# port          = 3306
# datadir       = /var/lib/mysql

# add here
skip-grant-tables
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

修改后,重启 mysql

$sudo service mysql restart
mysql -u root -p  # 直接回车进入即可
  • 1
  • 2

step.2 修改密码

踩坑一

进入 mysql 表后,使用语句修改密码提示语法错误。

mysql> use mysql;
mysql> UPDATE user SET password=password("your password") WHERE user="root";
# 提示 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '("your password") where user='root'' at line 1
  • 1
  • 2
  • 3

经查阅,发现 password 函数已在 5.7 版本中弃用,并在 8.0 版本中被删除。

踩坑二

发现 password 函数被弃用后,使用以下语句来设置明文密码,继续提示出错。

mysql> UPDATE user SET password="your password" WHERE user="root";
# 提示 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''your password' where user='root'' at line 1
  • 1
  • 2

继续查阅资料,发现 password 字段在 8.0 中已改名为 authentication_string 字段。

踩坑三

使用以下语句修改密码,修改倒是修改成功了,但还是登不上去。

mysql> UPDATE user SET authentication_string="your password" WHERE user="root";
  • 1

查看 user 表时发现,root 用户的 plugin 字段的参数为 auth_sock 。因为 auth_sock 参数的特性,使得只能在 unix 本机上登录,故更改为默认密码登录。

mysql> update user set plugin="caching_sha2_password" where user="root";
  • 1

PS:其实这时候如果 plugin 不是 auth_sock 的话,也没法登录上去。因为 user 表中存放的是明文密码,而在登录时,MySQL 会将输入的密码进行加密后再与表中的密码进行比较,这样一比较肯定是不相同的,所以就登不上去。(当然,这个只是从其他页面中看到的,没有进行验证。如果有人进行了验证,欢迎留言告诉我。)

有关 auth_sock 的特性:https://blog.csdn.net/ActionTech/article/details/109996422

有关 caching_sha2_password 的相关信息:https://www.cnblogs.com/olinux/p/13201497.html

踩坑四

查阅 MySQL 官方文档,发现了设置密码的教程页面。

https://dev.mysql.com/doc/refman/8.0/en/set-password.html

使用推荐的命令更改密码,继续提示出错。

mysql> ALTER USER user IDENTIFIED BY 'your password';
# ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
  • 1
  • 2

提示语句的大致意思是:MySQL 现在运行于附带 skip-grant-tables 选项的模式,无法执行该代码。

终于搞定

使用以下语句将 root 用户的密码设置为空后,刷新权限表。

mysql> update user set authentication_string="" where user="root";
mysql> flush privileges;
mysql> exit
  • 1
  • 2
  • 3

然后注释掉 mysqld.cnf 文件中的 skip-grant-tables 语句。

[mysqld]
#
# * Basic Settings
#
user            = mysql
# pid-file      = /var/run/mysqld/mysqld.pid
# socket        = /var/run/mysqld/mysqld.sock
# port          = 3306
# datadir       = /var/lib/mysql

# add here
# skip-grant-tables
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

重启 MySQL 后进入使用空密码登录 root 。

$sudo service mysql restart
mysql -u root -p
  • 1
  • 2

使用 8.0 推荐的更改密码语句,然后刷新权限表。

mysql> SET PASSWORD FOR 'root'@'localhost' = 'your password';
# 此时如果你设置了一些密码强弱的相关策略(policy),可能会提示你密码强度不够,设置失败啥的。重新输入一次,设置一个强密码即可。
mysql> flush privileges;
  • 1
  • 2
  • 3

MySQL 密码强度设置策略:https://blog.csdn.net/calistom/article/details/87939956


Done !

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/307931
推荐阅读
相关标签
  

闽ICP备14008679号