19.1. 设置参数

19 .1.1. 参数名称和值

所有参数名称都不区分大小写。每个参数都采用以下五种类型之一的值:布尔值,字符串,整数,浮点数或枚举(枚举)。类型确定用于设置参数的语法:

  • *布尔值:*值可以写为onofftruefalseyesno10(全部不区分大小写)或其中之一的明确前缀。

    • String:*通常,将值用单引号引起来,将值内的所有单引号加倍。但是,如果值是一个简单数字或标识符,通常可以省略引号。
  • *数字(整数和浮点数):*仅对浮点参数允许小数点。不要使用千位分隔符。不需要引号。

  • *带单位的数字:*一些数字参数具有隐式单位,因为它们描述内存或时间量。单位可以是千字节,块(通常为八千字节),毫秒,秒或分钟。这些设置之一的未经修饰的数值将使用该设置的默认单位,可以从pg_settings获悉。 unit。为了方便起见,可以使用显式指定的单位(例如,'120 ms'作为时间值)进行设置,然后将其转换为参数的实际单位。请注意,该值必须作为字符串(带引号)写入才能使用此功能。单位名称区分大小写,数值和单位之间可以有空格。

  • 有效的内存单位是kB(千字节),MB(兆字节),GB(千兆字节)和TB(TB)。存储单元的乘数为 1024,而不是 1000.

    • 有效时间单位是ms(毫秒),s(秒),min(分钟),h(小时)和d(天)。
  • *枚举:*枚举类型参数的编写方式与字符串参数相同,但仅限于具有一组有限的值。可以从pg_settings找到该参数允许的值。 enumvals。枚举参数值不区分大小写。

19 .1.2. 通过配置文件进行参数交互

设置这些参数的最基本方法是编辑文件postgresql.conf ,该文件通常保存在数据目录中。初始化数据库集群目录时,将安装默认副本。该文件的外观示例如下:

# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB

