PostgreSQL documentation on vacuum声明

冻结的行版本被视为插入的XID是FrozenTransactionID,因此无论环绕问题如何,对于所有正常事务来说,它们都将看起来是"过go 的",因此这样的行版本将一直有效,直到被删除为止,无论删除时间有多长.

并进一步指出,

RelFrozenxid值大于AutoVacuum_Freeze_max_age事务的旧事务的表始终被清理

对我来说,第一个摘录意味着这样一个表,其中表上的每条记录都被‘冻结’,并且表没有进一步的更改,为了防止事务ID回绕,不需要进一步的真空.

但第二个摘录说的正好相反,它说even for tables with everything frozen and no changes a periodic vacuum is needed for wraparound prevention reasons?

这两种说法哪一种是正确的?

我做了一个小测试,第二个似乎是真的,但我不愿相信:

create t (c int);
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 6
vacuum freeze t;
select age(c.relfrozenxid) from pg_class c where relname = 't'; 
-- 2
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 68
vacuum freeze t;
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 7
select age(c.relfrozenxid) from pg_class c where relname = 't';
-- 15

对我来说,这似乎是Postgres中的一个错误,静态表一次又一次地对它们执行autovacuum (to prevent wraparound),除非您有某种脚本定期对它们执行vacuum freeze

推荐答案

没有错误,是的,完全冻结的桌子仍然会得到定期的反环绕自动真空运行.然而,由于表中的所有块都是冻结的,因此自动真空运行实际上除了更新pg_class.relfrozenxid之外什么也不做.

Postgresql相关问答推荐

使用RANGE窗口框架条款将SUM分析函数从PostgreSQL移至Redwitch

带有regex表达式的Postgres SQL

在PostgreSQL中,`MY_VARIABLE IN(<;Long_ARRAY_of_Items>;)`何时是FAST?

如何返回old_ids和重复行的映射';来自PostgreSQL函数的s new_id

仅使用 ssl 连接到 Postgresql 数据库

错误:用户需要系统密码:postgres

在 Windows 上使用 rsync 进行 Postgresql 副本升级

在 postgresql 数据库 timestampz 中保留用户偏移量

Rails Migration 使用转换将字符串转换为整数

如何在 PostgreSQL 中截断日期?

Rails 4查询由单个属性唯一

获取 PostgreSQL 中当前正在运行的查询的参数

如何确定 NULL 是否包含在 Postgres 的数组中?

Postgres - 如果找不到记录,则在更新时返回错误

在 PostgreSQL 中的表上禁用 DELETE?

如何启动 Postgres 服务器?

如何增加 max_locks_per_transaction

PostgreSQL:如何在用户级别设置 search_path?

全文的 Postgresql 前缀通配符

Heroku 上的 Postgres 并将单个表转储到转储文件