18.1. 设置参数

18.1.1. 参数名和值

所有参数名都是大小写不敏感的。每个参数都可以接受五种类型之一: 布尔、字符串、整数、浮点数或枚举。类型决定了设置参数的语法:

18.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.confPostgreSQL 数据目录包含一个文件 postgresql.auto.conf, 它和postgresql.conf的格式相同,但是从来不用手动编辑。 这个文件保存通过ALTER SYSTEM命令提供的设置。 在读取postgresql.conf时自动读取该文件, 并且它的设置以相同的方式发生作用。postgresql.auto.conf 中的设置覆盖postgresql.conf中的设置。

18.1.3. 通过SQL交互参数

PostgreSQL提供了三个SQL命令创建配置缺省。 已经提过的ALTER SYSTEM命令提供SQL可访问的修改全局缺省的方法; 它在功能上相当于编辑postgresql.conf。另外, 还有两个命令允许在每个数据库或每个角色的基础上设置缺省:

ALTER DATABASEALTER ROLE 设置的值仅在开始一个新的数据库会话时应用。 它们重写从配置文件或服务器命令行中获取的值,构成其余会话的缺省。 请注意,一些设置在服务器重启后就不能改变了,并且因此不能用这些命令 (或者下面列出的命令)设置。

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

另外,系统视图pg_settings 可以用来查看和修改会话本地值:

18.1.4. 通过Shell交互参数

除了在数据库或用户级别设置全局缺省或重写, 还可以通过shell工具传递设置到PostgreSQL。 服务器和libpq客户端库都接受通过shell设置的参数值。

18.1.5. 管理配置文件内容

PostgreSQL提供几个分离复杂postgresql.conf 文件为子文件的特性。这些特性在管理多个相关服务器(但不是完全相同) 的配置时特别有帮助。

除了个别的参数设置,postgresql.conf文件可以包含 包含指令,它们指定另一个文件的读取和处理, 就像在这个点插入了那个文件一样。这个特性允许配置文件被分成物理上单独的部分。 包含指令看起来像:

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内存的服务器,另一个是16GB。 最后server.conf可能真正有服务器特定配置文件信息。

另外一个可能是创建配置文件目录,并且将这些信息放入文件中。 比如,conf.d目录可能在postgresql.conf末尾被引用:

 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

这样的安排使每个配置文件的变化具有唯一名称。 当一些服务器的配置都存储在一个地方的时候,这可以帮助消除歧义。比如版本 控制存储。(版本控制下存储数据库配置文件是另一种很好的做法。)