Mysql 8.0+ 版本修改 root 密码 时间: 2018-08-26 17:48 分类: mysql,数据库 今天在 Mac 上用 homebrew 自动安装了 mysql,装完后发现版本是8.0.12,整个过程就是这样子的: > brew install mysql > mysql.server start > mysql -uroot 刚装完的时候 root 账号是没有设置密码的,所以想手动设置一下密码,一开始使用如下命令: > UPDATE mysql.user SET authentication_string=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 '('你的密码') WHERE User='root'' at line 1 再次尝试第二种方法: > set password for root@localhost = password('你的密码'); 还是报同样的错误,于是想到是不是 Mysql 版本的原因,于是去官网查看文档吧,直接搜索 password 找到文档设置密码相关的地方。 发现8.0版本的 Mysql 有两种修改密码的方法,其中的一种就是上面的第二种方法,只不过密码的设置不再需要使用 password 密码加密了,查阅相关资料发现 Mysql 在`5.7.9`版本以后就废弃了`password`字段与`password()`函数了,所以`5.7.9`以后的版本直接用如下命令修改: > use mysql; > set password for root@localhost = '你的密码'; 你也可以直接这样写: > set password = '你的密码'; 上面命令修改的是当前登录用户的密码。 除了这种方法修改密码外,Mysql 官方文档中还写了另外一种修改方法,并且建议大家用这种方法来修改密码,下面是官方文档的说明: > Note > Rather than using SET PASSWORD ... = 'auth_string' syntax, ALTER USER syntax is the preferred statement for account alterations, including assigning passwords. For example: > > ALTER USER user IDENTIFIED BY 'auth_string'; 至于为什么建议大家用这种方法来修改密码也给出来解释: > Important > Under some circumstances, SET PASSWORD may be recorded in server logs or on the client side in a history file such as ~/.mysql_history, which means that cleartext passwords may be read by anyone having read access to that information. For information about the conditions under which this occurs for the server logs and how to control it, see Section 6.1.2.3, “Passwords and Logging”. For similar information about client-side logging, see Section 4.5.1.3, “mysql Logging”. 上面的意思就是说,使用`SET PASSWORD`命令来修改密码会被记录到日志文件或者 Mysql 的历史执行命令记录文件中,只要有查看这两个文件权限的用户都能够看到设置的明文密码,是存在安全隐患的,所以建议大家使用后面的方法来修改密码。 说到这里,既然 Mysql 从`5.7.9`版本以后废弃了`password`字段和`password()`函数,那么最开始的第一种修改密码的方法是否不用`password()`函数也能够修改密码呢?于是尝试了一把,执行如下命令: > UPDATE mysql.user SET authentication_string='1234567' WHERE user='root'; > flush privileges; 发现执行成功了,但结果却悲剧了,无论我用之前的密码登录还是用1234567登录,都登录不上了,真是不作死就不会死啊。。 不过不要慌,如果你和我一样出于好奇心或者错误地执行了上面的语句,解决办法也是挺简单的: 1.首先关闭`Mysql`服务,我这里以`Mac`系统为例,其他系统关闭的命令会有所不同: > mysql.server stop 2.启动`Mysql`安全模式并且关闭验证 > mysql_safed --skip-grant-tables & 3.root 跳过密码验证登录 > mysql -uroot 4.将`authentication_string`设置为空 > UPDATE mysql.user SET authentication_string='' WHERE user='root'; > flush privileges; > exit 5.重启 Mysql 服务 > mysql.server restart 6.此时 Mysql 的密码已经清除掉了,直接不用输密码回车登录 > mysql -uroot -p 7.使用之前两种修改密码的方法再次设置密码即可。 既然踩了坑,那不妨继续一探`authentication_string`的究竟,设置密码后查看该字段的值: > select authentication_string from user where user = 'root'; 结果如下: ![1.png][1] 可以看到该字段是一个加密后的值,所以之前直接用明文来更新它的值就导致登录不了 Mysql。不过好在在安全模式下可以直接将它的值置空来清除密码,安全模式跳过验证的情况下是无法执行`ALTER USER`命令来更新密码的,所以只能通过清除该字段的值来清空密码。 [1]: https://0o0.me/usr/uploads/2018/08/2171946880.png 标签: 无