必须用--skip-grant-tables启动mysqld才能重置MySQL 8.0+ root密码,因认证失败后完全无法登录执行ALTER USER;需配合--skip-networking、显式指定mysql_native_password插件并满足密码策略。

MySQL 8.0+ 忘记 root 密码:必须用 ALTER USER,不能用 PASSWORD()
MySQL 5.7 之后彻底废弃了 PASSWORD() 函数,UPDATE mysql.user SET password=... 这类写法会报错 ERROR 1054 (42S22): Unknown column 'password' in 'field list'。8.0+ 默认认证插件是 caching_sha2_password,直接写明文密码或旧哈希值会导致登录失败。
正确做法是显式指定插件并重置:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';- 如果要兼容远程连接,还得补一条:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的新密码'; - 执行完必须立刻
FLUSH PRIVILEGES;,否则修改不生效
Windows 下启动免密模式总卡在“找不到 bin 目录”?真实路径不在开始菜单里
开始菜单里的 MySQL 快捷方式指向的是启动器,不是真正的 bin 目录。8.0+ 官方安装版默认安装路径是:C:\Program Files\MySQL\MySQL Server 8.x\bin;但数据目录和配置文件实际在隐藏的 C:\ProgramData\MySQL\MySQL Server 8.x\ —— 这就是为什么直接运行 mysqld --skip-grant-tables 会报 Can't find file: 'mysql.user'。
必须带 --defaults-file 指向真实配置:
- 先用管理员 CMD 进入真实
bin目录:cd C:\Program Files\MySQL\MySQL Server 8.1\bin - 再运行:
mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.1\my.ini" --skip-grant-tables --shared-memory --console - 这个窗口不能关、不能输任何东西,最小化即可
Linux 用 mysqld_safe 启动失败?别硬套老教程,改用 systemd 临时覆盖配置
Ubuntu 22.04+/CentOS 8+ 已弃用 mysqld_safe,直接运行会提示 command not found。更稳妥的方式是临时修改 systemd 服务配置,避免改错 my.cnf 导致后续启动异常。
操作步骤:
- 停服务:
sudo systemctl stop mysql - 临时覆盖启动参数:
sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables --skip-networking" - 启动:
sudo systemctl start mysql - 验证是否生效:
mysql -u root能直连即成功 - 用完立刻还原:
sudo systemctl unset-environment MYSQLD_OPTS
改完密码还是连不上?检查三件事:host 匹配、plugin 是否生效、密码强度策略
即使 SQL 执行成功,仍可能因以下原因无法登录:
-
'root'@'localhost'和'root'@'127.0.0.1'是两个不同账户,本地连接有时走 TCP(对应后者),记得一并更新 - 执行
SELECT plugin FROM mysql.user WHERE User='root';确认返回值是mysql_native_password,不是caching_sha2_password - MySQL 8.0 默认启用密码强度校验,简单密码如
123会触发ERROR 1819 (HY000),要么加复杂度(大小写字母+数字+符号),要么临时关掉:SET GLOBAL validate_password.policy=LOW;
最易被忽略的是 host 和 plugin 的组合匹配——光改密码不够,必须让认证方式、访问来源、密码策略三者同时对齐。


