每行指定一个参数。名称和值之间的等号是可选的。空格无关紧要(带引号的参数值中除外),并且空行将被忽略。井号(#)将行的其余部分指定为 Comments。非简单标识符或数字的参数值必须用单引号引起来。要将单引号嵌入参数值中,请写两个引号(首选)或反斜杠引号。如果文件包含同一参数的多个条目,则除最后一个条目外的所有条目都将被忽略。

以这种方式设置的参数为群集提供默认值。除非被覆盖,否则活动会话看到的设置将是这些值。以下各节介绍了 Management 员或用户可以覆盖这些默认设置的方式。

只要主服务器进程收到 SIGHUPsignal,就会重新读取配置文件;通过从命令行运行pg_ctl reload或调用 SQL 函数pg_reload_conf(),最容易发送此 signal。主服务器进程还将此 signal 传播到所有当前正在运行的服务器进程,以便现有会话也采用新值(这将在它们完成任何当前正在执行的 Client 端命令之后发生)。或者,您可以将 signal 直接发送到单个服务器进程。某些参数只能在服务器启动时设置。在重新启动服务器之前,将忽略对配置文件中条目的任何更改。在 SIGHUP 处理期间,同样会忽略(但会记录)配置文件中无效的参数设置。

除了postgresql.conf之外,PostgreSQL 数据目录还包含文件postgresql.auto.conf ,该文件的格式与postgresql.conf相同,但旨在自动进行编辑,而无需手动进行编辑。该文件包含通过ALTER SYSTEM命令提供的设置。每当postgresql.conf时都将读取此文件,并且其设置以相同的方式生效。 postgresql.auto.conf中的设置将覆盖postgresql.conf中的设置。

外部工具也可以修改postgresql.auto.conf。不建议在服务器运行时执行此操作,因为并发ALTER SYSTEM命令可能会覆盖此类更改。此类工具可能只是将新设置附加到末尾,或者它们可能选择删除重复的设置和/或 Comments(如ALTER SYSTEM一样)。

系统视图pg_file_settings有助于预先测试对配置文件的更改,或者如果 SIGHUPsignal 没有达到预期的效果,则有助于诊断问题。

19 .1.3. 通过 SQL 进行参数交互

PostgreSQL 提供了三个 SQL 命令来构建默认配置。已经提到的ALTER SYSTEM命令提供了一种可通过 SQL 访问的方式来更改全局默认值。它在功能上等同于编辑postgresql.conf。另外,有两个命令允许按数据库或角色设置默认值:

  • ALTER DATABASE命令允许在每个数据库的基础上覆盖全局设置。

  • ALTER ROLE命令允许使用用户特定的值覆盖全局和每个数据库的设置。

仅在开始全新的数据库会话时才应用用ALTER DATABASEALTER ROLE设置的值。它们会覆盖从配置文件或服务器命令行获取的值,并构成其余会话的默认值。请注意,服务器启动后无法更改某些设置,因此无法使用这些命令(或下面列出的命令)进行设置。

Client 端连接到数据库后,PostgreSQL 将提供两个附加的 SQL 命令(和等效功能)以与会话本地配置设置进行交互:

  • SHOW命令允许检查所有参数的当前值。对应的功能是current_setting(setting_name text)

  • SET命令允许修改可以在会话中本地设置的那些参数的当前值;它对其他会话没有影响。对应的功能是set_config(setting_name, new_value, is_local)

此外,系统视图pg_settings可用于查看和更改会话本地值:

  • 查询此视图类似于使用SHOW ALL,但提供了更多详细信息。它也更加灵活,因为可以指定过滤条件或加入其他关系。

  • 在此视图上使用UPDATE,特别是更新setting列,等效于发出SET命令。例如,相当于

SET configuration_parameter TO DEFAULT;

is:

UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';

19 .1.4. 通过 Shell 进行参数交互

除了设置全局默认值或在数据库或角色级别附加替代,您还可以通过 Shell 程序将设置传递给 PostgreSQL。服务器和 libpqClient 端库都通过 Shell 接受参数值。

  • 在服务器启动期间,可以通过-c命令行参数将参数设置传递给postgres命令。例如,
postgres -c log_connections=yes -c log_destination='syslog'

以这种方式提供的设置将覆盖通过postgresql.confALTER SYSTEM进行的设置,因此,如果不重新启动服务器,则无法全局更改它们。

  • 通过 libpq 启动 Client 端会话时,可以使用PGOPTIONS环境变量指定参数设置。以这种方式构建的设置构成会话生命周期的默认值,但不影响其他会话。由于历史原因,PGOPTIONS的格式类似于启动postgres命令时使用的格式;具体来说,必须指定-c标志。例如,
env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql

其他 Client 端和库可能会通过 Shell 或其他方式提供自己的机制,这些机制使用户无需直接使用 SQL 命令即可更改会话设置。

19 .1.5. Management 配置文件内容

PostgreSQL 提供了多种功能,可以将复杂的postgresql.conf文件分解为子文件。当使用相关但不相同的配置 Management 多台服务器时,这些功能特别有用。

除了单独的参数设置外,postgresql.conf文件还可以包含* include 指令*,该指令指定另一个要读取和处理的文件,就像此时已将其插入配置文件中一样。此功能允许将配置文件分为物理上独立的部分。包含指令看起来就像:

include 'filename'

如果文件名不是绝对路径,则将其视为包含引用配置文件的目录的相对路径。内含物可以嵌套。

还有一个include_if_exists指令,其作用与include指令相同,但所引用的文件不存在或无法读取时除外。常规include会认为这是错误情况,但是include_if_exists只会记录一条消息并 continue 处理引用配置文件。

postgresql.conf文件还可以包含include_dir指令,这些指令指定要包括的配置文件的整个目录。这些看起来像

include_dir 'directory'

非绝对目录名被视为相对于包含引用配置文件的目录。在指定目录中,仅包含名称后缀为.conf的非目录文件。以.字符开头的文件名也将被忽略,以防止出错,因为此类文件在某些平台上是隐藏的。包含目录中的多个文件按文件名 Sequences 处理(根据 C 语言环境规则,即字母前的数字和小写字母前的大写字母)。

包含文件或目录可用于在逻辑上分隔数据库配置的各个部分,而不是具有单个大的postgresql.conf文件。考虑一家拥有两个数据库服务器的公司,每个服务器具有不同的内存量。对于诸如日志之类的东西,配置中可能都有共享的元素。但是服务器上与内存相关的参数在这两者之间会有所不同。而且可能还会有特定于服务器的自定义项。解决这种情况的一种方法是将站点的自定义配置更改分为三个文件。您可以将其添加到postgresql.conf文件的末尾以包括它们:

include 'shared.conf'
include 'memory.conf'
include 'server.conf'

所有系统都具有相同的shared.conf。具有特定内存量的每个服务器可以共享相同的memory.conf;对于所有具有 8GB RAM 的服务器,您可能会有一个服务器;对于具有 16GB 的服务器,可能会有一个服务器。最后server.conf可能 true 包含服务器特定的配置信息。

另一种可能性是创建一个配置文件目录,并将此信息放入那里的文件中。例如,可以在postgresql.conf的末尾引用conf.d目录:

include_dir 'conf.d'

然后,您可以像这样在conf.d目录中命名文件:

00shared.conf
01memory.conf
02server.conf

该命名约定确定了加载这些文件的明确 Sequences。这很重要,因为仅使用服务器读取配置文件时特定参数遇到的最后一个设置。在此示例中,conf.d/02server.conf中设置的内容将覆盖conf.d/01memory.conf中设置的值。

您可以改用这种方法来描述性地命名文件:

00shared.conf
01memory-8GB.conf
02server-foo.conf

这种安排为每个配置文件变体提供了唯一的名称。当多个服务器的配置都存储在一个位置(例如版本控制存储库)中时,这可以帮助消除歧义。 (在版本控制下存储数据库配置文件是要考虑的另一种好习惯.)