error 1045 主因是权限不足或用户不存在;需确保执行者有 create user 或 update mysql.user 权限,且目标用户已存在并严格匹配 user@host。

ALTER USER 修改密码时为什么报错 ERROR 1045?
权限不足或用户不存在是主因。MySQL 8.0+ 默认禁用 SET PASSWORD,必须用 ALTER USER,且执行者需有 CREATE USER 或 UPDATE 系统表权限。
- 确认当前登录账户有
mysql.user表的写权限:运行SHOW GRANTS;检查是否含GRANT CREATE USER ON *.*或GRANT UPDATE ON mysql.user - 目标用户必须已存在——
ALTER USER不创建新用户,先用SELECT User, Host FROM mysql.user;核对用户名和 host 是否完全匹配(比如'admin'@'localhost'≠'admin'@'%') - 如果用的是旧版客户端(如 MySQL Workbench 8.0.22 之前),可能默认走旧协议,尝试加
--default-auth=mysql_native_password连接
密码过期策略设置后用户无法登录?
MySQL 的 PASSWORD EXPIRE 是硬限制:到期后首次连接会强制要求改密,但很多应用(如 PHP PDO、Java JDBC)不支持交互式改密流程,直接断连。
- 临时绕过:用高权限账号执行
ALTER USER 'user'@'host' PASSWORD EXPIRE NEVER;,再重试 - 长期方案:避免全局开
default_password_lifetime,只对特定高危账户设限,例如ALTER USER 'backup'@'10.0.0.%' PASSWORD EXPIRE INTERVAL 90 DAY; - 注意兼容性:MySQL 5.7 不支持
PASSWORD EXPIRE,该语法会报错;5.7 只能靠外部监控或定期SET PASSWORD轮换
ALTER USER 设置密码时要不要加 IDENTIFIED WITH?
绝大多数情况不用。MySQL 8.0 默认认证插件是 caching_sha2_password,只要不显式指定,新密码就沿用用户当前的认证方式。
- 只有当你想切换认证插件时才需要:
ALTER USER 'u'@'h' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 如果目标应用(如老版本 PHP)不支持
caching_sha2_password,必须显式降级,否则连接时报错ERROR 2068: Plugin caching_sha2_password could not be loaded - 执行后记得检查:
SELECT plugin FROM mysql.user WHERE User='u' AND Host='h';,确认插件名已更新
修改密码后应用仍连不上?检查这三处
密码本身没问题,问题常出在连接上下文里。
- 客户端缓存了旧凭据:PHP 的
mysqli或 Python 的pymysql不自动刷新,重启应用进程或连接池 - 代理层(如 ProxySQL、MaxScale)缓存了用户信息,需手动执行
FLUSH PRIVILEGES;或触发其重载配置 - 连接字符串中 host 写的是 IP 而不是域名,但用户是按
'u'@'web1.internal'创建的——MySQL 做 host 匹配时不做 DNS 反查,必须严格一致
最易被忽略的是:MySQL 8.0 默认开启 caching_sha2_password,而很多运维脚本或备份工具仍硬编码使用 mysql_native_password 插件连接,这时候光改密码没用,得同步调认证插件或改客户端配置。










