mysql初始密码忘记后的重置流程详解

7次阅读

MySQL 初始密码忘记后必须通过 skip-grant-tables 跳过权限验证重置:先在 [mysqld] 段添加该参数并重启服务,再无密码登录执行对应版本的密码修改语句(5.7 用 UPDATE+PASSWORD(),8.0+ 用 ALTER USER),最后删除配置、重启并验证。

mysql 初始密码忘记后的重置流程详解

MySQL 初始密码忘记后,不能靠“猜”或“重装”,必须通过跳过 权限验证 的方式重置——核心是让 mysqld 启动时不加载 mysql.user 表,从而允许无密码登录并直接修改密码。

停服务 + 跳过授权表启动(关键第一步)

这一步失败,后续全白忙。不是简单 systemctl stop mysqld 就完事,重点在于“如何安全绕过密码校验”:

  • Linux 系统:编辑 /etc/my.cnf,在 [mysqld] 段下添加 skip-grant-tables,保存后执行 systemctl restart mysqld
  • Windows 或需手动启动的场景:用命令行进入 bin/ 目录,运行 mysqld --console --skip-grant-tables --shared-memory(注意不要关闭这个窗口)
  • ⚠️ 常见坑:skip-grant-tables 必须写在 [mysqld] 下,写错段落(如 [client])无效;若使用 systemd,改配置后一定要 systemctl daemon-reload 再重启

无密码登录 + 修改 root 密码(版本差异最大)

登录后执行的 SQL 命令,取决于你的 MySQL 版本——5.7、8.0+ 的字段名和加密方式完全不同,混用会报错:

  • MySQL 5.7:
    USE mysql;
    UPDATE user SET authentication_string=PASSWORD('NewPass123!') WHERE User='root' AND Host='localhost';
    FLUSH PRIVILEGES;
  • MySQL 8.0+(推荐用 ALTER USER):
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123!';

    如果遇到 ERROR 1827(密码策略不满足),先临时关掉:

    SET GLOBAL validate_password.policy=LOW;
  • ⚠️ 常见坑:直接用 UPDATE user SET Password=…… 在 5.7+ 已失效;authentication_string 字段不能用 password() 函数赋值(该函数在 8.0+ 已废弃),应改用 SHA2('xxx', 256) 或直接用 ALTER USER

清理配置 + 验证新密码(收尾最容易翻车)

很多人改完密码就以为结束了,结果下次启动失败或仍能免密登录——因为忘了还原启动环境:

  • 删掉 /etc/my.cnf 中的 skip-grant-tables 行,再执行 systemctl restart mysqld
  • 验证是否生效:mysql -u root -p,输入新密码;若仍免密进入,说明 skip-grant-tables 还在生效,或服务没真正重启(检查 ps aux | grep mysqld 是否有残留进程)
  • 若提示 Access denied for user 'root'@'localhost',大概率是 Host 匹配错了——检查 SELECT User,Host FROM mysql.user WHERE User='root';,常见的是 'root'@'127.0.0.1''root'@'localhost' 是两条不同记录,需分别处理

整个流程最脆弱的环节不是改密码本身,而是启动模式切换时的残留状态:跳过授权表的进程没杀干净、配置文件 改了但没 reload、或者多个 my.cnf 文件(如 /etc/my.cnf 和 /usr/my.cnf)优先级搞混。建议操作前先 mysqld --help --verbose | grep "Default options" 确认实际读取的配置路径。

text=ZqhQzanResources