我有一个包含大量表(当前为 93k)的 PostgreSQL 数据库,并且我看到事务 ID 年龄威胁环绕的问题,因为对于长时间未写入的干净表,不会触发 autovacuum。
例如,我有一个表,我可以看出自“2018-09-19 10:30:43.625069+00”以来还没有被写入,这要归功于对该表的唯一插入总是设置一列updated_at
(当前日期时间是“2018”) -10-04 23:58:25.545881+00'),有n_dead_tup = 0
,并且有age(relfrozenxid) > 10000000
。
我有autovacuum_freeze_max_age = 10000000
所以这应该意味着这个表将被自动清理,但相反我看到它超过了这一点,然后表的自动清理不会被触发(它目前处于age(relfrozenxid) > 70000000
并且自动清理仍然没有触发。
我目前已将自动真空设置为最大程度地激进,但这种情况仍在发生。以下是自动清理设置:
track_counts = on
autovacuum = on
autovacuum_vacuum_cost_delay = 0
autovacuum_vacuum_cost_limit = 10000
autovacuum_vacuum_scale_factor = 0
autovacuum_vacuum_threshold = 1
autovacuum_freeze_max_age = 10000000
vacuum_freeze_min_age = 1000000
Run Code Online (Sandbox Code Playgroud)
(是的,我意识到autovacuum_vacuum_cost_limit
这并不重要,autovacuum_vacuum_cost_delay
因为0
)
目前,我被迫定期手动触发这些表的真空,以防止事情失控。不过,这感觉就像是黑客攻击。
有没有办法让 autovacuum 来清理这些表,或者相当于 autovacuum 忽略这些表的原因?
预计到达时间
如果有人来这里想看我处理这个问题的脚本,这里是:
#!/bin/bash -e
while true; do
sleep 60 #just in case …
Run Code Online (Sandbox Code Playgroud)