如何获取Athena各表最后访问时间以清理闲置表?
获取Athena表最后访问时间的替代方案
你遇到的Glue客户端返回LastAccessTime无效的情况很常见——这个字段只有在通过Glue Data Catalog的特定操作(比如部分ETL任务)访问表时才会更新,Athena的查询根本不会触发它的更新。下面分享几个可靠的替代方法:
通过CloudTrail日志追踪查询事件
Athena的所有查询操作都会被CloudTrail记录为StartQueryExecution事件。你可以这么做:- 用AWS CLI或boto3调用CloudTrail的
lookup_eventsAPI,筛选事件源为athena.amazonaws.com、事件名称为StartQueryExecution的记录。 - 解析每个事件里的
requestParameters.queryString字段,提取出查询涉及的表名(要注意处理跨库引用、表别名这类情况)。 - 对每张表保留最新的事件时间,这就是它的最后访问时间。
提醒:CloudTrail默认日志保留90天,如果你要查120天的记录,得确保之前已经配置了更长的保留期,或者把日志归档到S3后再检索。
- 用AWS CLI或boto3调用CloudTrail的
分析Athena查询历史
- 短期范围(最近7天):直接查询Athena的
information_schema.query_history视图,从中提取SQL语句和执行时间,解析表名后统计最新的访问时间。 - 长期范围(超过7天):先配置Athena将查询日志导出到指定S3存储桶,然后在Athena中创建外部表指向这些日志文件,编写SQL解析日志里的查询语句和时间,从而获取每张表的历史访问记录。
另外也可以用boto3的list_query_executions和get-query-executionAPI批量拉取查询详情,再解析SQL中的表信息。
- 短期范围(最近7天):直接查询Athena的
S3对象访问时间作为辅助参考
如果你的Athena表数据存在S3,可以查看对应S3前缀下对象的LastAccessed时间(需要开启S3访问日志或使用S3 Storage Lens)。但这个方法有明显局限性:Athena的只读查询不会修改S3对象的LastModified时间,而且其他非Athena操作也可能更新这个时间,所以只能用来补充验证,不能单独作为判断依据。
最后要注意处理一些边缘情况,比如查询中用到视图、临时表,或者跨数据库引用表的场景,避免误判。
内容的提问来源于stack exchange,提问作者Sivakumar
相关产品推荐
相关产品推荐

