MySQL 8.0+ 中 password_last_changed 列仅对 caching_sha2_password 或 sha256_password 插件用户有效,mysql_native_password 用户该列为 NULL;它由 ALTER USER 或 SET PASSWORD 自动写入,只读且不可手动更新,不记录 GRANT 或直接 UPDATE 行为,审计需依赖 general log、audit 插件等外部机制。

MySQL 8.0+ 查不到用户密码最后修改时间
MySQL 的 mysql.user 表里没有存储密码修改时间的字段,无论你用的是 SELECT * FROM mysql.user 还是查 password_last_changed,这个列只在 MySQL 8.0.11+ 中存在,且**仅对使用 caching_sha2_password 或 sha256_password 认证插件的账户有效**;对于老版本默认的 mysql_native_password 插件用户,该列始终为 NULL,且无法回填。
password_last_changed 列不是“修改日志”,而是认证插件生成的时间戳
这个字段由服务端在执行 ALTER USER ... IDENTIFIED BY 或 SET PASSWORD 时自动写入,前提是当前用户的 plugin 值为 caching_sha2_password(MySQL 8.0 默认)或 sha256_password。它不记录手动 UPDATE mysql.user 表的行为,也不响应 GRANT ... IDENTIFIED BY(该语法在 8.0+ 已弃用)。
-
password_last_changed是只读列,不能通过UPDATE mysql.user修改 - 如果用户被克隆(
CREATE USER ... LIKE),新用户会继承原用户的password_last_changed值 - 重置为空密码(
IDENTIFIED WITH mysql_native_password BY '')后,该列变为NULL
怎么查?简单 SELECT 就够了,但得先确认插件类型
运行以下语句可查看指定用户是否具备可用的修改时间:
SELECT user, host, plugin, password_last_changed FROM mysql.user WHERE user = 'your_user';
注意点:
- 必须用
SELECT查mysql.user,不要依赖SHOW CREATE USER—— 它不显示password_last_changed - 如果
plugin是mysql_native_password,那password_last_changed永远是NULL,别折腾 - 需要
SELECT权限在mysql库,普通用户默认没有,得由 DBA 授权:GRANT SELECT ON mysql.user TO 'user'@'%';
真要审计密码修改行为?得靠外部机制
MySQL 自身不提供密码修改操作日志。想追溯谁、何时改了哪个用户的密码,只能依赖:
- 开启 general log(不推荐生产环境长期开,IO 和磁盘压力大)—— 会记录所有
ALTER USER语句,含执行时间与账号 - 启用 audit log 插件(如官方企业版 audit_log,或社区版 MariaDB 的 server_audit)
- 通过代理层(如 ProxySQL、MaxScale)或中间件记录权限变更类语句
- 定期备份
mysql.user表并做 diff(仅适用于低频变更场景)
别指望从 mysql.user 里挖出历史记录 —— 它不是日志表,只是一个当前状态快照。


















