了解 postgresql.conf 文件中的“max_wal_size”和“min_wal_size”参数默认值

Oto*_*dze 21 postgresql configuration write-ahead-logging postgresql-9.5

根据参数的文档,min_wal_sizemax_wal_size默认值为:

对于max_wal_sizeThe default is 1 GB
对于min_wal_sizeThe default is 80 MB

然后我从我的数据库配置中查看这些参数:

select name, setting, unit 
from pg_settings 
where name in ('min_wal_size', 'max_wal_size')
Run Code Online (Sandbox Code Playgroud)

给出结果:

name         |  setting | unit
----------------------------------
max_wal_size | 64       | 
min_wal_size | 5        |
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

1) 为什么这些值与文档中显示的默认值不匹配?我从来没有改变过配置设置。

2) 为什么unit这些参数的列是空的/NULL?在这种情况下,64 和 5 值是什么意思?MB? GB? 或者是什么?

为什么这不像例如 work_mem参数,当一切都清楚时:

name         | setting  | unit
----------------------------------
work_mem     | 4096     | kB
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 16

默认情况下,这些是 16 MB WAL 段。手册:

系统物理上把这个序列分成WAL段文件,一般每个16MB(虽然在构建PostgreSQL时段大小可以改变)

所以,它只是宣传的默认值:

select name, setting, setting::int * 16 || 'MB' AS setting_in_mb
from pg_settings 
where name in ('min_wal_size', 'max_wal_size');
Run Code Online (Sandbox Code Playgroud)

unitinpg_settings当它是一个实际的基本单位时存在,例如secondMB。在这种情况下,“单元”将是“WAL 段”,它可以在编译 Postgres 之前进行配置。unit对于那些,该列只是 NULL。


小智 6

2021 年更新:

在 Postgres 12.3 设置中,此查询现在返回单位:

select name, setting, unit 
from pg_settings 
where name in ('min_wal_size', 'max_wal_size');
Run Code Online (Sandbox Code Playgroud)

结果:

     name     | setting | unit
--------------+---------+------
 max_wal_size | 1024    | MB
 min_wal_size | 80      | MB
(2 rows)
Run Code Online (Sandbox Code Playgroud)

此外,文档还指出:

如果指定该值时没有单位,则以兆字节为单位。默认值为 1 GB。