Redshift系统表只记录几天的日志记录数据 - 定期从这些表中备份行是收集和维护正确历史记录的常见做法。要查找添加到系统日志中的新行,我需要在查询(编号)或执行时间检查我的备份表。
根据How do I keep more than 5 day's worth of query logs?的答案,我们只需选择query > (select max(query) from log)
的所有行即可。答案是未引用的,并假设顺序插入query
。
我的问题分为两部分 - 希望引用或代码作为证据 - 是
query
(标识符),stl_query
,不变或不变?假设我们无法验证或证明上述情况,那么备份系统表的正确策略是什么?
我对此持谨慎态度,因为我完全希望在许多其他查询开始和完成之后完成长时间运行的查询。
我知道query
(标识符)是在查询提交时生成的,因为我可以监视正在进行的查询。因此,预计在query=1
之后可以完成长时间运行的query=2
。如果stl_query
表是不可变的,则query=1
将在query=2
之后插入,并且max(query)
逻辑存在缺陷。
或者,如果在运行时将query=1
插入stl_query
,则必须在完成时更新该行(包括结束时间,持续时间等)。这需要我在备份表中进行插入。
答案 0 :(得分:2)
我认为stl_query
表确实是不可变的,似乎它只在查询完成后写入。
这就是我认为的原因。首先,我在运行查询的群集上运行此查询
select count(*) from stl_query where endtime is null
这会返回0.我的预感是,您可能会看到同样的事情。
为了双重确定,我也运行了这个查询:
select count(*) from stv_inflight i
inner join stl_query q on q.query = i.query
这也返回零(虽然我确实有查询机会),这似乎确认查询只有在执行完毕后才会记录在stl_query中并且不会更新。
那就是说,我会重写查询,以便插入历史表中:
insert into admin.query_history (
select * from stl_query
where query not in (select query from admin.query_history)
)
这样,您就可以随时插入历史记录表中没有的任何记录。