old_snapshot_threshold

类型: integer
默认: -1 (-1)
最低限度: -1 (-1)
最大: 86400 (60d)
单元: minutes (min)
上下文: postmaster
重新开始: true
以来: 9.6

设置可以使用查询快照的最小时间量,以规避使用快照时出现snapshot too old 错误的风险。超过此阈值时间的数据将可以被清除。 这可以有助于阻止长时间使用的快照造成的快照膨胀。为了阻止由于本来对该快照可见的数据被清理导致的不正确结果,当快照比这个阈值更旧并且该快照被用来读取一个该快照建立以来被修改过的页面时,将会产生一个错误。

如果指定值时没有单位,则以分钟为单位。 值 -1 (默认值) 禁用此功能,实际上将快照的时限设置为无穷大。 这个参数只能在服务器启动时设置。

对于生产工作有用的值的范围可能从几个小时到几天不等。只允许小的值(例如0或者1min)是因为它们有时可能对测试有用。 虽然允许高达60d的设置,但是请注意很多负载情况下,很短的时间帧里就可能发生极大的膨胀或者事务 ID 回卷。

当这个特性被启用时,关系末尾的被清出的空间不能被释放给操作系统,因为那可能会移除用于检测snapshot too old情况所需的信息。所有分配给关系的空间还将与该关系关联在一起便于重用,除非它们被显式地释放(例如,用VACUUM FULL)。

这个设置不会尝试保证在任何特殊情况下都会生成错误。事实上,如果(例如)可以从一个已经物化了一个结果集的游标中生成正确的结果,即便被引用表中的底层行已经被清理掉也不会生成错误。某些表不能被过早地安全清除,并且因此将不受这个设置的影响,例如系统目录。对于这些表,这个设置将不能降低膨胀,也不能降低在扫描时产生snapshot too old错误的可能性。

建议 [EN]

… or the length of the longest transaction you expect to run + 1 hour.

条评论