mysql 5.7 及更早版本的 mysql.user 表无 create_time 字段,无法直接查用户创建时间;mysql 8.0+ 的 password_last_changed 字段可辅助推测(新建用户通常等于创建时间),但非绝对可靠;真正准确的方式需依赖 audit_log 插件、general_log(临时)、云平台审计日志或外部运维记录。

查 mysql.user 表本身不记录创建时间
MySQL 5.7 及更早版本的 mysql.user 表里没有 create_time 或 password_last_changed 字段,所以直接 SELECT * FROM mysql.user 拿不到“谁是最近加的”。你看到的 User 和 Host 是唯一标识,但没时间戳。
这意味着:靠查表本身无法准确排序“最新用户”,除非你额外做了日志或审计措施。
用 SHOW GRANTS + 创建时间推测(适用于有操作记录的环境)
如果你自己或 DBA 习惯在添加用户后立即执行 SHOW GRANTS FOR 'user'@'host',并且保留了命令历史(比如 shell 的 history、MySQL 客户端的 .mysql_history),那可以结合这些外部线索反推:
-
.mysql_history文件默认在用户家目录下,用tail -20 ~/.mysql_history看最近几条CREATE USER或GRANT命令 - 如果启用了 MySQL 的 general log(不推荐长期开启),可查
general_log_file路径下的日志,搜索CREATE USER关键字 - 某些云平台(如阿里云 RDS、腾讯云 CDB)控制台会记录账号操作时间,优先看控制台审计日志
MySQL 8.0+ 可查 password_last_changed 辅助判断
MySQL 8.0 引入了 password_last_changed 字段(在 mysql.user 表中),它记录密码最后一次变更时间——对新用户来说,这个时间通常就等于创建时间(因为创建时必然设了密码)。
执行以下查询可列出近期有密码更新的用户(含新建用户):
SELECT User, Host, password_last_changed FROM mysql.user WHERE password_last_changed > DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY password_last_changed DESC;
注意:password_last_changed 在用户改密、重置密码时也会更新,不能 100% 等同于“创建时间”,但对刚建完还没动过密码的用户是有效的。
真正可靠的方式:依赖外部记录或启用审计插件
生产环境别指望靠 MySQL 自带字段“猜”新增用户。容易被忽略的关键点是:
- MySQL 默认不审计 DDL/DCL 操作,
CREATE USER、DROP USER不进 error log 或 general log(除非显式开启) -
mysql.user表可被直接 INSERT(老写法),绕过语法校验,也绕过任何隐式时间记录 - 如果用
INSERT INTO mysql.user ...; FLUSH PRIVILEGES;方式建用户,连password_last_changed都不会自动设(MySQL 8.0+ 中该字段为 NULL)
真要追踪,得提前部署:audit_log 插件,或使用 Percona Server / MariaDB 的系统审计功能,或者把所有用户操作走 Ansible/Terraform 脚本并打上 commit 时间戳。











