所有参数名称都不区分大小写。每个参数都接受五种类型之一的值:布尔值、字符串、整数、浮点数或枚举(enum)。类型决定了设置参数的语法
布尔值: 值可以写成 on
、off
、true
、false
、yes
、no
、1
、0
(所有都不区分大小写) 或其中任何一个的明确前缀。
字符串: 通常,将值用单引号括起来,并在值内加倍任何单引号。但是,如果值是简单的数字或标识符,则通常可以省略引号。(在某些上下文中,与 SQL 关键字匹配的值需要引号。)
数值(整数和浮点数): 数值参数可以用惯用的整数和浮点格式指定;如果参数是整数类型,则小数部分值将四舍五入到最接近的整数。整数参数还接受十六进制输入(以 0x
开头)和八进制输入(以 0
开头),但这些格式不能有小数部分。不要使用千位分隔符。除了十六进制输入外,不需要引号。
带单位的数值: 一些数值参数具有隐式单位,因为它们描述内存或时间的量。单位可能是字节、千字节、块(通常为 8 千字节)、毫秒、秒或分钟。这些设置的未加修饰的数值将使用该设置的默认单位,可以从 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';
除了设置全局默认值或在数据库或角色级别附加覆盖之外,您还可以通过 Shell 工具将设置传递给 PostgreSQL。服务器和 libpq 客户端库都接受通过 Shell 传递的参数值。
在服务器启动期间,可以使用 -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
其他客户端和库可能会提供它们自己的机制,通过 Shell 或其他方式,允许用户在不直接使用 SQL 命令的情况下更改会话设置。
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
这种安排为每个配置文件的变体提供了唯一的名称。当多个服务器的配置都存储在一个位置(例如在版本控制存储库中)时,这有助于消除歧义。(将数据库配置文件存储在版本控制下是另一个值得考虑的良好做法。)
如果您发现文档中有任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用 此表单 报告文档问题。