Mysql忘记密码重置的方法

步骤

复制代码
管理员身份运行cmd

1. net stop mysql
2. mysqld --defaults-file="E:\work\mysql-5.7.39-winx64\my.ini" --skip-grant-tables
3. mysql -u root
4. FLUSH PRIVILEGES;
   
先查看用户root对应的host信息,动态修改下述命令中@符号后的内容
	use mysql;
	select user, host from user;
	
1. ALTER USER 'root'@'%' IDENTIFIED BY 'root';
2. EXIT;
3. net stop mysql
4. net start mysql

逐行命令详解

1. 管理员身份运行 cmd

  • 作用:Windows 系统中,修改 MySQL 服务和配置需要系统级权限,普通用户权限可能无法启停服务或操作 MySQL 核心配置,因此必须右键点击 "命令提示符"→选择 "以管理员身份运行"
  • 注意 :如果不使用管理员身份,执行net stop/start mysql会提示 "拒绝访问"

2. net stop mysql

  • 命令类型:Windows 系统命令(不是 MySQL 命令)。

  • 作用:停止 MySQL 服务

    • net:Windows 的网络服务管理命令
    • stop:停止服务的参数
    • mysql:MySQL 服务的名称(如果你的 MySQL 服务名不是默认的mysql,比如mysql57,需要替换成实际名称,可通过services.msc查看)
  • 执行结果:成功则提示 "MySQL 服务已成功停止",失败可能是服务未启动或权限不足。

3. mysqld --defaults-file="E:\work\mysql-5.7.39-winx64\my.ini" --skip-grant-tables

  • 命令类型:MySQL 服务器启动命令(mysqld 是 MySQL 的核心服务进程)

  • 核心参数解释

    • --defaults-file:指定 MySQL 的配置文件路径(必须是绝对路径),告诉 mysqld 加载哪个配置文件启动
    • --skip-grant-tables关键参数,跳过 MySQL 的权限验证表(grant tables),启动后任何用户都可以无密码登录 MySQL,且拥有最高权限(这是重置密码的核心前提)
  • 执行现象 :执行后 cmd 窗口会 "卡住"(没有返回提示符),这是正常的 ------ 因为 mysqld 进程正在前台运行,这个窗口不能关闭,需要重新打开一个新的管理员 cmd 窗口执行后续命令

  • 注意 :路径中的my.ini必须是你实际的 MySQL 配置文件路径,路径中的引号是为了防止路径包含空格导致识别失败

4. mysql -u root

  • 命令类型:MySQL 客户端登录命令。

  • 作用 :以 root 用户无密码登录 MySQL 服务器(因为前面加了--skip-grant-tables,所以不需要加-p输入密码)

    • -u root:指定登录的用户名是 root
  • 执行结果 :成功则进入 MySQL 的命令行交互界面(提示符变为mysql>),失败可能是 mysqld 进程未启动或端口被占用

5. FLUSH PRIVILEGES;

  • 命令类型:MySQL 内置命令(必须以分号结尾)

  • 作用:重新加载 MySQL 的权限表(grant tables)

    • 因为前面跳过了权限验证,此时直接修改用户密码可能不生效,执行该命令后,MySQL 会重新读取权限配置,让后续的密码修改命令生效
  • 注意:这一步是必做的,否则修改密码的命令会提示 "ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement"

6. 查看 root 用户的 host 信息(关键前置步骤)

复制代码
use mysql;
select user, host from user;
  • use mysql; :切换到 MySQL 的系统数据库mysql(该数据库存储了所有用户、权限相关的核心表)

  • select user, host from user; :查询mysql.user表(用户权限表)中的user(用户名)和host(允许登录的主机)字段

  • 核心意义

    • host字段决定了 root 用户允许从哪个主机登录:

      • %:允许所有主机登录
      • localhost:仅允许本机登录
      • 192.168.1.%:允许指定网段登录
    • 必须确保后续修改密码的命令中@后的内容和查询结果一致,否则会修改失败(比如查询结果是root@localhost,却用root@%修改,会提示用户不存在)

7. ALTER USER 'root'@'%' IDENTIFIED BY 'root';
  • 命令类型:MySQL 用户密码修改命令

  • 作用:修改指定用户的登录密码

    • 'root'@'%':指定要修改的用户是 "root",允许登录的主机是 "%"(需替换为你查询到的实际 host 值)
    • IDENTIFIED BY 'root':将该用户的密码设置为root(可替换为你想要的任意密码)
  • 替代方案(兼容 MySQL 5.6 及更低版本):如果该命令提示报错,可使用旧版命令:

    复制代码
    UPDATE mysql.user SET authentication_string = PASSWORD('root') WHERE user = 'root' AND host = '%';
  • 注意 :分号必须加,且@后的 host 值必须和查询结果完全一致

8. EXIT;

  • 命令类型:MySQL 客户端退出命令
  • 作用:退出 MySQL 的命令行交互界面,回到 cmd 窗口

9. net stop mysql

  • 作用 :停止当前以--skip-grant-tables启动的 MySQL 进程(注意:需要在原来启动 mysqld 的 cmd 窗口按Ctrl+C终止进程,再执行该命令,确保服务完全停止)

10. net start mysql

  • 作用:以正常模式(加载权限表)重新启动 MySQL 服务
  • 验证 :启动后可执行mysql -u root -p,输入新设置的密码(如root),如果能登录则说明密码修改成功

关键注意事项

  1. 执行mysqld --skip-grant-tables的 cmd 窗口不能关闭,否则 MySQL 服务会终止
  2. 如果 MySQL 服务名不是默认的mysql,需替换net stop/start后的服务名(可通过sc query | findstr mysql查询)
  3. 修改密码后,一定要以正常模式重启 MySQL,否则会一直处于无权限验证的危险状态

总结

  1. 核心逻辑:停止 MySQL→跳过权限验证启动→无密码登录→刷新权限→修改 root 密码→恢复正常启动
  2. --skip-grant-tables是重置密码的核心,FLUSH PRIVILEGES是让密码修改生效的关键
  3. root@%中的%必须匹配查询到的host值,否则修改密码会失败
相关推荐
闻哥2 小时前
MySQL三大日志深度解析:redo log、undo log、binlog 原理与实战
android·java·jvm·数据库·mysql·adb·面试
非凡ghost2 小时前
Smart Launcher安卓版(安卓桌面启动器)
android·windows·学习·音视频·软件需求
轩情吖2 小时前
MySQL之复合查询
android·数据库·mysql·多表·符合查询·自连接·合并查询
FirstFrost --sy2 小时前
MySQL表的增删查改
数据库·mysql
半桶水专家2 小时前
MySQL CPU 飙高排查全流程指南
数据库·mysql·adb
飞鱼计划2 小时前
在 MySQL 中,处理锁表问题
android
星轨初途2 小时前
郑州轻工业大学“筑梯杯” 2025级新生程序设计大赛暨省内高校邀请赛——题解
android·c++·经验分享·笔记·算法
黄林晴2 小时前
Android内核引入AuroFDO,你的App变快了
android
IT痴者2 小时前
Kotlin 开发注意事项(Android Java 开发者转型指南)
android·java·kotlin