步骤
管理员身份运行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),如果能登录则说明密码修改成功
关键注意事项
- 执行
mysqld --skip-grant-tables的 cmd 窗口不能关闭,否则 MySQL 服务会终止 - 如果 MySQL 服务名不是默认的
mysql,需替换net stop/start后的服务名(可通过sc query | findstr mysql查询) - 修改密码后,一定要以正常模式重启 MySQL,否则会一直处于无权限验证的危险状态
总结
- 核心逻辑:停止 MySQL→跳过权限验证启动→无密码登录→刷新权限→修改 root 密码→恢复正常启动
--skip-grant-tables是重置密码的核心,FLUSH PRIVILEGES是让密码修改生效的关键root@%中的%必须匹配查询到的host值,否则修改密码会失败