如何查询PostgreSQL中某行数据最后一次被查询访问的时间
无文档遗留JSON常量表使用情况排查方案
第一阶段:代码层面全量排查
- 拉取全量业务代码仓库,针对常量表的表名、待确认行的唯一标识(比如主键ID、JSON字段里的唯一key值)做全局检索,注意区分大小写、拼写变体
- 重点排查数据库操作层(DAO层、ORM映射文件)的SQL语句,尤其注意拼接动态SQL、硬编码的查询语句,是否有涉及该行数据的查询逻辑
- 检查代码中所有JSON解析相关的逻辑,确认是否有读取该行JSON字段内特定key的代码段,关联的业务场景是否还在迭代或对外提供服务
- 若存在微服务、多系统调用的情况,同步排查跨服务的接口定义、入参出参是否有涉及该行常量的传递逻辑
第二阶段:数据库层面流量排查
- 开启数据库的慢查询日志/全量查询日志(注意调整日志采集阈值,避免占用过多磁盘IO),针对该常量表的表名设置过滤规则,持续采集1-2个完整业务周期(覆盖日常流量、峰值流量、定时任务执行周期)的查询请求
- 若使用的是MySQL数据库,可以执行
SELECT * FROM performance_schema.table_io_waits_summary_by_table WHERE OBJECT_NAME = '你的常量表名';查询统计周期内该表的IO操作记录,若业务已经运行较长时间未重启,该统计结果可以覆盖较长时间的访问情况 - 针对待确认的目标行,可以临时添加触发器,记录每次访问记录:
DELIMITER // CREATE TRIGGER record_const_row_access BEFORE SELECT ON 你的常量表名 FOR EACH ROW BEGIN IF OLD.主键ID = 目标行ID THEN INSERT INTO access_log (row_id, access_time, access_user) VALUES (OLD.主键ID, NOW(), USER()); END IF; END // DELIMITER ;
注意:触发器仅适用于访问量较低的业务场景,高并发场景下会增加数据库性能开销,验证完成后记得及时删除触发器
- 若数据库支持审计功能,直接开启对应表的访问审计规则,可以直接获取所有访问该表、访问特定行的用户、SQL、时间等信息
第三阶段:业务灰度验证
- 先在测试环境将目标行数据修改为异常值,跑全量自动化测试用例,观察是否有用例报错
- 若没有自动化测试覆盖,先在预发环境注释/删除目标行,观察1-3天是否有业务报错、日志异常、用户反馈
- 确认预发无异常后,可以在线上环境先将目标行的JSON内容修改为和原值一致的冗余备份,标记为待下线状态,再观察7-14天,确认无任何访问记录后再正式删除
内容的提问来源于stack exchange,提问作者Irfandy J.
相关产品推荐
相关产品推荐

