ERROR 1045执行ALTER USER时出现,本质是当前登录用户缺乏CREATE USER权限或mysql.user表UPDATE权限,需先用SHOW GRANTS确认权限,并用SELECT User,Host FROM mysql.user WHERE User='root'核实目标'user'@'host'是否存在。

ALTER USER 报 ERROR 1045:权限或用户不存在
执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx'; 却提示 ERROR 1045 (28000): Access denied,不是密码输错了,而是当前登录账户压根没权限改别人密码。MySQL 8.0+ 要求执行者必须有 CREATE USER 权限,或对 mysql.user 表有 UPDATE 权限。
排查步骤:
- 运行
SHOW GRANTS;,确认输出里含GRANT CREATE USER ON *.*或GRANT UPDATE ON mysql.user TO ... - 用
SELECT User, Host FROM mysql.user WHERE User = 'root';查看实际存在的 root 用户记录——常见坑是 root 实际存在的是'root'@'%'或'root'@'127.0.0.1',而非'root'@'localhost' - 如果目标用户不存在,
ALTER USER不会自动创建,必须先用CREATE USER,再GRANT
ALTER USER 失败但没报错,密码却没生效
命令看似执行成功(没报错),但用新密码连不上,大概率是客户端或中间件缓存了旧凭据,不是 MySQL 没改成功。
检查点:
- 应用层:PHP 的
mysqli、Python 的pymysql或mysql-connector-python不会自动感知密码变更,需重启应用进程或清空连接池 - 代理层:ProxySQL、MaxScale 等会缓存
mysql.user内容,需手动执行FLUSH PRIVILEGES;或触发其配置重载 - 连接字符串 host 写的是 IP(如
192.168.1.10),但用户定义的是'user'@'web1.intern',host 不匹配导致走默认匿名用户或拒绝
执行 ALTER USER 后用户直接无法登录,报 ERROR 1820
这是密码被设为“立即过期”了。比如误加了 PASSWORD EXPIRE,或全局启用了 default_password_lifetime,而该用户恰好命中策略。
现象是:输入正确密码,仍报 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement。
临时解法(高权限账号执行):
ALTER USER 'user'@'host' PASSWORD EXPIRE NEVER;- 再试一次登录,确认是否恢复
注意:很多应用(JDBC、PDO、备份脚本)根本不支持交互式改密流程,遇到 ERROR 1820 会直接断连,没法“接着输新密码”。所以除非真有强合规要求,别对普通业务账号启用 PASSWORD EXPIRE。
MySQL 8.0+ 下认证插件不兼容导致连接失败
改完密码后,老 PHP(ERROR 2068: Plugin caching_sha2_password could not be loaded,说明客户端不支持 MySQL 8.0 默认的 caching_sha2_password 插件。
解决方法是显式降级认证方式:
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'newpwd';- 执行后立刻查
SELECT plugin FROM mysql.user WHERE User='user' AND Host='host';,确认返回值是mysql_native_password - 如果用的是
--default-auth=mysql_native_password连接参数,也得同步删掉,否则可能冲突
真正容易被忽略的是:MySQL 8.0 的 ALTER USER ... IDENTIFIED BY 默认沿用原用户的 plugin,不会自动切换;你得自己决定要不要换,不能指望它“智能适配”。


















