PostgreSQL中的自动清理与手动清理

4
Postgresql具有Vacuum功能,用于回收已经无效的元组所占用的空间。自动清理默认开启,并按照配置设置运行。
当我检查pg_stat_all_tables输出即last_vacuum和last_autovacuum时,发现对于数据库中大多数具有足够数量死元组(超过1K)的表格,自动清理从未运行。在这些表格很少使用的2-3小时时间窗口内,我们也可以得到数据。
以下是我的数据库的自动清理设置 enter image description here 下面是pg_stat_all_tables的输出 enter image description here 我想问,仅依靠自动清理是否明智?自动清理需要特殊设置才能正常使用吗?应该进行手动清理吗?应该同时使用两者,还是只关闭自动清理并只使用手动清理?

嗯,这就像问你是否应该在汽车中使用手动还是自动变速器。普通用户肯定会更喜欢自动的。专业人士会使用手动来挤出最后几滴速度。现在,如果自动清理程序没有运行,并且您确定它应该运行,请发布您的配置和所有必要的数据,我们将查看它。 - freakish
1
请将此帖子移至 https://dba.stackexchange.com/。它与编程无关。 - kometen
2个回答

3

你绝对应该使用自动清理(autovacuum)。

当前是否有任何自动清理进程正在运行?

在这种表上手动执行VACUUM能成功吗?

设置log_autovacuum_min_duration = 0以获取关于自动清理处理的日志信息。

如果系统活动过于频繁,自动清理可能无法跟得上。在这种情况下,建议配置自动清理更加积极主动,例如通过设置autovacuum_vacuum_cost_limit = 1000


自动清理默认已开启。我手动为其中一张表运行了一次清理,效果良好。 - YogeshR
也许如果你按照我答案更新中指示的方式调整自动清理设置,它就能够正常工作。 - Laurenz Albe

2

https://www.postgresql.org/docs/current/static/routine-vacuuming.html

PostgreSQL数据库需要定期进行维护,称为vacuuming。对于许多安装而言,让自动清理守护程序(autovacuum daemon)执行vacuuming就足够了,该程序在第24.1.6节中有描述。您可能需要调整那里描述的自动清理参数以获得最佳结果。一些数据库管理员将想要使用手动管理的VACUUM命令来补充或替换守护程序的活动,这些命令通常由cron或Task Scheduler脚本按计划执行。
vacuum会创建大量IO,请根据您的需求调整https://www.postgresql.org/docs/current/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST
此外,您可以针对每个表设置自动清理设置,以实现更多“自定义”https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS
上述内容将让您了解为什么您的1K个死元组可能不足以进行自动清理,并且如何更改它。
手动执行VACUUM是一次性运行的完美解决方案,而要运行系统,我肯定会依赖于自动清理守护程序。

使用cron job或其他实用程序自动化手动吸尘是一个好主意吗? - YogeshR
1
我会主要依赖于自动清理,需要时再手动进行清理。计划任务运行清理通常会导致数据库管理员忘记某些事情。 - Vao Tsun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接