Chr*_*aíz 24 postgresql vacuum
有人可以解释VACUUMPostgreSQL 中这些类型之间的区别吗?
我阅读了文档,但它只是说FULL锁定表并FREEZE“冻结”元组。我认为那是一样的。我错了吗?
Sco*_*owe 16
这是一个简短的答案。
Vacuum full 取出一个排他锁并重建表,使其没有空块(我们现在假设填充因子为 100%)。
真空冻结用一个非常特殊的事务时间戳标记表的内容,告诉 postgres 它不需要被真空,永远。下次更新这个冻结的ID将消失。
例如,template0 数据库被冻结,因为它永远不会改变(默认情况下你不能连接到它。)
每隔一段时间,autovacuum 守护程序就会检查数据库及其表以查看需要清理的内容。如果一个表被真空冻结,然后从不更新,autovacuum 守护进程将简单地传递它。此外,postgresql 中的“环绕”保护也永远不会在该表上生效。
tl;frozen 博士将一张桌子标记为不需要任何 autovac 维护。下一次更新将解冻它。
进一步解释 Jayadevan 所写的内容。
Postgres 处理事务并跟踪可见数据的方式是通过比较内部事务 ID。但是,由于这些事务是 32 位整数,它们迟早会回绕,因此新事务看起来就像是过去所做的(因此在当前事务中不应该可见),而较旧的交易看起来像是在未来完成(并且由于未来尚不存在,该数据将不再可见)。
为了解决这个问题,Postgres 所做的是为每一个足够老的行分配一个特殊的事务 ID,它总是比每个事务都旧。您可以看到它好像有效的交易 ID 范围从 0 到 2147483647,它将所有当前行的交易 ID 设置为 -1。
但是,由于vacuum 基本上是为了标记空闲空间以供重复使用,因此它仅适用于已更改的数据页。
什么VACUUM FREEZE做的基本上是冻结所有页面的事务ID,无论他们是否已被修改或没有,所以当前所有的行都将被视为旧新的交易记录。
但是,从 8.2 版VACUUM FREEZE开始,已弃用,不应使用。取而代之的是参数vacuum_freeze_table_age,autovacuum_freeze_max_age它指定在对表执行完整扫描之前可以发生多少事务(有效地对表执行内部VACUUM FREEZE操作)。