Gumuliokas Asked: 2021-10-22 06:14:26 +0800 CST2021-10-22 06:14:26 +0800 CST 2021-10-22 06:14:26 +0800 CST 通过真空冻结防止事务 ID 环绕 772 我最近有几个数据库需要维护。我刚刚提出这个“防止事务 ID 环绕失败”。我检查了我的数据库并得到了数字: 我在这个数据库上做了vacuumdb -a -v,然后得到了数字: 在我看来还不够好?我应该担心吗? 如果我对 PostgreSQL 手册的理解正确,我应该使用真空冻结将计数器重置为零吗?我知道这个数据库会稳定增长,通常是在插入时,而不是在删除/更新时。 谢谢你。 postgresql vacuum 2 个回答 Voted Laurenz Albe 2021-10-22T08:05:57+08:002021-10-22T08:05:57+08:00 不,VACUUM不会冻结所有行,因此不会设置datfrozenxid为当前事务 ID。 VACUUM不会冻结任何小于vacuum_freeze_min_age事务旧的行(默认为 5000 万)。 一段时间内保持未修改的行很有可能留下来,因此值得冻结它们。新行通常会很快被删除或更新,在这种情况下冻结它们(这会导致写入!)将是一种损失。 VACUUM将跳过所有“全部可见”的块,因此这些页面上的行不会被冻结。 VACUUM将跳过由于固定而无法锁定的页面。 第二点和第三点不适用于反环绕(“激进”)自动真空运行;这样的过程真的很想访问所有没有“全冻结”的页面。 您的数据库一切正常。如果行不会过早冻结,这对性能有好处。 Best Answer jjanes 2021-10-22T10:07:33+08:002021-10-22T10:07:33+08:00 故障限制为 2,000,000,000,是 autovacuum_freeze_max_age 截止值 200,000,000 的十倍。所以没有什么可担心的,你离失败很远,它会在足够的时间里自动启动。 但是一旦反环绕真空确实启动,它可能会由于表锁定而造成不便。因此,您可能希望-F在您选择的时间进行冻结(例如使用 flag 到 Vacuumdb),以防止它在您无法控制的某个时间自动发生。
不,
VACUUM
不会冻结所有行,因此不会设置datfrozenxid
为当前事务 ID。VACUUM
不会冻结任何小于vacuum_freeze_min_age
事务旧的行(默认为 5000 万)。一段时间内保持未修改的行很有可能留下来,因此值得冻结它们。新行通常会很快被删除或更新,在这种情况下冻结它们(这会导致写入!)将是一种损失。
VACUUM
将跳过所有“全部可见”的块,因此这些页面上的行不会被冻结。VACUUM
将跳过由于固定而无法锁定的页面。第二点和第三点不适用于反环绕(“激进”)自动真空运行;这样的过程真的很想访问所有没有“全冻结”的页面。
您的数据库一切正常。如果行不会过早冻结,这对性能有好处。
故障限制为 2,000,000,000,是 autovacuum_freeze_max_age 截止值 200,000,000 的十倍。所以没有什么可担心的,你离失败很远,它会在足够的时间里自动启动。
但是一旦反环绕真空确实启动,它可能会由于表锁定而造成不便。因此,您可能希望
-F
在您选择的时间进行冻结(例如使用 flag 到 Vacuumdb),以防止它在您无法控制的某个时间自动发生。