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 | sudo mysqld_safe --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!
,如果成功登录,说明密码重置成功。
注意事项
认证插件问题:
- MySQL 8.0 默认使用
caching_sha2_password
。 - 如果客户端不支持该插件(例如旧版 MySQL 客户端),登录可能会失败。可以将 root 的认证插件改为
mysql_native_password
:然后重新验证登录。1
ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY 'NewPassword123!';
- MySQL 8.0 默认使用
密码策略:
- MySQL 有默认密码策略(由
validate_password
插件控制),可能要求密码满足一定复杂性。如果密码太简单,会报错:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements- 临时降低策略:
1
2SET GLOBAL validate_password.policy = LOW;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'simplepass'; - 或使用复杂密码。
- 临时降低策略:
- MySQL 有默认密码策略(由
SELinux 或防火墙:
- 在某些系统(如 CentOS),SELinux 可能阻止 MySQL 启动。临时禁用:
1
sudo setenforce 0
- 完成后恢复:
1
sudo setenforce 1
- 在某些系统(如 CentOS),SELinux 可能阻止 MySQL 启动。临时禁用:
日志检查:
- 如果遇到问题,查看 MySQL 错误日志:
1
sudo cat /var/log/mysql/error.log
- 如果遇到问题,查看 MySQL 错误日志:
完整示例
假设你忘记了 root 密码,以下是完整操作流程:
1 | # 停止 MySQL |
验证结果
登录后运行:
1 | SELECT user, host, plugin FROM mysql.user WHERE user='root'; |
输出示例:
+------+-----------+-----------------------+
| user | host | plugin |
+------+-----------+-----------------------+
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+
确认 plugin
是 caching_sha2_password
(默认)或你修改后的插件。