Javascript is required!

MySQL 8.4 忘记root密码怎么办

LinuxMySQL
032

一次真实的排错记录:从各种报错到最终解决,涵盖 MySQL 8.0 与旧版本的核心差异

前言

如果你还在使用 UPDATE user SET password=PASSWORD('123456')... 这种老掉牙的命令来修改 MySQL 8.0 的密码,那这篇文章就是为你准备的。

本文记录了我在 MySQL 8.4.8 上忘记密码后的完整排错过程,遇到的每一个错误都有对应的解决方案。

环境说明

  • MySQL 版本:8.4.8 (Linux/Ubuntu)
  • 操作系统:Ubuntu 24.04+
  • 问题:root 密码遗忘,且错误地配置了 mysql_native_password 插件

常见错误速查表

错误信息原因解决方案
ERROR 1064...syntax...PASSWORD('123456')MySQL 8 已移除 PASSWORD() 函数使用 ALTER USER 语法
ERROR 1396 (HY000): Operation ALTER USER failed--skip-grant-tables 模式下未刷新权限先执行 FLUSH PRIVILEGES;
ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded用户被错误配置为使用未加载的认证插件修改 plugin 为 caching_sha2_password
ERROR 1819 (HY000): Your password does not satisfy...密码强度不符合 MySQL 8 的策略使用强密码或临时调低策略

完整解决步骤

第一步:停止 MySQL 服务

sudo systemctl stop mysql

第二步:以跳过权限表模式启动

找到你的mysqld配置文件 一般在/etc/mysql/下面
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# mysqld.conf
[mysqld]
skip-grant-tables 

# 启动服务
sudo systemctl start mysql

第三步:免密码登录

# 输入任意密码
mysql -uroot -p

第四步:修复用户认证插件并清空密码

-- 必须最先执行,否则无法修改用户表
FLUSH PRIVILEGES;

-- 查看当前 root 用户状态
SELECT User, Host, plugin, authentication_string FROM mysql.user WHERE User='root';
-- 我这里错误的修改了插件所以需要这样执行
-- 修复:将 plugin 改为 MySQL 8 默认的 caching_sha2_password,并清空密码
UPDATE mysql.user SET plugin='caching_sha2_password', authentication_string='' WHERE User='root';

-- 一般执行
UPDATE mysql.user SET authentication_string='' WHERE User='root'

-- 再次刷新权限
FLUSH PRIVILEGES;

-- 退出
EXIT;

第五步:正常重启 MySQL

sudo systemctl start mysql

第六步:用空密码登录并设置新密码

mysql -uroot -p
-- 设置新密码(MySQL 8 会自动使用 caching_sha2_password)
-- 注意你的root的host是不是`localhost`我的是`%`
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';

-- 刷新权限
FLUSH PRIVILEGES;

-- 退出
EXIT;

第七步:还原配置文件并登录

# 去掉skip-grant-tables后
sudo systemctl restart mysql

mysql -uroot -p