从 MySQL 5.7 开始,安装 MySQL 时有时不需要创建 root 帐户或设置 root 密码。默认情况下,启动服务器时,默认密码存储在 mysqld.log 文件中。你需要使用该密码登录系统并更改密码。
第 66.1 节:服务器初始启动时发生的情况
假设服务器的数据目录为空:
- 服务器被初始化。
- SSL 证书和密钥文件在数据目录中生成。
validate_password插件被安装并启用。- 创建超级用户帐户
'root'@'localhost'。 - 超级用户的密码被设置并存储在错误日志文件中。
第 66.2 节:如何使用默认密码更改 root 密码
显示默认的“root”密码:
shell> sudo grep 'temporary password' /var/log/mysqld.log
使用生成的临时密码登录,并尽快为超级用户帐户设置自定义密码:
shell> mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass5!';
注意: 默认安装 MySQL 的 validate_password 插件。这要求密码至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符,且总长度至少为 8 个字符。
第 66.3 节:当 /var/run/mysqld(UNIX socket 文件目录)不存在时重置 root 密码
如果忘记密码,会出现错误:
$ mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
首先检查 MySQL 状态:
$ systemctl status mysql.service
如果服务正在运行,尝试使用 mysqld_safe --skip-grant-tables &,但可能遇到错误:
mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.
解决方法:
$ systemctl stop mysql.service
$ ps -eaf|grep mysql # 确保没有 MySQL 进程
$ mkdir -p /var/run/mysqld
$ chown mysql:mysql /var/run/mysqld
$ mysqld_safe --skip-grant-tables &
然后登录:
$ mysql -u root
现在可以更改密码:
mysql> FLUSH PRIVILEGES;
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');
或者:
USE mysql;
UPDATE user SET Password = PASSWORD('newpwd') WHERE User = 'root';
如果有可从任何地方连接的 root 帐户:
UPDATE user SET Password = PASSWORD('newpwd') WHERE Host = '%' AND User = 'root';
然后退出并正常重启 MySQL。