mysql8.0重置root密码

在 MySQL 8.0 中重置 root 密码的过程与早期版本略有不同,主要因为默认认证插件从 mysql_native_password 变成了 caching_sha2_password,并且安全机制有所增强。


前提条件

  • 你有服务器的管理员权限(例如通过 sudo 或 root 用户)。
  • MySQL 服务正在运行或可以被启动。

重置 root 密码步骤

步骤 1:停止 MySQL 服务

在服务器上停止 MySQL 服务,以确保后续操作不会受到干扰:

1
sudo systemctl stop mysql

或:

1
sudo service mysql stop

步骤 2:以跳过授权表模式启动 MySQL

启动 MySQL 并跳过权限验证,这样可以无需密码登录:

1
2
sudo mysqld_safe --skip-grant-tables &
sudo mysqld_safe --defaults-file=/etc/my.cnf --skip-grant-tables &
  • --skip-grant-tables:跳过用户权限检查。
  • &:让进程在后台运行。

如果 mysqld_safe 不可用(某些发行版已移除),可以直接使用 mysqld

1
sudo mysqld --skip-grant-tables &

启动后,你应该看到 MySQL 开始运行的输出。如果有错误(例如端口冲突),请检查日志(通常在 /var/log/mysql/error.log)。

步骤 3:连接到 MySQL

以 root 用户身份连接到 MySQL,无需密码:

1
mysql -u root

成功后,你会进入 MySQL 命令行:

Welcome to the MySQL monitor.  Commands end with ; or \g.
mysql>

步骤 4:刷新权限表(可选)

在 MySQL 8.0 中,跳过授权表模式可能需要手动刷新权限表:

1
FLUSH PRIVILEGES;

步骤 5:重置 root 密码

MySQL 8.0 使用 ALTER USER 命令修改密码,而不是 SET PASSWORD(后者仍可用但不推荐)。执行以下命令:

1
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
  • 'root'@'localhost':指定 root 用户及其主机(本地登录通常是 localhost)。
  • 'NewPassword123!':新密码,建议包含大小写字母、数字和特殊字符以满足默认密码策略。

如果你的 root 用户主机不是 localhost(例如 % 或特定 IP),可以通过以下命令确认:

1
SELECT user, host FROM mysql.user WHERE user='root';

然后根据实际主机修改:

1
ALTER USER 'root'@'%' IDENTIFIED BY 'NewPassword123!';

步骤 6:退出并停止 MySQL

退出 MySQL 客户端:

1
EXIT;

停止跳过授权表模式的 MySQL 进程:

1
sudo pkill mysqld

或:

1
sudo killall mysqld

步骤 7:正常启动 MySQL 服务

以正常模式重新启动 MySQL:

1
sudo systemctl start mysql

或:

1
sudo service mysql start

步骤 8:验证新密码

使用新密码登录验证:

1
mysql -u root -p

输入 NewPassword123!,如果成功登录,说明密码重置成功。


注意事项

  1. 认证插件问题

    • MySQL 8.0 默认使用 caching_sha2_password
    • 如果客户端不支持该插件(例如旧版 MySQL 客户端),登录可能会失败。可以将 root 的认证插件改为 mysql_native_password
      1
      ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'NewPassword123!';
      然后重新验证登录。
  2. 密码策略

    • MySQL 有默认密码策略(由 validate_password 插件控制),可能要求密码满足一定复杂性。如果密码太简单,会报错:
      ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
      • 临时降低策略:
        1
        2
        SET GLOBAL validate_password.policy = LOW;
        ALTER USER 'root'@'localhost' IDENTIFIED BY 'simplepass';
      • 或使用复杂密码。
  3. SELinux 或防火墙

    • 在某些系统(如 CentOS),SELinux 可能阻止 MySQL 启动。临时禁用:
      1
      sudo setenforce 0
    • 完成后恢复:
      1
      sudo setenforce 1
  4. 日志检查

    • 如果遇到问题,查看 MySQL 错误日志:
      1
      sudo cat /var/log/mysql/error.log

完整示例

假设你忘记了 root 密码,以下是完整操作流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 停止 MySQL
sudo systemctl stop mysql

# 以跳过授权表模式启动
sudo mysqld_safe --skip-grant-tables &

# 连接 MySQL
mysql -u root

# 在 MySQL 中执行
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
mysql> EXIT;

# 停止 MySQL
sudo pkill mysqld

# 正常启动
sudo systemctl start mysql

# 测试登录
mysql -u root -p
Enter password: NewPassword123!

验证结果

登录后运行:

1
SELECT user, host, plugin FROM mysql.user WHERE user='root';

输出示例:

+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

确认 plugincaching_sha2_password(默认)或你修改后的插件。