# 20.1.设置参数

20.1.1. 参数名称和值

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

20.1.3. 通过SQL进行参数交互

20.1.4. 通过壳的参数交互作用

20.1.5. 管理配置文件内容

# 20.1.1.参数名称和值

所有参数名称都不区分大小写。每个参数都采用五种类型中的一种:布尔型、字符串型、整数型、浮点型或枚举型(enum)。类型决定了设置参数的语法:

  • *布尔值:*值可以写成在…上,,符合事实的,错误的,,,1.,0(不区分大小写)或其中一个的任何明确前缀。

  • *字符串:*通常,将值括在单引号中,将值中的任何单引号加倍。但是,如果值是简单的数字或标识符,则通常可以省略引号。(与SQL关键字匹配的值在某些上下文中需要引用。)

  • *数字(整数和浮点):*数字参数可以用常用的整数和浮点格式指定;如果参数为整数类型,则将分数值舍入为最接近的整数。整数参数还接受十六进制输入(从0x)和八进制输入(从0),但这些格式不能有分数。不要使用数千个分隔符。除十六进制输入外,不需要引号。

  • *带单位的数字:*一些数值参数有一个隐式单位,因为它们描述内存或时间的数量。单位可能是字节、千字节、块(通常为8千字节)、毫秒、秒或分钟。其中一个设置的未加修饰的数值将使用该设置的默认单位,可以从PGU设置.单元.为了方便起见,可以使用明确指定的单位进行设置,例如“120毫秒”对于时间值,它们将被转换为参数的实际单位。请注意,要使用此功能,必须将值写入字符串(带引号)。单位名称区分大小写,数值和单位之间可能有空格。

    • 有效的内存单元是B(字节),kB(千字节),兆字节(兆字节),国标(千兆字节),以及结核病(TB)。内存单元的乘数是1024,而不是1000.

    • 有效时间单位为我们(微秒),太太(毫秒),s(秒),(分钟),h(小时),以及d(天)。

      如果用一个单位指定了一个分数值,它将被舍入到下一个较小单位(如果有)的倍数。例如30.1 GB将转换为30822MB32319628902 B.如果参数为整数类型,则在任何单位转换后,最终四舍五入为整数。

  • *列举:*枚举类型参数的写入方式与字符串参数相同,但仅限于具有一组有限值中的一个。此类参数的允许值可从PGU设置.枚举数.Enum参数值不区分大小写。

# 20.1.2.通过配置文件进行参数交互

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

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

每行指定一个参数。名称和值之间的等号是可选的。空白是无关紧要的(除了在引用的参数值内),空白行被忽略。散列标记(#)将行的其余部分指定为注释。非简单标识符或数字的参数值必须是单引号。要在参数值中嵌入单引号,请写两个引号(首选)或反斜杠引号。如果该文件包含同一参数的多个条目,则将忽略除最后一个条目以外的所有条目。

以这种方式设置的参数为集群提供默认值。活动会话看到的设置将是这些值,除非它们被覆盖。以下部分描述了管理员或用户可以覆盖这些默认值的方式。

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

除了postgresql。形态,PostgreSQL数据目录包含一个文件postgresql。汽车形态,其格式与postgresql。形态但其目的是自动编辑,而不是手动编辑。此文件保存通过提供的设置改变系统命令无论何时,都会读取此文件postgresql。形态是,其设置以相同的方式生效。设置在postgresql。汽车形态凌驾于postgresql。形态.

外部工具也可以修改postgresql。汽车形态。不建议在服务器运行时执行此操作,因为并发改变系统命令可能会覆盖这些更改。这些工具可能只是在末尾添加新设置,或者选择删除重复的设置和/或注释(如图所示)改变系统威尔)。

系统视图pg_文件_设置可以帮助预先测试配置文件的更改,或者在SIGHUP信号没有达到预期效果时诊断问题。

# 20.1.3.通过SQL进行参数交互

