第 18 章 服务器配置
目录
有许多配置参数会影响数据库系统的行为。本章第一节将介绍如何与配置参数交互。后续各节将详细讨论每个参数。
18.1. 设置参数 #
18.1.1. 参数名称和值 #
所有参数名都是大小写不敏感的。每个参数都接受五种类型之一的值:布尔、整数、浮点数、字符串或枚举。布尔值可以被写成 on、off、true、false、yes、no、1、0(都是大小写不敏感的)或者这些值的任何无歧义前缀。
有些设置指定内存或时间值。其中每一种都有一个隐含单位,即千字节、块(通常是八千字节)、毫秒、秒或分钟之一。默认单位可以通过 pg_settings.unit
查到。为方便起见,也可以显式指定一个不同的单位。有效的内存单位有
kB(千字节)、MB(兆字节)和 GB(吉字节);有效的时间单位有
ms(毫秒)、s(秒)、min(分钟)、h(小时)和 d(天)。注意内存单位的乘数是 1024 而不是 1000。
“枚举”类型参数的指定方式与字符串参数相同,但被限制为一组有限的值。允许的值可以从 pg_settings.enumvals
查到。枚举参数值是大小写不敏感的。
18.1.2. 通过配置文件影响参数 #
设置这些参数最基本的方法是编辑文件
postgresql.conf,它通常位于数据目录中。在数据库集簇目录初始化时,会安装该文件的一个默认副本。其内容示例如下:
# This is a comment log_connections = yes log_destination = 'syslog' search_path = '"$user", public' shared_buffers = 128MB
每行指定一个参数。名称和值之间的等号是可选的。空白不重要(引号括起的参数值内部除外),空行会被忽略。井号(#)表示该行余下部分是注释。不是简单标识符或数字的参数值必须用单引号括起。要在参数值中嵌入单引号,可以写两个单引号(推荐)或使用反斜线转义单引号。如果文件包含相同参数的多个条目,则忽略除最后一个之外的所有条目。
除了单个参数设置之外,postgresql.conf 文件还可以包含
include 指令,用来指定另一个要读取和处理的文件,就像把该文件插入到配置文件的这个位置一样。这一特性允许把一个配置文件拆分成多个物理上独立的部分。include 指令的形式如下:
include 'filename'
如果文件名不是绝对路径,则会被解释为相对于引用它的配置文件所在目录的路径。include 可以嵌套。
还有一个 include_if_exists 指令,其行为与 include 相同,但在被引用文件不存在或无法读取时有所不同。普通的 include 会将其视为错误,而 include_if_exists 只会记录一条消息并继续处理引用它的配置文件。
主服务器进程每次收到SIGHUP信号(最简单的方法是用pg_ctl reload发送该信号)后都会重新读取这个配置文件。主服务器进程还会把这个信号传播给所有正在运行的服务器进程,这样现有的会话也能采用新值(要等待它们完成当前正在执行的客户端命令之后才会发生)。另外,你可以直接向一个单一服务器进程发送该信号。有些参数只能在服务器启动时设置,在配置文件中对这些条目的修改将被忽略,直到下次服务器重启。配置文件中的非法参数设置也会在SIGHUP处理过程中被忽略(但是会记录日志)。
18.1.3. 设置参数的其他方法 #
设置这些配置参数的第二种方法是把它们作为 postgres 命令的命令行选项给出,例如:
postgres -c log_connections=yes -c log_destination='syslog'
命令行选项覆盖 postgresql.conf 中任何冲突的设置。注意这意味着你将无法通过编辑
postgresql.conf 即时更改该值,因此虽然命令行方法可能很方便,但日后可能会让你失去灵活性。
有时只给某个特定会话指定命令行选项很有用。为此可以在客户端使用环境变量
PGOPTIONS:
env PGOPTIONS='-c geqo=off' psql
(这适用于任何基于 libpq 的客户端应用,而不仅仅是
psql。)注意,对于在服务器启动时就固定、或者必须在
postgresql.conf 中指定的参数,这种方式无效。
此外,还可以把一组参数设置指派给某个用户或某个数据库。每当会话启动时,都会加载相关用户和数据库的默认设置。分别使用ALTER ROLE和ALTER DATABASE命令来配置这些设置。每个数据库的设置覆盖从 postgres 命令行或配置文件收到的任何内容,而后者又被每用户的设置覆盖;两者都会被每会话的设置覆盖。
有些参数可以在各个 SQL 会话中用SET命令更改,例如:
SET ENABLE_SEQSCAN TO OFF;
如果允许 SET,它将覆盖该参数所有其他来源的值。有些参数不能通过
SET 更改:例如,控制在不重启整个 PostgreSQL
服务器的情况下无法更改的行为的参数。此外,有些参数需要超级用户权限才能通过
SET 或 ALTER 更改。