一次真实的排错记录:从各种报错到最终解决,涵盖 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