10

我在 Ubuntu 上运行 PostgreSQL 9.2。autovacuum 进程正在服务器上运行。

数据库负载很重,每天有 1000 次添加和 100 次删除,但似乎 autovacuum 没有启动。

日志中没有任何与真空有关的内容。

正在做ps -ef | grep -i vacuum

产生:postgres 1406 1130 0 Oct13 00:00:14 postgres: autovacuum launcher process

运行查询SELECT last_autovacuum , last_autoanalyze FROM pg_stat_user_tables; 在最后一个 autovacuum 列中不产生任何记录,并且在 suto_analyze 列中产生 2 个条目。

postgresql.conf 的相关部分是:

#------------------------------------------------------------------------------
# AUTOVACUUM PARAMETERS
#------------------------------------------------------------------------------

autovacuum = on         # Enable autovacuum subprocess?  'on'
                    # requires track_counts to also be on.
log_autovacuum_min_duration = 250   # -1 disables, 0 logs all actions and
                    # their durations, > 0 logs only
                    # actions running at least this number
                    # of milliseconds.
autovacuum_max_workers = 3      # max number of autovacuum subprocesses
                    # (change requires restart)
#autovacuum_naptime = 1min      # time between autovacuum runs
autovacuum_vacuum_threshold = 128   # min number of row updates before
                    # vacuum
autovacuum_analyze_threshold = 128  # min number of row updates before
                    # analyze
#autovacuum_vacuum_scale_factor = 0.2   # fraction of table size before vacuum
#autovacuum_analyze_scale_factor = 0.1  # fraction of table size before analyze
#autovacuum_freeze_max_age = 200000000  # maximum XID age before forced vacuum
                    # (change requires restart)
#autovacuum_vacuum_cost_delay = 20ms    # default vacuum cost delay for
                    # autovacuum, in milliseconds;
                    # -1 means use vacuum_cost_delay
#autovacuum_vacuum_cost_limit = -1  # default vacuum cost limit for
                    # autovacuum, -1 means use
                    # vacuum_cost_limit

有什么想法吗?

4

1 回答 1

12

引用配置中的相关条目可能是:

autovacuum_vacuum_scale_factor = 0.2

使用此默认值,如果删除或更新了少于 20% 的行(或少于autovacuum_vacuum_threshold行但在 128 此处无关紧要),则 autovacuum 跳过表是正常的。

请参阅文档中的定义:

autovacuum_vacuum_scale_factor(浮点数)

在决定是否触发 VACUUM 时,指定要添加到 autovacuum_vacuum_threshold 的表大小的一部分。默认值为 0.2(表大小的 20%)。此参数只能在 postgresql.conf 文件或服务器命令行中设置。可以通过更改存储参数来覆盖单个表的此设置。

如果您不喜欢默认值,要让 autovacuum 处理某些表,您可以根据具体情况降低此参数。例如将其设置为 1%:

ALTER TABLE tablename SET (autovacuum_vacuum_scale_factor=0.01);
于 2013-10-24T00:43:34.003 回答