所有参数名称不区分大小写。每个参数取值有五种类型:布尔型、字符串型、整形、浮点型或枚举型 (enum)。类型决定参数设置时的语法
布尔值:可以将值写为 on
、off
、true
、false
、yes
、no
、1
、0
(所有不区分大小写)或其中任一词的不含歧义的前缀。
字符串:通常,用单引号括住值,将值中的所有单引号加倍。但是,如果值是简单的数字或标识符,通常可以省略引号。(与 SQL 关键字匹配的值,在某些上下文中需要用引号引起来。)
数字(整数和浮点数):数字参数可以使用习惯的整数和浮点格式指定;如果参数是整数类型,则分数值将四舍五入到最接近的整数。整数参数另外接受十六进制输入(以 0x
开头)和八进制输入(以 0
开头),但这些格式不能有分数。请勿使用千位分隔符。除十六进制输入外,无需加引号。
带有单位的数字:由于某些数字参数描述了内存或时间量,因此它们具有隐式单位。该单位可能是字节、千字节、块(通常为八千字节)、毫秒、秒或分钟。这些设置之一的未修饰数字值将使用设置的默认单位,该单位可以从 pg_settings
.unit
中获取。为了方便起见,设置可以指定明确指定的单位,例如时间值 '120 ms'
,它们将转换为参数实际单位。请注意,必须以字符串(带引号)形式编写该值才能使用此功能。单位名称区分大小写,数字值和单位之间可以有空格。
有效的内存单位是 B
(字节)、kB
(千字节)、MB
(兆字节)、GB
(千兆字节)和 TB
(太字节)。内存单位的乘数是 1024,而不是 1000。
有效的时间单位是 us
(微秒)、ms
(毫秒)、s
(秒)、min
(分钟)、h
(小时)和 d
(天)。
如果某个分数与一个单位搭配使用,它将被四舍五入到相邻小单位的倍数(如果小单位存在)。例如,30.1 GB
将被转换成 30822 MB
,而不是 32319628902 B
。如果参数是整数类型,任何单位转换后都会对最终结果进行四舍五入。
枚举: 枚举类型参数的编写方式与字符串参数相同,但仅限于一系列有限值。参数允许的值可从 pg_settings
.enumvals
找到。枚举参数值不区分大小写。
设置这些参数最基本的方法是编辑文件 postgresql.conf
,它通常保存在数据目录中。当数据库集群目录初始化时,将安装一个默认副本。该文件的外观示例如下:
# This is a comment log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB
每行指定一个参数。名称和值之间的等号是可选的。空白字符无关紧要(引号参数值中的空白字符除外),且空白行将被忽略。哈希标记 (#
) 指定行的其余部分为注释。不是简单标识符或数字的参数值必须使用单引号引起来。若要在参数值中嵌入单引号,请使用两个引号(更佳)或反斜杠引号。如果文件中对于同一个参数有多个条目,除了最后一个条目之外,其他条目都将被忽略。
通过这种方式设置的参数为集群提供默认值。除非这些值被覆盖,否则活动会话看到的设置将为这些值。以下部分描述了管理员或用户覆盖这些默认值的方法。
配置文件在主服务器进程接收到 SIGHUP 信号时重新加载;发送此信号最简单的方法是从命令行运行 pg_ctl reload
或调用 SQL 函数 pg_reload_conf()
。主服务器进程还会将此信号传播至所有当前正在运行的服务器进程,以便现有会话也采用新值(这会在完成任何当前正在执行的客户端命令后发生)。或者,可以直接向单个服务器进程发送信号。一些参数只能在服务器启动时设置;配置文件中它们条目的任何更改在服务器重新启动之前都将被忽略。在 SIGHUP 处理期间,配置文件中的无效参数设置同样会被忽略(但会记录在日志中)。
除了 postgresql.conf
,一个 PostgreSQL 数据目录包含一个文件 postgresql.auto.conf
,其格式与 postgresql.conf
相同,但意在自动编辑,而不是手动编辑。此文件保存通过 ALTER SYSTEM
命令提供的设置。每当读取 postgresql.conf
时也会读取此文件,且其设置会以相同的方式生效。 postgresql.auto.conf
中的设置会覆盖 postgresql.conf
中的设置。
外部工具也可能会修改 postgresql.auto.conf
。除非将 allow_alter_system 设置为 off
,否则建议不要在服务器运行时执行此操作,因为并发的 ALTER SYSTEM
命令可能覆盖此类更改。此类工具可能只是将新设置追加到结尾,或者它们可能选择删除重复的设置和/或注释(如同 ALTER SYSTEM
所做的那样)。
系统视图 pg_file_settings
有助于预先测试配置文件的更改,或在 SIGHUP 信号未产生所需效果时诊断问题。
PostgreSQL 提供了三个 SQL 命令来建立配置默认值。前面提到的 ALTER SYSTEM
命令提供了一种 SQL 可访问的方法来更改全局默认值;其作用相当于编辑 postgresql.conf
。此外,还有两个命令允许在每个数据库或每个角色的基础上设置默认值。
ALTER DATABASE
命令允许在每个数据库的基础上覆盖全局设置。
ALTER ROLE
命令允许使用用户特定的值覆盖全局设置和每个数据库的设置。
使用 ALTER DATABASE
和 ALTER ROLE
设置的值仅在启动新的数据库会话时应用。它们会覆盖从配置文件或服务器命令行获取的值,并构成会话其余时间的默认值。请注意,某些设置在服务器启动后无法更改,因此无法使用这些命令(或下面列出的命令)进行设置。
客户端连接到数据库后,PostgreSQL 提供了两个额外的 SQL 命令(和等效函数)来与会话本地配置设置进行交互。
SHOW
命令允许检查任何参数的当前值。相应的 SQL 函数是 current_setting(setting_name text)
(请参见 第 9.28.1 节)。
SET
命令允许修改可以局部设置到会话的一些参数的当前值,它对其他会话没有影响。许多参数可以被任何用户设置成这样,但有些只能被超级用户和已被授予了该参数的 SET
权限的用户才能设置。相应的 SQL 函数是 set_config(setting_name, new_value, is_local)
(请参见第 9.28.1 节)。
此外,系统视图 pg_settings
可用于查看和修改局部会话值
查询此视图与使用 SHOW ALL
类似,但提供更详细的信息。它也更灵活,因为可以指定过滤条件或联接其他关系。
对此视图使用 UPDATE
,具体是更新 setting
列,等效于发出 SET
命令。例如,等效于
SET configuration_parameter TO DEFAULT;
是
UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';
除了在数据库或角色级别设置全局默认值或附加覆盖之外,还可以通过外壳设施将设置传递给 PostgreSQL。服务器和 libpq 客户端库都通过外壳接受参数值。
在服务器启动期间,可以通过 -c name=value
命令行参数或其等效的 --name=value
变体将参数设置传递给 postgres
命令。例如:
postgres -c log_connections=yes --log-destination='syslog'
以这种方式提供的设置覆盖通过 postgresql.conf
或 ALTER SYSTEM
设置的设置,因此在不重新启动服务器的情况下无法全局更改这些设置。
通过 libpq 启动客户端会话时,可以使用 PGOPTIONS
环境变量指定参数设置。以这种方式建立的设置构成了会话生命周期的默认值,但不影响其他会话。出于历史原因,PGOPTIONS
的格式类似于启动 postgres
命令时使用的格式;具体而言,必须在名称前指定 -c
或前置 --
。例如:
env PGOPTIONS="-c geqo=off --statement-timeout=5min" psql
其他客户端和库可能会提供它们自己的机制(通过外壳或其他方式),允许用户在不直接使用 SQL 命令的情况下更改会话设置。
PostgreSQL 提供了多种功能,用于将复杂的 postgresql.conf
文件分解为子文件。在管理相关性高但并不完全相同的多台服务器的配置时,这些功能尤为有用。
除了单个参数设置之外,postgresql.conf
文件还可以包含include 指令,其中指定了在当前位置插入到配置文件中之后读取和处理的另一个文件。此功能允许将配置文件分成不同的物理部分。Include 指令的格式如下
include 'filename'
如果文件名不是绝对路径,则视为相对于包含该引用配置文件的目录。可以嵌套 include 指令。
还有一个include_if_exists
指令,除了当引用的文件不存在或无法读取时,它会执行与 include
指令相同的功能。常规的 include
会将此视为一个错误条件,但 include_if_exists
仅会记录一条消息,并继续处理引用配置文件。
postgresql.conf
文件还可以包含 include_dir
指令,其中指定了要包含的整个配置文件目录。其格式如下
include_dir 'directory'
将非绝对目录名视为相对于包含该引用配置文件的目录。在指定的目录中,仅包含名称以 .conf
尾缀结尾、且不是目录的文件。还将忽略以 .
字符开头的文件名,以防止出现错误,因为在某些平台上这些文件是隐藏的。包含目录中的多个文件将按文件名顺序(根据 C 区域设置规则,即数字在前,大写字母在前,小写字母在后)进行处理。
Include 文件或目录可用于逻辑地分隔数据库配置各个部分,而不是使用单个大型的 postgresql.conf
文件。设想一家有两台数据库服务器的公司,每台服务器的内存量都不相同。配置中可能有很多项目是两台服务器共用的,例如日志记录。但是,服务器上的内存相关参数在这两台服务器之间有所不同。此外,还可能存在服务器特定的自定义设置。处理这种情况的一种方法是,将针对您的网站进行的自定义配置更改分成三个文件。您可将以下内容添加到 postgresql.conf
文件的末尾,以包含它们
include 'shared.conf' include 'memory.conf' include 'server.conf'
所有系统都将使用相同的 shared.conf
。每台特定内存量的服务器都可以共享同一个 memory.conf
;对于所有 8GB RAM 的服务器,您可能有一个,对于所有 16GB RAM 的服务器,您可能会有另一个。最后,server.conf
可能包含服务器特定的配置信息。
另一种可能性是创建一个配置文件目录,并将该信息放入那里的文件中。例如,可以在 postgresql.conf
后面引用一个 conf.d
目录
include_dir 'conf.d'
然后你可以像这样给 conf.d
目录中的文件命名
00shared.conf 01memory.conf 02server.conf
这种命名约定为加载这些文件建立了一个明确的顺序。这很重要,因为服务器在读取配置文件时只使用遇到的特定参数的最后一个设置。在此示例中,在 conf.d/02server.conf
中设置的内容将覆盖 conf.d/01memory.conf
中设置的值。
你也可以使用这种方法给文件命名以进行描述性描述
00shared.conf 01memory-8GB.conf 02server-foo.conf
这种安排为每个配置文件变体提供了一个唯一名称。当多台服务器将其配置全部存储在一个地方(例如版本控制存储库)时,这有助于消除歧义。(将数据库配置文件存储在版本控制中是需要考虑的另一项好做法。)