PostgreSQL参数autovacuum

PostgreSQL 参数 autovacuum 用于启动 autovacuum launcher 子进程,对数据库自动执行 vacuum 操作。autovacuum 参数默认值为 on,但是如果要想让 autovacuum 功能真正工作,另外一个参数 track_counts 也必须设置为 on。

  • 默认值:on
  • postgresql.conf 或者 server 启动的命令行中设置,需要重启生效
  • autovacuum 和 track_counts 两个参数同时打开才能真正开启 autovacuum 功能
  • 可以通过修改表的存储参数,实现对单个表禁用 autovacuum 功能
  • 即使 autovacuum 功能是关闭的,系统在事务号快回卷的时候也会开启 autovacuum 进程来执行 vacuum 操作

修改表的存储参数,关闭 autovacuum 功能,如下:

# 创建表时指定存储参数
create table t(id text) with(autovacuum_enabled = off);

# 修改表存储参数
postgres=# alter table t set(autovacuum_enabled = off);
ALTER TABLE

# 查看表的存储参数
postgres=# \d+ t
                                     Table "public.t"
 Column |  Type  | Collation | Nullable | Default | Storage  | Stats target | Description
--------+--------+-----------+----------+---------+----------+--------------+-------------
 id     | text[] |           |          |         | extended |              |
Access method: heap
Options: autovacuum_enabled=off

内核实现上,autovacuum 参数对应全局变量 autovacuum_start_daemon。如果 autovacuum 为 on,而 track_counts 参数为 off,那么将会有一个告警日志输出出来,如下:

void
autovac_init(void)
{
    if (autovacuum_start_daemon && !pgstat_track_counts)
        ereport(WARNING,
                (errmsg("autovacuum not started because of misconfiguration"),
                 errhint("Enable the \"track_counts\" option.")));
}

以下代码表示 autovacuum 和 track_counts 两个参数都打开,才会启动 autovacuum launcher 进程。

bool
AutoVacuumingActive(void)
{
    if (!autovacuum_start_daemon || !pgstat_track_counts)
        return false;
    return true;
}

文章评论

0条评论