分类: MySQL

  • MySQL 8.4 忘记root密码怎么办

    MySQL 8.4 忘记root密码怎么办

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