PostgreSQL 9.6.6中max_wal_size查询结果不一致问题咨询
关于PostgreSQL中
max_wal_size查询结果不一致的问题 首先得给你明确:show max_wal_size和select setting from pg_settings where name = 'max_wal_size'在逻辑上是完全等价的——PostgreSQL的show命令本质就是封装了对pg_settings视图的对应查询,正常情况下两者返回的结果应该一模一样。你遇到的不一致,大概率是下面这些细节没注意到:
- 误看了
pg_settings的其他字段:pg_settings里有好几个和参数值相关的列,比如boot_val(数据库启动时的默认值)、reset_val(执行reset max_wal_size会恢复到的值),如果你不小心看了这些列而非setting,自然会和show的结果不一样。仔细检查你查询的是不是setting字段。 - 会话级参数覆盖:虽然你没通过
ALTER SYSTEM修改全局参数,但有没有在当前执行查询的会话里临时执行过SET max_wal_size = ...?会话级的修改只会影响当前会话,这时候在这个会话里查pg_settings的setting会显示修改后的值,而换个新会话执行show,看到的就是全局配置的值。 - 旧参数的影响:你用的是PostgreSQL 9.6.6,这个版本里
max_wal_size是用来替代旧参数checkpoint_segments的。如果你的postgresql.conf里同时设置了checkpoint_segments,PostgreSQL会自动把它转换为max_wal_size的值(比如32个段等价于4GB,默认每个WAL段16MB),这时候可能会出现你设置的max_wal_size被覆盖的情况,得检查配置文件里有没有同时存在这两个参数。
如何确定当前真正生效的max_wal_size值?
要准确拿到生效值,推荐这几种靠谱的方法:
- 用
show max_wal_size或current_setting()函数:这两个是最直接的,SELECT current_setting('max_wal_size');和show命令完全等价,返回的就是当前会话(或全局,无会话级修改时)的生效值。 - 完整查询
pg_settings的关键列:执行这条SQL可以同时看到参数值、来源、配置文件路径:SELECT name, setting, source, sourcefile, sourceline FROM pg_settings WHERE name = 'max_wal_size';- 如果
source显示postgresql.conf,说明当前用的是配置文件里的全局值; - 如果
source是session,说明当前会话有临时修改; - 通过
sourcefile可以确认PostgreSQL加载的是不是你修改的那个配置文件,避免改错文件白忙活。
- 如果
- 确认配置是否重载:如果你修改了
postgresql.conf,记得执行SELECT pg_reload_conf();重载配置,或者重启数据库,不然新设置不会生效。
内容的提问来源于stack exchange,提问作者seiferbb
相关产品推荐
相关产品推荐

