root账户被锁定典型表现为error 1045或error 1820,需先查临时密码(grep 'temporary password'日志),若找到则用其登录并执行alter user重置密码;否则须停服务后以--skip-grant-tables启动,免密登录后alter user修改密码并flush privileges。

root账户被锁定的典型表现
执行 mysql -u root -p 时直接报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost',或更明确的 ERROR 1820 (HY000): You must reset your password first —— 这不是密码错了,而是账户被强制要求改密但你没操作,MySQL 就把它锁死了。常见于 MySQL 5.7.6+ 和 8.0+ 首次安装后未及时用临时密码登录并改密。
先确认是否真被锁定,而不是密码输错
别急着跳过权限表。先查错误日志,看有没有初始密码线索:
- Linux:
sudo grep 'temporary password' /var/log/mysqld.log(路径也可能是/var/log/mysql/error.log) - macOS(Homebrew):
grep 'temporary password' /usr/local/var/mysql/*.err - Windows:
notepad "C:\ProgramData\MySQL\MySQL Server 8.0\Data\*.err",搜索temporary password
如果找到类似 AfRkY!2x#qLm 的字符串,就用它登录:mysql -u root -p,粘贴该密码。进库后立刻执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123';。这一步做完,锁定状态自动解除。
找不到临时密码?必须用 --skip-grant-tables 绕过验证
这是唯一能继续的路。注意:不是所有系统都能直接跑 mysqld --skip-grant-tables,尤其 Windows 或启用了 caching_sha2_password 的环境容易崩溃。
- Linux/macOS:停服务后,用
sudo mysqld_safe --skip-grant-tables --skip-networking &启动(--skip-networking防远程访问) - Windows:管理员 CMD 中运行
mysqld --console --skip-grant-tables --shared-memory(不加--shared-memory会报 TCP/IP 错误) - 启动后新开终端,直接
mysql -u root(不加-p,也不输密码) - 进库后立刻切库:
USE mysql; - 执行重置(注意 host):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123';;如果只查到'root'@'%',就把localhost换成% -
必须执行:
FLUSH PRIVILEGES;,否则新密码不生效
改完密码仍登不上?重点检查 host 和权限刷新
最常踩的坑不是语句写错,而是:
- 你用
mysql -u root -h 127.0.0.1登录,但只改了'root'@'localhost'—— 这俩是不同用户,得分别处理或统一用localhost -
FLUSH PRIVILEGES;漏了,或者执行后没退出再重启服务,导致缓存未更新 - Windows 下用
net start mysql启动前,忘了关掉之前卡住的mysqld --skip-grant-tables窗口,结果两个实例冲突 - Linux 下用配置文件方式加了
skip_grant_tables=1,改完没删这行就重启,等于永远免密
host 匹配和 FLUSH PRIVILEGES 这两步漏一个,新密码就白设了。











