XAMPP中MySQL root密码丢失后,resetroot.bat在MySQL 8.0+中已失效,必须手动以--skip-grant-tables模式启动mysqld,用UPDATE更新authentication_string并FLUSH PRIVILEGES,再正常重启服务。

直接说结论:XAMPP 中 MySQL 的 root 密码丢失后,不能靠控制面板按钮或 resetroot.bat 解决——该脚本在 MySQL 8.0+(XAMPP 当前主流版本)中已失效。必须手动以 --skip-grant-tables 模式启动 mysqld,再通过 SQL 更新密码并执行 FLUSH PRIVILEGES,最后正常重启服务。
为什么 resetroot.bat 不起作用
resetroot.bat 是 XAMPP 早期为 MySQL 5.6/5.7 设计的工具,它依赖 UPDATE mysql.user SET password=PASSWORD(...) 语法,并假设认证插件是 mysql_native_password。MySQL 8.0+ 默认改用 caching_sha2_password 插件,且废弃了 PASSWORD() 函数,导致脚本执行时直接报错 ERROR 1064 或 ERROR 1290。即使脚本“运行成功”,实际密码字段未更新,登录仍失败。
mysqld --skip-grant-tables 启动失败的常见原因
Windows 下直接执行 mysqld --skip-grant-tables 往往卡住或报错,根本原因是:XAMPP 的 my.ini 配置中已加载权限表定义,而 mysqld 在检测到配置文件存在时会拒绝覆盖校验逻辑。必须满足以下全部条件才能成功启动:
- 确保 XAMPP 控制面板中 MySQL 已显示为 “Stopped”,且任务管理器里没有残留的
mysqld.exe进程 - 以管理员身份打开命令提示符,cd 进入
C:\xampp\mysql\bin(路径按实际安装位置调整) - 执行完整命令:
mysqld --skip-grant-tables --bind-address=127.0.0.1 --port=3306 --console(--console关键,可实时看到启动日志;--bind-address防止意外远程访问) - 该窗口必须保持打开——它就是你的临时无验证 MySQL 实例
ALTER USER 执行报错 ERROR 1290 怎么办
在 --skip-grant-tables 模式下,MySQL 明确禁止执行 ALTER USER、CREATE USER 等涉及权限变更的语句,报错 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option... 是正常现象。此时应改用直接更新系统表的方式(仅限此模式下安全使用):
另开一个命令行窗口,执行:mysql -u root(注意:不加 -p,也不指定 -h)
进入后依次执行:
USE mysql;
UPDATE user SET authentication_string = PASSWORD('你的新密码') WHERE User = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;⚠️ 注意:PASSWORD() 函数在 MySQL 8.0.29+ 已彻底移除。若你用的是较新 XAMPP(如 v8.2+),请改用:
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '你的新密码';
但该语句必须在退出 --skip-grant-tables 模式、重启服务后,用新密码登录才可执行——所以首次重置仍推荐先用 UPDATE + FLUSH PRIVILEGES 快速生效。
新密码输对了还是报 ERROR 1045
最常被忽略的点是 Host 匹配问题。MySQL 认为 'root'@'localhost' 和 'root'@'127.0.0.1' 是两个不同用户。XAMPP 默认只初始化了前者,但某些客户端(如 Navicat、部分 PHP 连接)默认走 TCP/IP,会尝试连接 'root'@'127.0.0.1',导致密码正确也拒绝登录。
验证和修复方法:
- 登录后立即查:
SELECT User, Host FROM mysql.user WHERE User = 'root'; - 如果只看到
localhost,就补一条:CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY '你的新密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; - 别忘了再次执行:
FLUSH PRIVILEGES;
操作完关闭 --skip-grant-tables 窗口,再用 XAMPP 控制面板正常启动 MySQL——此时所有连接方式才真正统一可用。


















