从 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。