MySQL 管理运维:这类 VALUES() 已被弃用
在之前的文章 MySQL 管理运维:妙用 DATETIME 数据类型的默认值 中,介绍了如何巧用自动更新字段时间戳。
本文将继续扩展该案例,使用 INSERT ... ON DUPLICATE KEY UPDATE
语句来检查记录用户登录情况。
背景
用户登录数据库的时间、次数,执行的语句,都是重要的审计项目。在老版本的 MySQL 中没有记录用户密码最后更改时间和用户最后登录时间,需要依靠外挂工具实现。
在 MySQL 8 中,系统表 mysql.user
的 password_last_changed
字段记录了密码最后更改时间,但用户最后登录时间仍较难查询。
好在,performance_schema 库中的 users 表记录了所有用户的总连接次数。
users 表为连接到 MySQL 服务器的每个用户包含一行。对于每个用户名,该表计算当前连接数和总连接数。 表大小在服务器启动时自动调整大小。要显式设置表大小,请在服务器启动时设置Performance_schema_users_size 系统变量。 要禁用用户统计信息,请将此变量设置为 0。[1]
假设我们有个以“天”为单位粒度的需求,要求记录每个用户上次登录数据库是哪一天。
实现
对于该需求,我们可以创建一张新表 myuser,该表记录用户名 user,总连接次数 total_conn,和更新时间 update_at。
create table myuser(
user char(32) primary key,
total_conn bigint,
update_at datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);