PostgreSQL提供了三个SQL命令来建立配置默认值。前面已经提到的改变系统命令提供了一种SQL可访问的方法来更改全局默认值;它在功能上等同于编辑postgresql。形态。此外,有两个命令允许在每个数据库或每个角色的基础上设置默认值:

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

  • 这个改变角色命令允许使用用户特定的值覆盖全局和每个数据库的设置。

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

    一旦客户端连接到数据库,PostgreSQL将提供两个额外的SQL命令(和等效函数)与会话本地配置设置交互:

  • 这个显示命令允许检查任何参数的当前值。相应的SQL函数是当前设置(设置名称文本)(见第9.27.1节).

  • 这个设置命令允许修改这些参数的当前值,这些参数可以在本地设置为会话;它对其他会话没有影响。相应的SQL函数是设置配置(设置名称、新值、是本地的)(见第9.27.1节).

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

  • 查询此视图类似于使用全部展示但提供了更多细节。它也更灵活,因为可以指定过滤条件或根据其他关系进行连接。

  • 使用使现代化在这个视图上,特别是更新背景列,相当于发出设置命令。例如,相当于

    SET configuration_parameter TO DEFAULT;
    

    是:

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

# 20.1.4.通过壳的参数交互作用

除了在数据库或角色级别设置全局默认值或附加覆盖外,还可以通过shell工具将设置传递给PostgreSQL。服务器和libpq客户端库都通过shell接受参数值。

  • 在服务器启动期间,可以将参数设置传递给博士后通过-c命令行参数。例如

    postgres -c log_connections=yes -c log_destination='syslog'
    

    以这种方式提供的设置会覆盖通过postgresql。形态改变系统,因此在不重新启动服务器的情况下无法全局更改它们。

  • 通过libpq启动客户端会话时,可以使用PGOPTIONS环境变量。以这种方式建立的设置构成会话生命周期的默认设置,但不影响其他会话。由于历史原因PGOPTIONS与启动博士后命令具体来说-c必须指定标志。例如

    env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql
    

    其他客户端和库可能通过shell或其他方式提供自己的机制,允许用户在不直接使用SQL命令的情况下更改会话设置。

# 20.1.5.管理配置文件内容

PostgreSQL提供了几个用于分解复杂数据的功能postgresql。形态将文件转换为子文件。当使用相关但不完全相同的配置管理多台服务器时,这些功能尤其有用。

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

include 'filename'

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

还有一个如果存在,则包括指令,其作用与包括指令,除非引用的文件不存在或无法读取。常客包括会认为这是一个错误的条件,但是如果存在,则包括只记录一条消息并继续处理引用的配置文件。

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

include_dir 'directory'

非绝对目录名被视为相对于包含引用配置文件的目录。在指定目录中,只有名称以后缀结尾的非目录文件.conf将包括在内。以.字符也被忽略,以防止错误,因为这样的文件隐藏在某些平台上。include目录中的多个文件按文件名顺序处理(根据C语言环境规则,即字母前的数字,小写字母前的大写字母)。

Include文件或目录可用于在逻辑上分隔数据库配置的各个部分,而不是具有单个大型数据库postgresql。形态文件考虑一个拥有两个数据库服务器的公司,每个服务器都有不同的内存量。在日志记录等方面,双方可能会共享一些配置元素。但服务器上与内存相关的参数在这两者之间会有所不同。而且可能还有特定于服务器的定制。管理这种情况的一种方法是将站点的自定义配置更改分为三个文件。你可以把这个加到你的postgresql。形态要包含它们的文件:

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

所有的系统都有相同的功能共享。形态.每个具有特定内存量的服务器可以共享相同的内存记忆力形态; 您可能有一个适用于所有8GB内存的服务器,另一个适用于16GB内存的服务器。最后服务器形态可能包含真正特定于服务器的配置信息。

另一种可能是创建一个配置文件目录,并将这些信息放入其中的文件中。例如,一个形态d目录可以在postgresql。形态:

include_dir 'conf.d'

然后你就可以在形态d目录如下:

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

这种命名约定确定了加载这些文件的明确顺序。这一点很重要,因为只有在服务器读取配置文件时遇到的特定参数的最后一个设置才会被使用。在这个例子中,有些东西conf.d/02server。形态将覆盖中设置的值conf.d/01内存。形态.

您可以改为使用这种方法以描述性的方式命名文件:

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

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