相信很多同学应该和我一样在使用 Linux 服务器 MySQL8.0 时,常会遇到忘记 root 管理员密码的问题。MySQL8.0 自带高强度密码校验插件,重置过程和 5.7 版本存在明显区别,网上很多旧教程使用mysqld_safe命令,在新版系统会直接提示命令不存在,本文提供一套适配 systemd、无废弃命令、全程可复现的标准化重置流程,同时解决重置时密码策略报错问题。
一、分步重置操作流程
步骤 1:停止 MySQL 数据库服务
MySQL 运行状态下无法跳过权限校验,先执行停机命令:
systemctl stop mysqld执行完成后可输入systemctl status mysqld确认服务状态为 inactive。
步骤 2:后台启动无权限校验的 MySQL 进程
新版 MySQL8.0 已移除mysqld_safe工具,直接使用mysqld原生参数跳过权限表,后台运行:
mysqld --skip-grant-tables --user=mysql &参数解释:
--skip-grant-tables:跳过账号密码校验,免密登录数据库;--user=mysql:使用系统内置 mysql 用户运行进程,避免文件权限报错;&:后台运行进程,不占用当前终端。
补充:若提示
mysqld: command not found,执行find /usr -name mysqld查找程序绝对路径,用完整路径执行命令。
步骤 3:免密登录 MySQL 客户端
进程启动完成后,直接执行登录命令,无需账号密码:
mysql -uroot正常进入mysql>命令行交互界面,代表跳过权限模式启动成功。
步骤 4:刷新权限(必做关键步骤)
跳过权限模式下,系统未加载用户权限表,直接修改密码会持续抛出 1819 密码策略报错,必须先执行刷新权限语句:
sql
FLUSH PRIVILEGES;步骤 5:修改 root 管理员密码(两种方案任选)
方案 A:设置符合 MySQL 默认策略的复杂密码(推荐,生产环境使用)
MySQL8.0 默认 MEDIUM 密码规则:长度≥8 位,包含大写字母、小写字母、数字、特殊符号四类中至少 3 类。 合规示例密码:Niit@1234执行修改语句:
sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Niit@1234';方案 B:临时降低密码策略,设置简单密码(仅测试环境)
如果本地测试环境想使用123456、niit@1234这类简单密码,执行以下语句临时放宽校验规则:
sql
-- 降低密码校验等级 SET GLOBAL validate_password.policy = LOW; -- 修改最短密码长度为4位 SET GLOBAL validate_password.length = 4; -- 取消大小写、特殊符号强制校验 SET GLOBAL validate_password.mixed_case_count = 0; SET GLOBAL validate_password.number_count = 0; SET GLOBAL validate_password.special_char_count = 0; -- 执行简单密码修改 ALTER USER 'root'@'localhost' IDENTIFIED BY 'niit@1234';注意:重启 MySQL 服务后,密码策略会自动恢复严格模式,仅当前会话生效。
步骤 6:退出数据库,关闭临时 MySQL 进程
密码修改完成后,退出 mysql 客户端:
sql
exit;杀掉后台跳过权限校验的 mysqld 进程:
pkill mysqld步骤 7:正常启动 MySQL 服务,验证新密码登录
- 启动标准 MySQL 服务
systemctl start mysqld- 使用新密码登录验证
mysql -uroot -p回车后输入刚才设置的密码,能正常进入数据库即代表重置完成。
补充:
如何查询mysql版本
mysql --version如何查看当前系统密码规范
SHOW VARIABLES LIKE 'validate_password%';