如何查询MySQL中特定用户的密码最后修改时间——查找password_last_changed字段?
- 内容介绍
- 文章标签
- 相关推荐
本文共计850个文字,预计阅读时间需要4分钟。
MySQL 5.7.6 及以上版本(包括 MySQL 8.0)在 `mysql.user` 表中内置了 `password_last_changed` 字段。只有当用户密码是通过合法方式(如 `ALTER USER` 或 `SET PASSWORD`)修改的,这个时间戳才会被自动更新。无需额外开启日志或插件。
执行以下 SQL 即可查指定用户:
SELECT user, host, password_last_changed FROM mysql.user WHERE user = 'your_user';
注意点:
-
password_last_changed为NULL表示该用户创建后从未改过密码,或使用了极老版本的初始化方式(如 MySQL 5.6 及之前用UPDATE mysql.user直接改authentication_string) - 字段类型是
DATETIME,值为 UTC 时间,不是本地时区 - 必须用有
SELECT权限的账号(如root或带mysql库权限的管理员)才能查mysql.user
MySQL 8.0+ 用户属性表也能查,但不推荐作为主渠道
MySQL 8.0 引入了 information_schema.user_attributes 表,其中可能存有 password_last_changed 属性,语句形如:
SELECT user, attribute, value FROM information_schema.user_attributes WHERE user = 'your_user' AND attribute = 'password_last_changed';
但实际中这个表并不可靠:
- 它只在显式设置用户属性时才写入(例如用
ALTER USER ... ATTRIBUTE),password_last_changed并不会自动同步到这里 - 多数安装默认为空,查不到结果不等于没改过密码
-
mysql.user中的password_last_changed才是权威来源,它是服务端在每次合法密码变更时强制更新的
查不到或值为 NULL 的常见原因
如果你执行查询后发现 password_last_changed 是 NULL 或时间明显不对,大概率是以下情况之一:
- 用户是用
CREATE USER ... IDENTIFIED WITH ...+ 自定义认证插件创建的,未走标准密码流程 - 密码是通过直接
UPDATE mysql.user SET authentication_string = ...修改的(绕过权限系统,不触发时间戳更新) - MySQL 版本低于 5.7.6(如 5.6),该字段根本不存在
- 用户是
root且用跳过权限检查方式启动(--skip-grant-tables)后改的密码,时间戳不会写入
想追溯历史修改记录?password_last_changed 不够用
password_last_changed 只存最后一次,不存历史。真要查“谁、什么时候、用什么语句改的密码”,得依赖外部机制:
- 开启通用查询日志(
general_log = ON),但仅适合临时排查,长期开销大 - 解析 binlog(
mysqlbinlog),重点搜ALTER USER和SET PASSWORD事件;注意必须是ROW格式才易定位元数据变化 - 企业版可用审计插件(
audit_log),社区版无替代品 - 所有方案都要求事前配置——等出问题再想起查,基本查不到
真正能立刻用上的,就只有 mysql.user 里的 password_last_changed。别指望它告诉你过程,它只负责记下“最后那一锤”。
本文共计850个文字,预计阅读时间需要4分钟。
MySQL 5.7.6 及以上版本(包括 MySQL 8.0)在 `mysql.user` 表中内置了 `password_last_changed` 字段。只有当用户密码是通过合法方式(如 `ALTER USER` 或 `SET PASSWORD`)修改的,这个时间戳才会被自动更新。无需额外开启日志或插件。
执行以下 SQL 即可查指定用户:
SELECT user, host, password_last_changed FROM mysql.user WHERE user = 'your_user';
注意点:
-
password_last_changed为NULL表示该用户创建后从未改过密码,或使用了极老版本的初始化方式(如 MySQL 5.6 及之前用UPDATE mysql.user直接改authentication_string) - 字段类型是
DATETIME,值为 UTC 时间,不是本地时区 - 必须用有
SELECT权限的账号(如root或带mysql库权限的管理员)才能查mysql.user
MySQL 8.0+ 用户属性表也能查,但不推荐作为主渠道
MySQL 8.0 引入了 information_schema.user_attributes 表,其中可能存有 password_last_changed 属性,语句形如:
SELECT user, attribute, value FROM information_schema.user_attributes WHERE user = 'your_user' AND attribute = 'password_last_changed';
但实际中这个表并不可靠:
- 它只在显式设置用户属性时才写入(例如用
ALTER USER ... ATTRIBUTE),password_last_changed并不会自动同步到这里 - 多数安装默认为空,查不到结果不等于没改过密码
-
mysql.user中的password_last_changed才是权威来源,它是服务端在每次合法密码变更时强制更新的
查不到或值为 NULL 的常见原因
如果你执行查询后发现 password_last_changed 是 NULL 或时间明显不对,大概率是以下情况之一:
- 用户是用
CREATE USER ... IDENTIFIED WITH ...+ 自定义认证插件创建的,未走标准密码流程 - 密码是通过直接
UPDATE mysql.user SET authentication_string = ...修改的(绕过权限系统,不触发时间戳更新) - MySQL 版本低于 5.7.6(如 5.6),该字段根本不存在
- 用户是
root且用跳过权限检查方式启动(--skip-grant-tables)后改的密码,时间戳不会写入
想追溯历史修改记录?password_last_changed 不够用
password_last_changed 只存最后一次,不存历史。真要查“谁、什么时候、用什么语句改的密码”,得依赖外部机制:
- 开启通用查询日志(
general_log = ON),但仅适合临时排查,长期开销大 - 解析 binlog(
mysqlbinlog),重点搜ALTER USER和SET PASSWORD事件;注意必须是ROW格式才易定位元数据变化 - 企业版可用审计插件(
audit_log),社区版无替代品 - 所有方案都要求事前配置——等出问题再想起查,基本查不到
真正能立刻用上的,就只有 mysql.user 里的 password_last_changed。别指望它告诉你过程,它只负责记下“最后那一锤”。

