postgresql

时间:2018-01-29 10:39:58

标签: postgresql vacuum autovacuum

Postgresql具有真空功能,可以重新收集死元组占用的空间。默认情况下,自动真空打开,并根据配置设置运行。

当我检查pg_stat_all_tables的输出,即last_vacuum和last_autovacuum时,数据库中的大多数表都没有运行autovacuum,这些表具有足够数量的死元组(超过1K)。当这些表很少使用时,我们也会得到2-3小时的时间窗口。

以下是我的数据库的autovacuum设置 enter image description here

下面是pg_stat_all_tables的输出 enter image description here

我想问一下,仅依靠自动真空是一个好主意吗? autovacuum是否需要特殊设置才能正常工作?
我们应该设置手动真空吸尘器吗?我们应该同时使用两者还是仅关闭autovacuum并仅使用手动真空?

2 个答案:

答案 0 :(得分:1)

你绝对应该使用autovacuum。

目前是否有任何autovacuum进程在运行?

这样的表上的手册VACUUM是否成功?

设置log_autovacuum_min_duration = 0以获取有关日志中的autovacuum处理的信息。

如果系统活动过高,autovacuum可能无法跟上。在这种情况下,建议将autovacuum配置为更多攻击性,例如设置autovacuum_vacuum_cost_limit = 1000

答案 1 :(得分:1)

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

  

PostgreSQL数据库需要定期维护,称为吸尘。   对于许多安装,只需进行抽真空就足够了   由autovacuum守护程序,在第24.1.6节中描述。您   可能需要调整那里描述的autovacuuming参数   为您的情况获得最佳结果。一些数据库管理员   将要补充或替换守护进程的活动   手动管理的VACUUM命令,通常执行   根据cron或任务计划程序脚本的计划表。

vacuum创建了重要的IO,因为https://www.postgresql.org/docs/current/static/runtime-config-resource.html#RUNTIME-CONFIG-RESOURCE-VACUUM-COST可以满足您的需求。

此外,您可以为每个表设置autovacuum设置,使其更加“自定义”https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-STORAGE-PARAMETERS

以上内容可以让您了解为什么1K死元组可能不足以进行autovacuum以及如何更改它。

手动VACUUM是一次运行的完美解决方案,而运行系统时我绝对依赖autovacuum守护进程