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
修改后,重启 mysql
$sudo service mysql restart
mysql -u root -p
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
经查阅,发现 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
继续查阅资料,发现 password 字段在 8.0 中已改名为 authentication_string 字段。
踩坑三
使用以下语句修改密码,修改倒是修改成功了,但还是登不上去。
mysql> UPDATE user SET authentication_string="your password" WHERE user="root";
查看 user 表时发现,root 用户的 plugin 字段的参数为 auth_sock 。因为 auth_sock 参数的特性,使得只能在 unix 本机上登录,故更改为默认密码登录。
mysql> update user set plugin="caching_sha2_password" where user="root";
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
提示语句的大致意思是:MySQL 现在运行于附带 skip-grant-tables 选项的模式,无法执行该代码。
终于搞定
使用以下语句将 root 用户的密码设置为空后,刷新权限表。
mysql> update user set authentication_string="" where user="root";
mysql> flush privileges;
mysql> exit
然后注释掉 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
重启 MySQL 后进入使用空密码登录 root 。
$sudo service mysql restart
mysql -u root -p
使用 8.0 推荐的更改密码语句,然后刷新权限表。
mysql> SET PASSWORD FOR 'root'@'localhost' = 'your password';
# 此时如果你设置了一些密码强弱的相关策略(policy),可能会提示你密码强度不够,设置失败啥的。重新输入一次,设置一个强密码即可。
mysql> flush privileges;
MySQL 密码强度设置策略:https://blog.csdn.net/calistom/article/details/87939956
Done !
|