20.1. 设置参数#
20.1.1. 参数名称和值#
所有参数名称不区分大小写。每个参数采用五种类型之一的值:布尔值、字符串、整数、浮点数或枚举(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
中找到。枚举参数值不区分大小写。
20.1.2. 通过配置文件进行参数交互#
设置这些参数的最基本方法是编辑文件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
。不建议在服务器运行时执行此操作,因为并发ALTER SYSTEM
命令可能会覆盖此类更改。此类工具可能只是将新设置追加到末尾,或者它们可能会选择删除重复设置和/或注释(如同ALTER SYSTEM
所做的那样)。
系统视图pg_file_settings
有助于预先测试配置文件的更改,或在SIGHUP信号未产生预期效果时诊断问题。
20.1.3. 通过 SQL 进行参数交互#
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.27.1 节)。命令
SET
允许修改可以局部设置到会话的那些参数的当前值;它对其他会话没有影响。许多参数可以通过这种方式由任何用户设置,但有些参数只能由超级用户和已授予该参数的SET
权限的用户设置。相应的 SQL 函数是set_config(setting_name, new_value, is_local)
(请参阅 第 9.27.1 节)。
此外,系统视图pg_settings
可用于查看和更改会话局部值
查询此视图类似于使用
SHOW ALL
,但提供了更多详细信息。它还更灵活,因为可以指定筛选条件或联接其他关系。在此视图上使用
UPDATE
,特别是更新setting
列,等效于发出SET
命令。例如,等效于SET configuration_parameter TO DEFAULT;
是
UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';
20.1.4. 通过 Shell 进行参数交互#
除了设置全局默认值或在数据库或角色级别附加覆盖项之外,还可以通过 Shell 工具将设置传递给PostgreSQL。服务器和libpq客户端库都通过 Shell 接受参数值。
在服务器启动期间,可以通过
-c
命令行参数将参数设置传递给postgres
命令。例如,postgres -c log_connections=yes -c log_destination='syslog'
通过这种方式提供的设置将覆盖通过
postgresql.conf
或ALTER SYSTEM
设置的设置,因此它们不能在不重新启动服务器的情况下全局更改。通过 libpq 启动客户端会话时,可以使用
PGOPTIONS
环境变量指定参数设置。通过这种方式建立的设置构成会话生命周期的默认值,但不影响其他会话。出于历史原因,PGOPTIONS
的格式类似于启动postgres
命令时使用的格式;具体来说,必须指定-c
标志。例如,env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql
其他客户端和库可能会通过 Shell 或其他方式提供自己的机制,允许用户在不直接使用 SQL 命令的情况下更改会话设置。
20.1.5. 管理配置文件内容#
PostgreSQL提供了多种功能,用于将复杂的postgresql.conf
文件分解为子文件。在管理具有相关但并非完全相同的配置的多个服务器时,这些功能特别有用。
除了各个参数设置之外,postgresql.conf
文件还可以包含include 指令,该指令指定另一个文件,以便在该位置将其读入并处理,就好像将其插入到配置文件中一样。此功能允许将配置文件分成物理上独立的部分。Include 指令看起来很简单
include 'filename'
如果文件名不是绝对路径,则将其视为相对于包含引用配置文件的目录。可以嵌套包含。
还有一个include_if_exists
指令,其作用与include
指令相同,但当引用的文件不存在或无法读取时除外。常规include
会将这种情况视为错误条件,但include_if_exists
仅仅会记录一条消息并继续处理引用配置文件。
postgresql.conf
文件还可以包含include_dir
指令,该指令指定要包含的整个配置文件目录。它们看起来像
include_dir 'directory'
非绝对目录名称被视为相对于包含引用配置文件的目录。在指定目录中,仅包含名称以后缀.conf
结尾的非目录文件。还将忽略以.
字符开头的文件名,以防止出现错误,因为此类文件在某些平台上是隐藏的。将按文件名顺序(根据 C 语言环境规则,即数字在字母之前,大写字母在小写字母之前)处理包含目录中的多个文件。
可以将包含文件或目录用于逻辑上分隔数据库配置的部分,而不是使用单个大型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
这种安排为每个配置文件变体提供了一个唯一名称。当多台服务器的配置都存储在一个地方(例如版本控制存储库)时,这有助于消除歧义。(将数据库配置文件存储在版本控制下是另一个值得考虑的良好做法。)