服务器配置
设置参数
参数名称和值
所有参数名都是大小写不敏感的。每个参数都可以接受五种类型之一的值:布尔、字符串、整数、浮点数或枚举。该类型决定了设置该参数的语法:
• 布尔: 值可以被写成 on, off, true, false, yes, no, 1, 0 (都是大小写不敏感的)或者这些值的任何无歧义前缀。
• 字符串: 通常值被包括在单引号内,值内部的任何单引号都需要被双写。不过,如果值是一个简单数字或者标识符,引号通常可以被省略。(与 SQL 关键字匹配的值需要在某些上下文中引用。)
• 数字(整数和浮点): 数字参数可以规定为惯用的整数和浮点格式;如果参数为整数类型,则小数值四舍五入到最接近的整数。证书参数还接受十六进制输入(以0x开头)和十进制输入(以0开头),但是这些格式不能有小数。不能使用千位分隔符。引号是不是必需的,除了十六进制输入。
• 带单位的数字: 一些数字参数具有隐含单位,因为它们描述内存或时间量。单位可能是字节、千字节、块(通常是 8KB)、毫秒、秒或分钟。这些设置之一的一个未修饰的数字值将使用该设置的默认单位,默认单位可以通 过引用pg_settings.unit来找到。为了方便,也可以显式地指定一个不同的单位,例如时间值可以是'120 ms',并且它们将被转换到参数的实际单位。要使用这个特性,注意值必须被写成一个字符串(带有引号)。单位名称是大小写敏感的,并且在数字值和单位之间可以有空白。
• 可用的内存单位是B(字节)、kB(千字节)、MB(兆字节)和GB(吉字节)。内存单位的乘数是 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.auto.conf,它具有和postgresql.conf相同的格式但是原自动编辑,而不是手工编辑。这个文件保存了通过ALTER SYSTEM命令提供的设置。每当postgresql.conf被读取时这个文件会被自动读取,并且它的设置会以同样的方式生效。postgresql.auto.conf中的设置会覆盖postgresql.conf中的设置。
外部工具也可以修改 postgresql.auto.conf.不建议在服务器运行时执行此操作,因为并发的 ALTER SYSTEM可能会覆盖这些更改。这些工具可能只是简单地在末尾附加新的设置,或者它们可能删除重复的设置和/或注释(就像 ALTER SYSTEM )。
系统视图pg_file_settings可以有助于对配置文件中的更改进行提前测试,或者在SIGHUP信号没有达到预期效果时用来诊断问题。
通过SQL影响参数
瀚高数据库提供了三个SQL命令来建立配置默认值。已经提到过的ALTER SYSTEM命令提供了一种改变全局默认值的从SQL可访问的方法;它在功效上等效于编辑postgresql.conf。此外,还有两个命令可以针对每个数据库或者每个角色设置默认值:
• ALTER DATABASE命令允许针对一个数据库覆盖其全局设置。
• ALTER ROLE命令允许用用户指定的值来覆盖全局设置和数据库设置。
只有当开始一个新的数据库会话时,用ALTER DATABASE和 ALTER ROLE设置的值才会被应用。它们会覆盖从配置文件或服务器命令行获得的值,并且作为该会话后续的默认值。注意某些设置在服务器启动后不能被更改,并且因此 不能被这些命令(或者下文列举的命令)设置。
一旦一个客户端连接到数据库,瀚高数据库会提供两个额外的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;
等效于:UPDATE pg_settings SET setting = reset_val WHERE name =
'configuration_parameter';
通过Shell影响参数
除了在数据库或者角色层面上设置全局默认值或者进行覆盖,你还可以通过 shell 工具把设置传递给瀚高数据库。服务器和libpq 客户端库都能通过 shell 接受参数值。
• 在服务器启动期间,可以通过-c命令行参数把参数设置传递给 postgres命令。例如:postgres -c log_connections=yes -clog_destination='syslog'
这种方式提供的设置会覆盖通过postgresql.conf或者 ALTER SYSTEM提供的设置,因此除了重启服务器之外无法从全局上改变它们。
• 当通过libpq启动一个客户端会话时,可以使用PGOPTIONS环境变量指定参数设置。这种方式建立的设置构成了会话生存期间的默认值,但是不会影响其他的会话。由于历史原因,PGOPTIONS的格式和启动 postgres命令时用到的相似,特别是-c标志必须被指定。例如:
env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql
通过shell或者其他方式,其他客户端和库可能提供它们自己的机制,以便允许用户在不直接 使用SQL命令的前提下修改会话设置。
管理配置文件内容
瀚高数据库提供了一些特性用于把复杂的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
这种形式的安排为每个配置文件变体给定了一个唯一的名称。当多个服务器把它们的配置全部存储在一个位置(例如在一个版本控制仓库中)时,这可以帮助消除歧义(在版本控制下存储数据库配置文件是另一个值得考虑的好方法)。
文件位置
除了已经提到过的postgresql.conf文件之外,瀚高数据库还使用另外两个手工编辑的配置文件,它们控制客户端认证。默认情况下,所有三个配置文件都存放在数据库集簇的数据目录中。本节描述的参数允许配置文件放在别的地方(这么做可以简化管理,特别是如果配置文件被独立放置,可以很容易保证它得到恰当的备份)。
data_directory (string)
指定用于数据存储的目录。这个选项只能在服务器启动时设置。
config_file (string)
指定主服务器配置文件(通常叫postgresql.conf)。这个参数只能在postgres命令行上设置。
hba_file (string)
指定基于主机认证配置文件(通常叫pg_hba.conf)。这个参数只能在服务器启动的时候设置。
ident_file (string)
指定用于用户名称映射的配置文件(通常叫pg_ident.conf)。这个参数只能在服务器启动的时候设置。
external_pid_file (string)
指定可被服务器创建的用于管理程序的额外进程 ID(PID)文件。这个参数只能在服务器启动的时候设置。
在默认安装中不会显式设置以上参数。相反,命令行参数-D或者环境变量PGDATA指定数据目录,并且上述配置文件都能在数据目录中找到。
如果你想把配置文件放在别的地方而不是数据目录中,那么postgres -D命令行选项或者环境变量PGDATA必须指向包含配置文件的目录,并且postgresql.conf中(或者命令行上)的data_directory参数必须显示数据目录实际存放的地方。请注意,data_directory将覆盖-D和PGDATA指定的数据目录位置,但是不覆盖配置文件的位置。
如果你愿意,可以使用选项config_file、hba_file和/或ident_file单独指定配置文件名称和位置。config_file只能在postgres命令行上指定,但是其他文件可以在主配置文件中设置。如果所有三个参数外加data_directory被显式地设置,则不必指定-D或PGDATA。
在设置任何这些参数时,相对路径将被解释为相对于postgres启动路径的路径。
连接和认证
连接设置
listen_addresses (string)
指定服务器在哪些 TCP/IP 地址上监听客户端连接。值的形式是一个逗号分隔的主机名和/或数字 IP 地址列表。特殊项*对应所有可用 IP 接口。向0.0.0.0允许监听所有 IPv4 地址并且允许监听所有 IPv6 地址。如果列表为空,服务器将根本不会监听任何 IP 接口,在这种情况中只能使用Unix域套接字来连接它。默认值是localhost,它只允许建立本地 TCP/IP “环回”连接。虽然客户端认证允许细粒度地控制谁能访问服务器,listen_addresses控制哪些接口接受连接尝试,这能帮助在不安全网络接口上阻止重复的恶意连接请求。这个参数只能在服务器启动时设置。
port (integer)
服务器监听的 TCP 端口;默认是 5866,请注意服务器会同一个端口号监听所有的IP地址。这个参数只能在服务器启动时设置。
max_connections (integer)
决定数据库的最大并发连接数。默认值通常是 100 个连接,但是如果内核设置不支持(initdb时决定),可能会比这个数少。这个参数只能在服务器启动时设置。当运行一个后备服务器时,你必须设置这个参数等于或大于主服务器上的参数。否则,后备服务器上可能无法允许查询。
superuser_reserved_connections (integer)
决定为瀚高数据库管理员户连接而保留的连接”槽”数。同时活跃的并发连接最多max_connections个。任何时候,活跃的并发连接数最多为max_connections减去superuser_reserved_connections,新连接就只能由管理员用户发起了,并且不会有新的复制连接被接受。默认值是 3 连接。这个值必须小于max_connections。这个参数只能在服务器启动时设置。
unix_socket_directories (string)
指定服务器用于监听来自客户端应用的连接的Unix域套接字目录。通过列出用逗号分隔的多个目录可以建立多个套接字。项之间的空白被忽略,如果你需要在名字中包括空白或逗号,在目录名周围放上双引号。一个空值指定在任何 Unix 域套接字上都不监听,在这种情况中只能使用 TCP/IP 套接字来连接到服务器。默认值通常是/tmp,但是在编译时可以被改变。这个参数只能在服务器启动时设置。
除了套接字文件本身(名为.s.PGSQL.nnnn,其中nnnn是服务器的端口号),一个名为.s.PGSQL.nnnn.lock的普通文件会在每个unix_socket_directories目录中被创建。任何一个都不应该被手工移除。
unix_socket_group (string)
设置 Unix 域套接字的所属组(套接字的所属用户总是启动服务器的用户)。可以与选项unix_socket_permissions一起用于对 Unix域连接进行访问控制。默认是一个空字符串,表示服务器用户的默认组。这个参数只能在服务器启动时设置。
unix_socket_permissions (integer)
设置 Unix 域套接字的访问权限。Unix 域套接字使用普通的 Unix 文件系统权限集。这个参数值应该是数字的形式,也就是系统调用chmod和umask接受的形式(如果使用自定义的八进制格式,数字必须以一个0(零)开头)。
默认的权限是0777,意思是任何人都可以连接。合理的候选是0770(只有用户和同组的人可以访问,又见unix_socket_group)和0700(只有用户自己可以访问)(请注意,对于 Unix 域套接字,只有写权限有麻烦,因此没有对读取和执行权限的设置和收回)。
这个访问控制机制与下面章中的用户认证没有关系。
这个参数只能在服务器启动时设置。
这个参数与完全忽略套接字权限的系统无关。在那些系统上,可以通过把unix_socket_directories指向一个把搜索权限限制给指定用户的目录来实现相似的效果。
bonjour (boolean)
通过Bonjour广告服务器的存在。默认值是关闭。这个参数只能在服务器启动时设置。
bonjour_name (string)
指定Bonjour服务名称。空字符串''(默认值)表示使用计算机名。如果编译时没有打开Bonjour支持那么将忽略这个参数。这个参数只能在服务器启动时设置。
tcp_keepalives_idle (integer)
规定在操作系统向客户端发送一个TCP keepalive消息后无网络活动的时间总量。如果指定值时没有单位,则以秒为单位。值0(默认值)表示选择操作系统默认值。指定不活动多少秒之后通过 TCP 向客户端发送一个 keepalive 消息。 0 值表示使用默认值。这个参数只有在支持TCP_KEEPIDLE或等效套接字选项的系统上才可以使用。在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,这个参数被忽略并且总是读作零。
tcp_keepalives_interval (integer)
规定未被客户端确认收到的TCP keepalive消息应重新传输的时间长度。 如果指定值时没有单位,则以秒为单位。值0(默认值)表示选择操作系统默认值。这个参数只有在支持TCP_KEEPINTVL或等效套接字选项的系统才可以使用。在其他系统上,必须为零。在通过 Unix域套接字连接的会话中,这个参数被忽略并总被读作零。
tcp_keepalives_count (integer)
指定服务器到客户端的连接被认为中断之前可以丢失的TCP keepalive消息的数量。值0(默认值)表示选择操作系统默认值。这个参数只有在支持TCP_KEEPCNT或等效套接字选项的系统上才可以使用。在其他系统上,必须为零。在通过 Unix 域套接字连接的会话中,这个参数被忽略并总被读作零。
tcp_user_timeout (integer)
指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的时间量。如果指定值时没有单位,则以毫秒为单位。值0(默认值)表示选择操作系统默认值。这个参数只有在支持TCP_USER_TIMEOUT的系统上才被支持;在其他系统上,它必须为零。在通过 Unix-domain 套接字连接的会话中,此参数将被忽略并且始终读取为零。
安全和认证
authentication_timeout (integer)
允许完成客户端认证的最长时间。如果一个客户端没有在这段时间里完成认证协议,服务器将关闭连接。这样就避免了出问题的客户端无限制地占有一个连接。如果指定值时没有单位,则以秒为单位。默认值是 1分钟(1m)。这个参数只能在服务器命令行上或者在postgresql.conf文件中设置。
password_encryption (enum)
当在CREATE ROLE或者ALTER ROLE中指定了口令时,这个参数决定用于加密该口令的算法。默认值是md5,它会将口令存为一个MD5哈希(on也会被接受,它是md5的别名)。将这个参数设置为scram-sha-256将使用SCRAM-SHA-256来加密口令。
注意老的客户端可能缺少对SCRAM认证机制的支持,因此无法使用用SCRAM-SHA-256加密的口令。
krb_server_keyfile (string)
设置Kerberos服务器密钥文件的位置。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
krb_caseins_users (boolean)
设置是否应该以大小写不敏感的方式对待GSSAPI用户名。默认值是off(大小写敏感)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
db_user_namespace (boolean)
这个参数启用针对每个数据库的用户名。这个参数默认是关掉的。这个参数只能 在postgresql.conf文件中或者服务器命令行上设置。
如果这个参数为打开,应该把用户创建成username@dbname的形式。当一个连接客户端传来username时,@和数据库名会被追加到用户名并且服务器会查找这个与数据库相关的用户名。注意在SQL环境中用含有@的名称创建用户时,需要把用户名放在引号内。
在这个参数被启用时,仍然可以创建平常的全局用户。而在客户端中指定这种用户时只需要简单地追加@,例如joe@。在服务器查找该用户名之前,@会被剥离掉。
db_user_namespace会导致客户端和服务器的用户名表达形式不同。认证检查总是会以服务器的用户名表达形式来完成,因此认证方法必须针对服务器用户名而不是客户端用户名来配置。由于md5方法在客户端和服务器两端都使用用户名作为salt,md5不能与db_user_namespace同时使用。
| 注意: |
|---|
| 这种特性的目的是在找到完整的解决方案之前提供一种临时的措施。在找到完整解决方案时,这个选项将被去除。 |
SSL
ssl (boolean)
启用SSL连接。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。默认值是off。
ssl_ca_file (string)
指定包含 SSL 服务器证书颁发机构(CA)的文件名。相对路径是相对于数据目录的。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。默认值为空,表示没有载入CA文件,并且客户端证书验证没有被执行。
ssl_cert_file (string)
指定包含 SSL 服务器证书的文件名。相对路径是相对于数据目录的。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。默认值是server.crt。
ssl_crl_file (string)
指定包含 SSL 服务器证书撤销列表(CRL)的文件名。其中的相对路径是相对于数据目录的。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。默认值是空,表示没有载入CRL文件。
ssl_key_file (string)
指定包含 SSL 服务器私钥的文件名。相对路径是相对于数据目录。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。默认值是server.key。
ssl_ciphers (string)
指定一个SSL密码列表,用于安全连接。这个设置的语法和所支持的值列表可以 参见 OpenSSL包中的 ciphers手册页。这个参数只能在
postgresql.conf文件中或者服务器命令行上设置。默认值是 HIGH:MEDIUM:+3DES:!aNULL。默认值通常是一种合理的选择,除非用户有特定的安全性需求。
默认值的解释:
HIGH
使用来自HIGH组的密码的密码组(例如 AES, Camellia, 3DES)
MEDIUM
使用来自MEDIUM组的密码的密码组(例如 RC4, SEED)
+3DES
OpenSSL 对HIGH的默认排序是有问题的,因为它认为3DES比AES128更高。这是错误的,因为 3DES 提供的安全性比 AES128 低,并且它也更加慢。 +3DES把它重新排序在所有其他HIGH和 MEDIUM密码之后。
!aNULL
禁用不做认证的匿名密码组。这类密码组容易收到中间人攻击,因此不应被使用。可用的密码组细节可能会随着 OpenSSL 版本变化。可使用命令openssl ciphers - v 'HIGH:MEDIUM:+3DES:!aNULL'来查看 当前安装的OpenSSL版本的实际细节。注意这个列表是根据服务器密钥类型 在运行时过滤过的。
ssl_prefer_server_ciphers (boolean)
指定是否使用服务器的 SSL 密码首选项,而不是用客户端的。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。 默认值是 on。
老的瀚高数据库版本没有这个设置并且总是使用客户端的首选项。这个设置主要用于与那些版本的向后兼容性。使用服务器的首选项通常会更好,因为服务器更可能会被合适地配置。
ssl_ecdh_curve (string)
指定用在ECDH密钥交换中的曲线名称。它需要被所有连接的客户端支持。 它不需要与服务器椭圆曲线密钥使用的曲线相同。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。默认值是prime256v1。
OpenSSL 命名了最常见的曲线: prime256v1 (NIST P-256)、 secp384r1 (NIST P-384)、secp521r1 (NIST P-521)。 openssl ecparam -list_curves命令可以显示可用曲线的完整列表。不过并不是所有的都在TLS中可用。
ssl_min_protocol_version (enum)
设置要使用的最小SSL/TLS协议版本。当前的可用版本包括: TLSv1, TLSv1.1, TLSv1.2,TLSv1.3.旧版本的 OpenSSL 库不支持所有值;如果选择了不支持的设置将会引发错误。TLS1.0之前的协议版本,也就是SSL版本2and 3,总是禁用的。
默认值是 TLSv1, 主要用来支持 OpenSSL 库的老版本。如果所有软件组件能支持较新的协议版本,您或许可以将它设置为较高的值。
ssl_max_protocol_version (enum)
设定要使用的最大SSL/TLS协议版本。有效的版本ssl_min_protocol_version, 添加一个空字符串,允许任何协议版本。默认为允许任何版本。设置最大协议版本主要用于测试,或者某个组件在与较新的协议配合工作时出现了问题。
ssl_dh_params_file (string)
指定含有用于SSL密码的所谓临时DH家族的Diffie-Hellman参数的文件名。默认值为空,这种情况下将使用内置的默认DH参数。使用自定义的DH参数可以降低攻击者破解众所周知的内置DH参数的风险。可以用命令openssl dhparam -out dhparams.pem 2048创建自己的DH参数文件。
这个参数只能在 postgresql.conf文件中或服务器命令行上进行设置。
ssl_passphrase_command (string)
设置当需要一个密码(例如一个私钥)来解密SSL文件时会调用的一个外部命令。默认情况下,这个参数为空,表示使用内建的提示机制。
该命令必须将密码打印到标准输出并且以代码0退出。在该参数值中,%p被替换为一个提示字符串(要得到文字%,应该写成%%)。注意该提示字符串将可能含有空格,因此要确保加上适当的引号。如果输出的末尾有单一的新行,它会被剥离掉。
该命令实际上并不一定要提示用户输入一个密码。它可以从文件中读取密码、从钥匙链得到密码等等。确保选中的机制足够安全是用户的责任。
这个参数只能在 postgresql.conf文件中或服务器命令行上进行设置。
ssl_passphrase_command_supports_reload (boolean)
这个参数决定在配置重载期间如果一个密钥文件需要口令时,是否也调
用ssl_passphrase_command设置的密码命令。 如果这个参数为off(默认),那么在重载期间将忽略ssl_passphrase_command,如果在此期间需要密码则SSL配置将不会被重载。对于要求一个TTY(当服务器正在运行时可能是不可用的)来进行提示的命令,这种设置是合适的。例如,如果密码是从一个文件中得到的,将这个参数设置为on可能是合适的。
这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
资源消耗
内存
shared_buffers (integer)
设置数据库服务器将使用的共享内存缓冲区量。默认通常是 128 兆字节(128MB),但是如果你的内核设置不支持(在initdb时决定),那么可以会更少。 这个设置必须至少为 128 千字节。不过为了更好的性能,通常会使用明显高于最小值的设置。 如果指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB.(BLCKSZ 的非默认值改变最小值。)此参数只能在服务器启动时设置。
如果有一个专用的 1GB 或更多内存的数据库服务器,一个合理的shared_buffers开始值是系统内存的 25%。即使更大的shared_buffers有效,也会造成一些工作负载,但因为瀚高数据库同样依赖操作系统的高速缓冲区,将shared_buffers设置为超过40% 的RAM不太可能比一个小点值工作得更好。为了能把对写大量新的或改变的数据的处理分布在一个较长的时间段内,shared_buffers更大的设置通常要求对max_wal_size也做相应增加。
如果系统内存小于 1GB,一个较小的 RAM 百分数是合适的,这样可以为操作系统留下足够的空间。
huge_pages (enum)
控制是否为主共享内存区域请求巨型页。有效值是try(默认)、on以及off。如果huge_pages被设置为try,则服务器将尝试请求巨型页,但是如果失败会退回到默认的方式。如果为on,请求巨型页失败将使得服务器无法启动。如果为off,则不会请求巨型页。
当前,只有Linux上支持这个设置。在其他系统上这个参数被设置为try时,它会被忽略。
巨型页面的使用会导致更小的页面表以及花费在内存管理上的 CPU 时间更少,从而提高性能。
巨型页在Linux上被称为大页面。要使用大页面,需要为运行瀚高数据库的Linux用户账号分配Lock Pages in Memory的用户权限。可以使用组策略工具(gpedit.msc)来分配用户权限Lock Pages in Memory。为了在命令窗口以单进程的方式启动数据库服务器,命令窗口必须以管理员身份运行或者禁用用户访问控制(UAC)。当UAC被启用时,普通的命令窗口会在启动时收回用户权限Lock Pages in Memory。注意这种设置仅影响主共享内存区域。Linux、FreeBSD以及Illumos之类的操作系统也能为普通内存分配自动使用巨型页(也被称为”超级”页或者”大”页面),而不需要来自瀚高数据库的显式请求。在Linux上,这被称为”transparent huge pages”(THP,透明巨型页)。已知这种特性对某些Linux版本上的某些用户会导致瀚高数据库的性能退化,因此当前并不鼓励使用它(与huge_pages的显式使用不同)。
temp_buffers (integer)
为每个数据库会话设置用于临时缓冲区的最大内存.这些是仅用于访问临时表的会话本地缓冲。如果指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB。默认为8兆字节 (8MB)。(如果BLCKSZ不是8kB,则默认值按比例缩放。) 这个设置可以在独立的会话内部被改变,但是只有在会话第一次使用临时表之前才能改变;在会话中随后企图改变该值是无效的。
一个会话将按照temp_buffers给出的限制根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,其开销只是一个缓冲区描述符,或者说temp_buffers每增加一则增加大概 64 字节。不过,如果一个缓冲区被实际使用,那么它就会额外消耗 8192 字节(或者BLCKSZ字节)。
max_prepared_transactions (integer)
设置可以同时处于”prepared”状态的事务的最大数目(见PREPARE TRANSACTION)。把这个参数设置为零(这是默认设置)将禁用预备事务特性。这个参数只能在服务器启动时设置。
如果你不打算使用预备事务,可以把这个参数设置为零来防止意外创建预备事务。如果你正在使用预备事务,你将希望把max_prepared_transactions至少设置为max_connections一样大,因此每一个会话可以有一个预备事务待处理。
当运行一个后备服务器时,这个参数必须至少与主服务器上的一样大。否则,后备服务器上将不会执行查询。
work_mem (integer)
设置在写入临时磁盘文件之前查询操作(例如排序或哈希表)可使用的最大内存容量。如果指定值时没有单位,则以千字节为单位。默认值是4兆字节 (4MB)。注意对于一个复杂查询,可能会并行运行好几个排序或者哈希操作;每个操作都会被允许使用这个参数指定的内存量,然后才会开始写数据到临时文件。同样,几个正在运行的会话可能并发进行这样的操作。因此被使用的总内存可能是work_mem值的好几倍,在选择这个值时一定要记住这一点。ORDER BY、DISTINCT和归并连接都要用到排序操作。哈希连接、基于哈希的聚集以及基于哈希的IN子查询处理中都要用到哈希表。
maintenance_work_mem (integer)
指定在维护性操作(例如VACUUM、CREATE INDEX和ALTER TABLE ADD FOREIGN KEY)中使用的最大的内存量。如果指定值时没有单位,则以千字节为单位,其默认值是64 兆字节(64MB)。因为在一个数据库会话中,一个时刻只有一个这样的操作可以被执行,并且一个数据库安装通常不会有太多这样的操作并发执行,把这个数值设置得比work_mem大很多是安全的。更大的设置可以改进清理和恢复数据库转储的性能。
注意当自动清理运行时,可能会分配最多达这个内存的autovacuum_max_ workers倍,因此要小心不要把该默认值设置得太高。通过独立地设置autovacuum_work_mem可能会对控制这种情况有所帮助。
autovacuum_work_mem (integer)
指定每个自动清理工作者进程能使用的最大内存量。如果指定值时没有单位,则以千字节为单位。其默认值为 -1,表示转而使用 maintenance_work_ mem的值。当运行在其他上下文环境中时,这个设置对VACUUM的行为没有影响。
max_stack_depth (integer)
指定服务器的执行堆栈的最大安全深度。这个参数的理想设置是由内核强制的实际栈尺寸限制(ulimit -s所设置的或者本地等价物),减去大约一兆字节的安全边缘。需要这个安全边缘是因为在服务器中并非所有例程都检查栈深度,只是在关键的可能递规的例程中才进行检查。如果指定值时没有单位,则以千字节为单位。默认设置是两兆字节(2MB),这个值相对比较小并且不可能导致崩溃。但是,这个值可能太小了,以至于无法执行复杂的函数。只有管理员用户可以修改这个设置。
把max_stack_depth参数设置得高于实际的内核限制将意味着一个失控的递归函数可能会导致一个独立的后端进程崩溃。在瀚高数据库能够检测内核限制的平台上,服务器将不允许把这个参数设置为一个不安全的值。不过,并非所有平台都能提供该信息,所以我们还是建议你在选择值时要小心。
shared_memory_type (enum)
指定服务器应用于主共享内存区域的共享内存实现,包括瀚高数据库的共享缓冲区和其他共享数据。可能的值为mmap (对使用mmap 分配的匿名共享内 存),sysv (通过 shmget 分配的系统V 共享内存),和共享内存。并非在所有平台上都支持全部值;第一个被支持的选项是该平台的默认选项。sysv 选项不是任何平台的默认选项,通常不建议使用,因为它通常需要非默认的内核设置来允许大量的地址分配。
dynamic_shared_memory_type (enum)
指定服务器应该使用的动态共享内存实现。可能的值是posix(用于使用
shm_open分配的 POSIX 共享内存)、sysv (用于通过shmget分配的 System
V 共享内存)、和mmap (使用存储在数据目录中的内存映射文件模拟共享内存)。并非所有平台上都支持所有值,平台上第一个支持的选项就是其默认值。在任何平台上mmap选项都不是默认值,通常不鼓励使用它,因为操作系统会反复地把修改过的页面写回到磁盘上,从而增加了系统的I/O负载。不过当pg_dynshmem目录被存储在一个RAM 盘时或者没有其他共享内存功能可用时,它还是有用的。
磁盘
temp_file_limit (integer)
指定一个进程能用于临时文件(如排序和哈希临时文件,或者用于保持游标的存储文件)的最大磁盘空间量。一个试图超过这个限制的事务将被取消。 如果指定值时没有单位,则以千字节为单位。-1(默认值)意味着没有限制。只有管理员用户能够修改这个设置。
这个设置约束着一个给定瀚高数据库进程在任何瞬间所使用的所有临时文件的总空间。应该注意的是,与在查询执行中在幕后使用的临时文件相反,显式临时表所用的磁盘空间不被这个设置所限制。
内核资源使用
max_files_per_process (integer)
设置每个服务器子进程允许同时打开的最大文件数目。默认是 1000 个文件。如果内核强制一个安全的针对每个进程的限制,那么你不用操心这个设置。但是在 一些平台上(特别是大多数 BSD 系统),如果很多进程都尝试打开很多文件,内核将允许独立进程打开比个系统真正可以支持的数目大得多得文件数。如果你发现自己看到了”Too many open files”这样的失败,可尝试减小这个设置。这个参数只能在服务器启动时设置。
基于代价的清理延迟
在VACUUM和ANALYZE命令的执行过程中,系统维持着一个内部计数器来跟踪各种被执行的I/O操作的估算开销。当累计的代价达到一个限制(由vacuum_cost_limit指定),执行这些操作的进程将按照vacuum_cost_delay所指定的休眠一小段时间。然后它将重置计数器并继续执行。
这个特性的出发点是允许管理员降低这些命令对并发的数据库活动产生的I/O影响。在很多情况下,VACUUM和ANALYZE等维护命令能否快速完成并不重要,而非常重要的是这些命令不会对系统执行其他数据库操作的能力产生显著的影响。基于代价的清理延迟提供了一种方式让管理员能够保证这一点。
对于手动发出的VACUUM命令,该特性默认被禁用。要启用它,只要把vacuum_cost_delay变量设为一个非零值。
vacuum_cost_delay (floating point)
当超出开销限制时进程将要休眠的时间量。如果指定值时没有单位,则以毫秒为单位。其默认值为0,这将禁用基于代价的清理延迟特性。正值将启用基于代价的清理。
在使用基于代价的清理时,vacuum_cost_delay的合适值通常很小,也许是小于1毫秒。虽然vacuum_cost_delay可以被设置为毫秒级别的值,但是在较老的平台上可能无法准确地测量这种延迟。在这样的平台上,增加 VACUUM的节流资源消耗在1ms以上,需要改变其他的清理开销参数。尽管如此,你应该保持 vacuum_cost_delay 在平台能持续测量的情况下尽可能小;大延迟没有帮助。
vacuum_cost_page_hit (integer)
清理一个在共享缓存中找到的缓冲区的估计代价。它表示锁住缓冲池、查找共享哈希表和扫描页内容的代价。默认值为1。
vacuum_cost_page_miss (integer)
清理一个必须从磁盘上读取的缓冲区的代价。它表示锁住缓冲池、查找共享哈希表、从磁盘读取需要的块以及扫描其内容的代价。默认值为10。
vacuum_cost_page_dirty (integer)
当清理修改一个之前干净的块时需要花费的估计代价。它表示再次把脏块刷出到磁盘所需要的额外I/O。默认值为20。
vacuum_cost_limit (integer)
将导致清理进程休眠的累计代价。默认值为200。
| 注意: |
|---|
| 有些操作会保持关键性的锁,这样可以尽快完成。基于代价的清理延迟在这类操作期间不会发生。因此有可能代价会累计至大大超过指定的限制。为了防止在这种情况下的无意义的长时间延迟,实际延迟的计算方式是vacuum_cost_delay * accumulated_balance / vacuum_cost_limit,且最大值是vacuum_cost_delay * 4。 |
后台写入器
有一个独立的服务器进程,叫做后台写入器,它的功能就是发出写”脏”(新的或修改过的)共享缓冲区的命令。它写出共享缓冲区,这样让处理用户查询的服务器进程很少或者永不等待写动作的发生。不过,后台写入器确实会增加 I/O 的总负荷,因为虽然在每个检查点间隔中一个重复弄脏的页面可能只会写出一次,但在同一个间隔中后台写入器可能会把它写出好几次。在这一小节讨论的参数可以被用于调节本地需求的行为。
bgwriter_delay (integer)
指定后台写入器活动轮次之间的延迟。在每个轮次中,写入器都会为一定数量的脏缓冲区发出写操作(可以用下面的参数控制)。然后它就休眠 bgwriter_delay的时长,然后重复动作。当缓冲池中没有脏缓冲区时,不管 bgwriter_delay,它都会进入更长的休眠。如果指定值时没有单位,则以毫秒为单位。默认值是 200 毫秒(200ms)。 注意在许多系统上,休眠延迟的有效解析度是 10 毫秒;因此,为bgwriter_delay设置一个不是 10 的倍数的值与把它设置为下一个更高的 10 的倍数是一样的效果。这个选项只能在服务器命令行上或者在postgresql.conf文件中设置。
bgwriter_lru_maxpages (integer)
在每个轮次中,不超过这么多个缓冲区将被后台写入器写出。把这个参数设置为零可禁用后台写出(注意被一个独立、专用辅助进程管理的检查点不受影响)。默认值是 100个缓冲区。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
bgwriter_lru_multiplier (floating point)
每一轮次要写的脏缓冲区的数目基于最近几个轮次中服务器进程需要的新缓冲区的数目。最近所需的平均值乘以bgwriter_lru_multiplier可以估算下一轮次中将会需要的缓冲区数目。脏缓冲区将被写出直到有很多干净可重用的缓冲区(然而,每一轮次中写出的缓冲区数不超过bgwriter_lru_maxpages)。 因此,设置为 1.0 表示一种”刚刚好的”策略,这种策略会写出正好符合预测值的数目的缓冲区。更大大的值可以为需求高峰提供某种缓冲,而更小的值则需要服务进程来处理一些写出操作。默认值是 2.0。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
bgwriter_flush_after (integer)
只要后台写入的数据超过这个数量,尝试强制 OS 把这些写发送到底层存储上。这样做将限制内核页缓存中脏数据的量,降低了在检查点末尾发出一个 fsync 时或者 OS 在后台大批量写回数据时卡住的可能性。那常常会导致大幅度压缩的事务延迟,但是也有一些情况(特别是负载超过shared_buffers但小于 OS 页面高速缓存)的性能会降低。这种设置可能会在某些平台上没有效果。 如果指定值时没有单位,则以块为单位,即为BLCKSZ 字节,通常为8kB.合法的范围在0(禁用受控写回)和2MB之间。Linux 上的默认值是162kB,其他平台上是0(如果BLCKSZ不是8kB,则默认值和最大值会按比例缩放至这个值)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
较小的bgwriter_lru_maxpages和bgwriter_lru_multiplier可以降低由后台写入器造成的额外 I/O 开销。但更可能的是,服务器进程将必须自己发出写入操作,这会延迟交互式查询。
异步行为
effective_io_concurrency (integer)
设置瀚高数据库可以同时被执行的并发磁盘 I/O 操作的数量。调高这个值,可以增加任何单个瀚高数据库会话试图并行发起的 I/O 操作的数目。允许的范围是 1 到 1000,或 0 表示禁用异步 I/O 请求。当前这个设置仅影响位图堆扫描。
对于磁盘驱动器,这个设置的一个很好的出发点是组成一个被用于该数据库的 RAID 0 条带或 RAID 1 镜像的独立驱动器数量(对 RAID 5 而言,校验驱动器不计入)。但是,如果数据库经常忙于在并发会话中发出的多个查询,较低的值可能足以使磁盘阵列繁忙。比保持磁盘繁忙所需的值更高的值只会造成额外的 CPU 开销。SSD 以及其他基于内存的存储常常能处理很多并发请求,因此它们的最佳值可能是数百。
异步 I/O 依赖于一个有效的posix_fadvise函数(一些操作系统可能没有)。如果不存在这个函数,将这个参数设置为除 0 之外的任何东西将导致错误。在一些操作系统上(如Solaris)虽然提供了这个函数,但它不会做任何事情。
在支持的系统上默认值为 1,否则为 0。对于一个特定表空间中的表,可以通过设定该表空间的同名参数(见ALTER TABLESPACE)可以覆盖这个值。
max_worker_processes (integer)
设置系统能够支持的后台进程的最大数量。这个参数只能在服务器启动时设置。默认值为 8。
在运行一个后备服务器时,你必须把这个参数设置为等于或者高于主控服务器上的值。否则, 后备服务器上可能不会允许查询。在更改这个值时,考虑也对max_parallel_workers、max_parallel_maintenance_workers以及max_parallel_workers_per_gather进行调整。
max_parallel_workers_per_gather (integer)
设置单个Gather或者Gather Merge节点能够开始的工作者的最大数量。并行工作者会从max_worker_processes建立的进程池中取得,数量由max_parallel_workers限制。注意所要求的工作者数量在运行时可能实际无法被满足。如果这种事情发生,该计划将会以比预期更少的工作者运行,这可能会不太高效。默认值是2。把这个值设置为 0(默认值)将会禁用并行查询执行。
注意并行查询可能消耗比非并行查询更多的资源,因为每一个工作者进程时一个完全独立的进程,它对系统产生的影响大致和一个额外的用户会话相同。在为这个设置选择值时,以及配置其他控制资源利用的设置(例如work_ mem)时,应该把这个因素考虑在内。work_mem之类的资源限制会被独立地应用于每一个工作者,这意味着所有进程的总资源利用可能会比单个进程时高得多。例如,一个使用 4 个工作者的并行查询使用的CPU 时间、内存、I/O 带宽可能是不使用工作者时的 5 倍之多。
max_parallel_maintenance_workers (integer)
设置单一工具性命令能够启动的并行工作者的最大数目。当前,唯一一种支持使用并行工作者的工具性命令是CREATE INDEX,并且只有在构建B-树索引时才能并行。并行工作者从由max_worker_processes创建的进程池中取出,数量由max_parallel_workers控制。注意实际在运行时所请求数量的工作者可能不可用。如果发生这种情况,工具性操作将使用比预期数量少的工作者运行。默认值为2。将这个值设置为0可以禁用工具性命令对并行工作者的使用。
注意并行工具性命令不应该消耗比同等数量非并行操作更多的内存。这种策略与并行查询不同,并行查询的资源限制通常是应用在每个工作者进程上。并行工具性命令把资源限制maintenance_work_mem当作对整个工具性命令的限制,而不管其中用到了多少个并行工作者进程。不过,并行工具性命令实际上可能仍会消耗更多的CPU资源和I/O带宽。
max_parallel_workers (integer)
设置系统为并行操作所支持的工作者的最大数量。默认值为8。在增加或者减小这个值时,也要考虑对max_parallel_maintenance_workers以及max_parallel_workers_per_gather进行调整。此外,要注意将这个值设置得大于max_worker_processes将不会产生效果,因为并行工作者进程都是从max_worker_processes所建立的工作者进程池中取出来的。
backend_flush_after (integer)
只要一个后端写入的数据量超过这个数量时,就会尝试强制 OS 把这些写发送到底层存储。这样做将会限制内核页高速缓存中的脏数据数量,降低在检查点末尾发出fsync时或者 OS 在后台大批写回数据时卡住的可能性。这常常会导致极大降低的事务延迟,但是也有一些情况中(特别是负载超过shared_ buffers但低于 OS 的页面高速缓存时),性能可能会下降。这个设置可能在某些平台上没有效果。如果指定值时没有单位,则以块为单位,即为 BLCKSZ 字节,通常为8kB。合法的范围位于0(禁用受控写回)和2MB之间。默认是0(即没有强制写回)。(如果BLCKSZ不是8kB,最大值会按比例缩放到它)。
old_snapshot_threshold (integer)
设置可以使用查询快照的最小时间量,以规避使用快照时出现”snapshot too old” 错误的风险。超过此阈值时间的数据将可以被清除。这可以有助于阻止长时间使用的快照造成的快照膨胀。为了阻止由于本来对该快照可见的数据被清理导致的不正确结果,当快照比这个阈值更旧并且该快照被用来读取一个该快照建立以来被修改过的页面时,将会产生一个错误。
如果指定值时没有单位,则以分钟为单位。值 -1 (默认值) 禁用此功能,实际上将快照的时限设置为无穷大。这个参数只能在服务器启动时设置。
对于生产工作有用的值的范围可能从几个小时到几天不等。只允许小的值(例如0或者1min)是因为它们有时可能对测试有用。虽然允许高达60d的设置,但是请注意很多负载情况下,很短的时间帧里就可能发生极大的膨胀或者事务 ID 回卷。
当这个特性被启用时,关系末尾的被清出的空间不能被释放给操作系统,因为那可能会移除用于检测”snapshot too old”情况所需的信息。所有分配给关系的空间还将与该关系关联在一起便于重用,除非它们被显式地释放(例如,用VACUUM FULL)。
这个设置不会尝试保证在任何特殊情况下都会生成错误。事实上,如果(例如)可以从一个已经物化了一个结果集的游标中生成正确的结果,即便被引用表中的底层行已经被清理掉也不会生成错误。某些表不能被过早地安全清除,并且因此将不受这个设置的影响,例如系统目录。对于这些表,这个设置将不能降低膨胀,也不能降低在扫描时产生”snapshot too old”错误的可能性。
预写式日志
设置
wal_level (enum)
wal_level决定多少信息写入到 WAL 中。默认值是replica,它会写入足够的数据以支持WAL归档和复制,包括在后备服务器上运行只读查询。minimal会去掉除从崩溃或者立即关机中进行恢复所需的信息之外的所有记录。最后,logical会增加支持逻辑解码所需的信息。每个层次包括所有更低层次记录的信息。这个参数只能在服务器启动时设置。
在minimal级别中,某些批量操作的 WAL 日志可以被安全地跳过,这可以使那些操作更快。这种优化可以应用的操作包括:
CREATE TABLE AS
CREATE INDEX
CLUSTER
COPY到在同一个事务中被创建或截断的表中 。
但最少的 WAL 不会包括足够的信息来从基础备份和 WAL 日志中重建数据,因此,要启用 WAL 归档(archive_mode)和流复制,必须使用replica或更高级别。
在logical层,与replica相同的信息会被记录,外加上 允许从WAL抽取逻辑修改集所需的信息。使用级别 logical将增加 WAL 容量,特别是如果为了REPLICA IDENTITY FULL配置了很多表并且执行了很多UPDATE和DELETE 语句时。
在之前的版本中,这个参数也允许值archive和hot_standby。现在仍然接受这些值,但是它们会被映射到replica。
fsync (boolean)
如果打开这个参数,瀚高数据库服务器将尝试确保更新被物理地写入到磁盘,做法是发出fsync()系统调用或者使用多种等价的方法(见wal_sync_ method)。这保证了数据库集簇在一次操作系统或者硬件崩溃后能恢复到一个一致的状态。
虽然关闭fsync常常可以得到性能上的收益,但当发生断电或系统崩溃时可能造成不可恢复的数据损坏。因此,只有在能很容易地从外部数据中重建整个数据库时才建议关闭fsync。
能安全关闭fsync的环境的例子包括从一个备份文件中初始加载一个新数据库集簇、使用一个数据库集簇来在数据库被删掉并重建之后处理一批数据,或者一个被经常重建并却不用于失效备援的只读数据库克隆。单独的高质量硬件不足以成为关闭fsync的理由。
当把fsync从关闭改成打开时,为了可靠的恢复,需要强制在内核中的所有被修改的缓冲区进入持久化存储。这可以在多个时机来完成:在集簇被关闭时或在 fsync 因为运行initdb --sync-only而打开时、运行sync时、卸载文件系统时或者重启服务器时。
在很多情况下,为不重要的事务关闭synchronous_commit可以提供很多关闭fsync的潜在性能收益,并不会有的同时,关闭fsync可以提供很多潜在的性能优势,而不会有伴随着的数据损坏风险。
fsync只能在postgresql.conf文件中或在服务器命令行上设置。如果你关闭这个参数,请也考虑关闭full_page_writes。
synchronous_commit (enum)
指定在命令返回”success”指示给客户端之前,一个事务是否需要等待 WAL 记录被写入磁盘。合法的值是on、remote_apply、remote_write、local和off。默认的并且安全的设置是on。当设置为off时,在向客户端报告成功和真正保证事务不会被服务器崩溃威胁之间会有延迟(最大的延迟是wal_writer_delay的三倍)。不同于fsync,将这个参数设置为off不会产生数据库不一致性的风险:一个操作系统或数据库崩溃可能会造成一些最近据说已提交的事务丢失,但数据库状态是一致的,就像这些事务已经被干净地中止。因此,当性能比完全确保事务的持久性更重要时,关闭synchronous_commit可以作为一个有效的代替手段。
如果synchronous_standby_names为非空,这个参数也控制事务提交是否将等待它们的WAL 记录被复制到后备服务器上。当这个参数被设置为on时,直到来自于当前同步的后备服务器的回复指示它们已经收到了事务的提交记录并将其刷入了磁盘,主服务器上的事务才会提交。这保证事务将不会被丢失,除非主服务器和所有同步后备都遭受到了数据库存储损坏的问题。当被设置为remote_apply时,提交将会等待,直到来自当前的同步后备的回复指示它们已经收到了该事务的提交记录并且已经应用了该事务,这样该事务才变得对后备上的查询可见。当这个参数被设置为remote_write时,提交将等待,直到来自当前的同步后备的回复指示它们已经收到了该事务的提交记录并且已经把该记录写出到它们的操作系统,这种设置足以保证数据在后备服务器的瀚高数据库实例崩溃时得以保存,但是不能保证后备服务器遭受操作系统级别崩溃时数据能被保持,因为数据不一定必须要在后备机上达到稳定存储。最后,设置local会导致提交等待本地刷写到磁盘而不是复制完成。在使用同步复制时这通常不是我们想要的效果,但是为了完整性,还是提供了这样一个选项。
如果synchronous_standby_names为空,设置on、remote_apply、remote_write和local都提供了同样的同步级别:事务提交只等待本地刷写磁盘。
这个参数可以随时被修改;任何一个事务的行为由其提交时生效的设置决定。因此,可以同步提交一些事务,同时异步提交其他事务。例如,当默认是相反时,实现一个单一多语句事务的异步提交,在事务中发出SET LOCAL synchronous_commit TO OFF。
wal_sync_method (enum)
用来向强制 WAL 更新到磁盘的方法。如果fsync是关闭的,那么这个设置就不相关,因为 WAL 文件更新将根本不会被强制。可能的值是:
• open_datasync(用open()选项O_DSYNC写 WAL 文件)
• fdatasync(在每次提交时调用fdatasync())
• fsync(在每次提交时调用fsync())
• fsync_writethrough(在每次提交时调用fsync(),强制任何磁盘写高速缓存的直通写)
• open_sync(用open()选项O_SYNC写 WAL 文件)
open_* 选项也可以使用O_DIRECT(如果可用)。不是在所有平台上都能使用所有这些选择。默认值是列表中第一个被平台支持的那个, 不过fdatasync是 Linux 中的默认值。默认值不一定是最理想的;有可能需要修改这个设置或系统配置的其他方面来创建一个崩溃-安全的配置,或达到最佳性能。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
full_page_writes (boolean)
当这个参数为打开时,瀚高数据库服务器在一个检查点之后的页面的第一次修改期间将每个页面的全部内容写到 WAL 中。这么做是因为在操作系统崩溃期间正在处理的一次页写入可能只有部分完成,从而导致在一个磁盘页面中混合有新旧数据。在崩溃后的恢复期间,通常存储在 WAL 中的行级改变数据不足以完全恢复这样一个页面。存储完整的页面映像可以保证页面被正确存储,但代价是增加了必须被写入 WAL 的数据量(因为WAL 重放总是从一个检查点开始,所以在检查点后每个页面的第一次改变时这样做就够了。因此,一种减小全页面写开销的方法是增加检查点间隔参数值)。把这个参数关闭会加快正常操作,但是在系统失败后可能导致不可恢复的数据损坏,或者静默的数据损坏。其风险类似于关闭fsync,但是风险较小。并且只有在可关闭fsync的情况下才应该关闭它。关闭这个选项并不影响用于时间点恢复(PITR)的 WAL 归档使用。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是on。
wal_log_hints (boolean)
当这个参数为on时,瀚高数据库服务器一个检查点之后页面被第一次修改期间把该磁盘页面的整个内容都写入 WAL,即使对所谓的提示位做非关键修改也会这样做。
如果启用了数据校验和,提示位更新总是会被 WAL 记录并且这个设置会被忽略。你可以使用这个设置测试如果你的数据库启用了数据校验和,会有多少额外的 WAL 记录发生。
这个参数只能在服务器启动时设置。默认值是off。
wal_compression (boolean)
当这个参数为on时,如果full_page_writes 为打开或者处于基础备份期间,瀚高数据库服务器会压缩写入到 WAL 中的完整页面镜像。压缩页面镜像将在 WAL 重放时被解压。默认值为off。只有管理员用户可以更改这个设置。
打开这个参数可以减小 WAL 所占的空间且无需承受不可恢复的数据损坏风险,但是代价是需要额外的 CPU 开销以便在 WAL 记录期间进行压缩以及在 WAL 重放时解压。
wal_buffers (integer)
用于还未写入磁盘的 WAL 数据的共享内存量。默认值 -1 选择等于shared_buffers的1/32 的尺寸(大约3%),但是不小于64kB也不大于 WAL 段的尺寸(通常为)。如果自动的选择太大或太小可以手工设置该值,但是任何小于32kB的正值都将被当作32kB。如果指定值时没有单位,则以WAL块作为单位,即为 XLOG_BLCKSZ 字节,通常为8kB。这个参数只能在服务器启动时设置。
在每次事务提交时,WAL 缓冲区的内容被写出到磁盘,因此极大的值不可能提供显著的收益。不过,把这个值设置为几个兆字节可以在一个繁忙的服务器(其中很多客户端会在同一时间提交)上提高写性能。由默认设置-1选择的自动调节将在大部分情况下得到合理的结果。
wal_writer_delay (integer)
指定 WAL 写入器刷写 WAL 的频繁程度,以时间为单位。在刷写WAL之后,写入器将根据wal_writer_delay所给出的时间长度进行睡眠,除非被一个异步提交的事务提前唤醒。如果最近的刷写发生在 wal_writer_delay 之前,并且小于wal_writer_flush_after WAL的值产生之后,那么WAL只会被写入操作系统,而不会被刷写到磁盘。如果指定值时没有单位,则以毫秒作为单位。默认值是 200 毫秒(200ms)。注意在很多系统上,有效的睡眠延迟粒度是 10 毫秒,把wal_writer_delay设置为一个不是 10 的倍数的值,其效果和把它设置为大于该值的下一个 10 的倍数产生的效果相同。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
wal_writer_flush_after (integer)
指定 WAL 写入器刷写 WAL 的频繁程度,以卷为单位。 如果最近的刷写发生在 wal_writer_delay 之前,并且小于 wal_writer_flush_after WAL的值产生之后,那么WAL只会被写入操作系统,而不会被刷写到磁盘。如果wal_ writer_flush_after被设置为0,则WAL数据总是会被立即刷写。如果指定值时没有单位,则以WAL块作为单位,即为XLOG_BLCKSZ字节,通常为8kB。默认是1MB。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
commit_delay (integer)
在一次 WAL 刷写被发起之前,commit_delay增加一个时间延迟。 如果系统负载足够高,使得在一个给定间隔内有额外的事务准备好提交,那么通过允许更多事务通过一个单次WAL 刷写来提交能够提高组提交的吞吐量。但是,它也把每次 WAL 刷写的潜伏期增加到了最多commit_delay。因为如果没有其他事务准备好提交,就会浪费一次延迟,只有在当一次刷写将要被发起时有至少commit_siblings个其他活动事务时,才会执行一次延迟。另外,如果fsync被禁用,则将不会执行任何延迟。如果指定值时没有单位,则以微秒作为单位。默认的commit_delay是零(无延迟)。只有管理员用户才能修改这个设置。
在瀚高数据库之前的版本,commit_delay的行为不同并且效果不明显:它只影响提交,而不是所有 WAL 刷写,并且即使在 WAL 刷写马上就要完成时也会等待一整个配置的延迟。
commit_siblings (integer)
在执行commit_delay延迟时,要求的并发活动事务的最小数目。大一些的值会导致在延迟间隔期间更可能有至少另外一个事务准备好提交。默认值是五个事务。
检查
checkpoint_timeout (integer)
自动 WAL 检查点之间的最长时间。如果指定值时没有单位,则以秒为单位。合理的范围在 30 秒到 1 天之间。默认是 5 分钟(5min)。增加这个参数的值会增加崩溃恢复所需的时间。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
checkpoint_completion_target (floating point)
指定检查点完成的目标,作为检查点之间总时间的一部分。默认是 0.5。 这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
checkpoint_flush_after (integer)
当执行检查点时写入的数据量超过此数量时,就尝试强制 OS 把这些写发送到底层存储。这样做将会限制内核页面高速缓存中的脏数据数量,降低在检查点末尾发出fsync或者 OS 在后台大批量写回数据时被卡住的可能性。那常常会导致大幅度压缩的事务延迟,但是也有一些情况(特别是负载超过shared_buffers但小于 OS 页面高速缓存)的性能会降低。这种设置可能会在某些平台上没有效果。如果指定值时没有单位,则以块为单位,即为BLCKSZ 字节,通常为8kB。 合法的范围在0(禁用强制写回)和2MB之间。Linux 上的默认值是256kB,其他平台上是0(如果BLCKSZ不是8kB,则默认值和最大值会按比例缩放到它)。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
checkpoint_warning (integer)
如果由于填充WAL段文件导致的检查点之间的间隔低于这个参数表示的时间量,那么就向服务器日志写一个消息(它建议增加max_wal_size的值)。 如果指定值时没有单位,则以秒为单位。默认值是 30 秒(30s)。零则关闭警告。如果checkpoint_timeout低于checkpoint_warning,则不会有警告产生。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
max_wal_size (integer)
在自动 WAL 检查点之间允许 WAL 增长到的最大尺寸。这是一个软限制, 在特殊的情况下 WAL 尺寸可能会超过max_wal_size,例如在重度负荷下、archive_command失败或者高的 wal_keep_segments设置。如果指定值时没有单位,则以兆字节为单位。默认为 1 GB。增加这个参数可能导致崩溃恢复所需的时间。这个参数只能在postgresql.conf 或者服务器命令行中设置。
min_wal_size (integer)
只要 WAL 磁盘用量保持在这个设置之下,在检查点时旧的 WAL 文件总是 被回收以便未来使用,而不是直接被删除。这可以被用来确保有足够的WAL 空间被保留来应付 WAL 使用的高峰,例如运行大型的批处理任务。如果指定值时没有单位,则以兆字节为单位。默认是 80 MB。这个参数只能在postgresql.conf 或者服务器命令行中设置。
归档
archive_mode (enum)
当启用archive_mode时,可以通过设置 archive_command命令将完成的 WAL 段发送到归档存储。除用于禁用的off之外,还有两种模式:on和always。在普通操作期间,这两种模式之间没有区别,但是当设置为always时,WAL 归档器在归档恢复或者后备模式下也会被启用。在always模式下,所有从归档恢复 的或者用流复制传来的文件将被(再次)归档。
archive_mode和archive_command是独立的变量,这样可以在不影响归档模式的前提下修改archive_command。这个参数只能在服务器启动时设置。当wal_level被设置为minimal时,archive_mode不能被启用。
archive_command (string)
本地 shell 命令被执行来归档一个完成的 WAL 文件段。字符串中的任何%p被替换成要被归档的文件的路径名,而%f只被文件名替换(路径名是相对于服务器的工作目录,即集簇的数据目录)。如果要在命令里嵌入一个真正的%字符,可以使用%%。有一点很重要,该命令只在成功时返回一个零作为退出状态。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。除非服务器启动时启用了archive_mode,否则它会被忽略。如果archive_mode被启用时,archive_command是一个空字符串(默认),WAL 归档会被临时禁用,但服务器仍会继续累计 WAL 段文件,期待着一个命令被提供。将archive_
command设置为一个只返回真但不做任何事的命令 (例如/bin/true)实际上会禁用归档,也会打破归档恢复所需的WAL 文件链,因此只有在极少数情况下才能用。
archive_timeout (integer)
archive_command仅在已完成的 WAL 段上调用。因此,如果你的服务器只产生很少的WAL 流量(或产生流量的周期很长),那么在事务完成和它被安全地记录到归档存储之间将有一个很长的延迟。为了限制未归档数据存在的时间,你可以设置archive_timeout来强制服务器来周期性地切换到一个新的 WAL 段文件。当这个参数被设置为大于零时,只要从上次段文件切换后过了参数所设置的时间量,并且已经有过任何数据库活动(包括一个单一检查点),服务器将切换到一个新的段文件(如果没有数据库活动则会跳过检查点)。注意,由于强制切换而提早关闭的被归档文件仍然与完整的归档文件长度相同。因此,使用非常短的archive_timeout是不明智的 — 它将占用巨大的归档存储。一分钟左右的archive_timeout设置通常比较合理。如果你希望数据能被更快地从主服务器上复制下来,你应该考虑使用流复制而不是归档。如果指定值时没有单位,则以秒为单位。这个参数只能在postgresql.conf文件中或 在服务器命令行上设置。
归档恢复
本节描述了仅在恢复期间适用的设置。如果您希望执行任何后续恢复,则必须重置它们。
“Recovery” 涵盖使用服务器作为备用服务器或用于执行目标恢复。通常情况,备用模式用于提供高可用性和/或读可扩展性,而目标恢复用于从数据丢失中恢复。
若要在备用模式下启动服务器,在数据目录中建立名为standby.signal的文件。服务器将会进入恢复状态并且在到达归档WAL末尾时不会停止恢复,但将保持尝试继续恢复,通过连接到primary_conninfo设置指定的发送服务器和/或用restore_command获取新的WAL分段。
要启动服务器为目标恢复模式,需在数据目录中建立名为recovery.signal的文件。如果同时创建了standby.signal 和 recovery.signal 文件,则优先使用备用模式。目标恢复模式在归档的WAL全部回放或到达recovery_target时结束。
restore_command (string)
用于获取 WAL 文件系列的一个已归档段的本地 shell 命令。这个参数是归档恢复所必需的,但是对于流复制是可选的。在该字符串中的任何%f会被替换为从归档中获得的文件的名字,并且任何%p会被在服务器上的复制目标路径名替换(该路径名是相对于当前工作目录的,即集簇的数据目录)。任何%r会被包含上一个可用重启点的文件的名字所替换。在那些必须被保留用于使得一次恢复变成可重启的文件中,这个文件是其中最早的一个,因此这个信息可以被用来把归档截断为支持从当前恢复重启所需的最小值。%r通常只被温备配置所使用。要嵌入一个真正的%字符,需要写成%%。
很重要的一点是,该命令只有在成功时才返回一个为零的退出状态。该命令将会被询问不存在于归档中的文件名,当这样被询问时它必须返回非零。例子:
restore_command = 'cp /mnt/server/archivedir/%f "%p"'
一个例外是如果该命令被一个信号(不是SIGTERM,它是数据库服务器关闭的一部分)或者一个 shell 错误(例如命令未找到)终止,则恢复将会中止并且服务器将不会启动。
这个参数只能在服务器启动时被设置。
archive_cleanup_command (string)
这个可选参数指定了一个 shell 命令,它将在每一个重启点被执行。
archive_cleanup_command的目的是提供一种清除不再被后备服务器需要的旧的已归档WAL 文件的机制。任何%r会被替换为包含最后一个可用重启点的文件的名称。那是使一次恢复变成可重启的所必须被保留的最早的文件,并且因此比%r更早的所有文件可以被安全地移除。这个信息可以被用来把归档截断为支持从当前恢复重启所需的最小值。对于单一后备配置,pg_archivecleanup模块常常被用在archive_cleanup_command中,例如:
archive_cleanup_command = 'pg_archivecleanup /mnt/server/archivedir %r'
但是注意,如果多个后备服务器正在从同一个归档目录中恢复,你将需要保证只有当任意服务器都不再需要 WAL 文件时才会删除它们。 archive_cleanup_ command通常被用于一种温后备配置中。要在该命令中嵌入一个真正的%字符,需要写成%%。
如果该命令返回一个非零退出状态,则将会写出一个警告日志消息。一个例外是如果该命令被一个信号或者一个 shell 错误(例如命令未找到)终止,则会抛出一个致命错误。
这个参数只能在 postgresql.conf 文件中设置或通过服务器命令行的方式。
recovery_end_command (string)
这个参数指定了一个将只在恢复末尾被执行一次的 shell 命令。这个参数
是可选的。recovery_end_command的目的是为复制或恢复之后的清除提供一种机制。与archive_cleanup_command中相似,任何%r会被替换为包含最后一个可用重启点的文件的名称。
如果该命令返回一个非零退出状态,则一个警告日志消息将被写出并且不管怎样该数据库将继续启动。一个例外是如果该命令被一个信号或者 shell 错误(例如命令未找到)中止,该数据库将不会继续启动。
这个参数只能在 postgresql.conf 文件中设置或通过服务器命令行的方式。
恢复目标
默认情况下,恢复将会一直恢复到 WAL 日志的末尾。下面的参数可以被用来指定一个更早的停止点。
在recovery_target、recovery_target_lsn、recovery_ target_name、recovery_ target_time和recovery_target_xid中,最多只能使用一个,如果在配置文件中使用了多个,将会产生一个错误。这个参数只能在服务器启动时设置。
recovery_target = 'immediate'
这个参数指定恢复应该在达到一个一致状态后尽快结束,即尽早结束。在从一个在线备份中恢复时,这意味着备份结束的那个点。
在技术上,这是一个字符串参数,但是'immediate'是目前唯一允许的值。
recovery_target_name (string)
这个参数指定(pg_create_restore_point()所创建)的已命名的恢复点,恢复将进入该恢复点。
recovery_target_time (timestamp)
此参数指定恢复将执行的时间戳。精确的停止点还受到recovery_target_ inclusive得影响。
recovery_target_xid (string)
这个参数指定恢复将进入的事务 ID。记住虽然事务 ID 是在事务开始时顺序分配的,但是事务可能以不同的数字顺序完成。那些在指定事务之前(也可以包括该事务)提交的事务将被恢复。精确的停止点也受到recovery_target_ inclusive的影响。
recovery_target_lsn (pg_lsn)
此参数指定恢复将继续进行的预写日志位置的LSN。精确的停靠点也受
recovery_target_inclusive的影响。使用系统数据类型pg_lsn解析此参数。
下列选项进一步指定恢复目标,并且影响到达目标时会发生什么:
recovery_target_inclusive (boolean)
指定我们是否仅在指定的恢复目标之后停止(on),或者仅在恢复目标之前停止 (off)。适用于recovery_target_lsn、recovery_target_time或者recovery_target_xid被指定的情况。这个设置分别控制事务是否有准确的目标WAL位置(LSN)、提交时间或事务ID将被包括在该恢复中。默认值为on。
recovery_target_timeline (string)
指定恢复到一个特定的时间线中。该值可以是数字时间线 ID 或特殊值。 值current沿着与执行基本备份时相同的时间线恢复。值latest将恢复到归档中能找到的最新的时间线,这在一个备用服务器中有用。latest是默认的。
你通常只需要在复杂的重恢复情况下设置这个参数,在这种情况下你需要返回到一个状态,该状态本身是在一次时间点恢复之后到达的。
recovery_target_action (enum)
指定在达到恢复目标时服务器应该立刻采取的动作。默认动作是pause,这表示恢复将会被暂停。promote表示恢复处理将会结束并且服务器将开始接受连接。最后,shutdown将在达到恢复目标之后停止服务器。
使用pause设置的目的是:如果这个恢复目标就是恢复最想要的位置,就允许对数据库执行查询。暂停的状态可以使用pg_wal_replay_resume()继续,这会让恢复终结。如果这个恢复目标不是想要的停止点,那么关闭服务器,将恢复目标设置改为一个稍后的目标并且重启以继续恢复。
要让实例在想要的重放点那里准备好,shutdown设置可以派上用场。该实例将仍能重放更多 WAL 记录(并且事实上将不得不重放从下一次它被启动后最后一个检查点以来的WAL 记录)。
注意由于在recovery_target_action被设置为shutdown时,recovery.signal将不会被移除,任何后续的启动都将会以立刻关闭为终结,除非该配置被改变或
者recovery.signal文件被手工移除。
如果没有设置恢复目标,这个设置没有效果。如果没有启用hot_standby,pause设置的动作将和shutdown一样。
复制
这些设置控制内建流复制特性的行为。服务器将可以是主控服务器或后备服务器。主控机能发送数据,而后备机总是被复制数据的接收者。当使用级联复制时,后备服务器也可以是发送者,同时也是接收者。这些参数主要用于发送服务器和后备服务器,尽管某些只在主服务器上有意义。如果有必要,设置可以在集群中变化而不出问题。
发送服务器
这些参数可以在任何发送复制数据给一个或多个后备服务器的服务器上设置。主控机总是一个发送服务器,因此这些参数总是要在主控机上设置。这些参数的角色和含义不会在一个后备机变成主控机后改变。
max_wal_senders (integer)
指定来自后备服务器或流式基础备份客户端的并发连接的最大数量(即同时运行 WAL 发送进程的最大数)。默认值是10。值0意味着禁用复制。 突然的流客户端断开连接可能留下一个孤立连接槽(知道达到超时),因此这个参数应该设置得略高于最大客户端连接数,这样断开连接的客户端可以立刻重新连接。这个参数只能在服务器启动时被设置。此外,wal_level必须设置为replica或更高级别以允许来自后备服务器的连接。
当运行备用服务器时,你必须将此参数设置为与主服务器上相同的或更高的值。否则,备用服务器中将不允许查询。
max_replication_slots (integer)
指定服务器可以支持的复制槽最大数量。默认值为10。这个参数只能在服务器启动时设置。将它设置为一个比当前已有复制槽要少的值会阻碍服务器启动。此外,要允许使用复制槽,wal_level必须被设置为replica或更高。
wal_keep_segments (integer)
指定在后备服务器需要为流复制获取日志段文件的情况下,pg_wal目录下所能保留的过 去日志文件段的最小数目。每个段通常是16兆字节。如果一个连接到发送服务器的后备服务器落后了超过wal_keep_segments个段,发送服务器可以移除一个后备机仍然需要的 WAL 段,在这种情况下复制连接将被中断。最终结果是下行连接也将最终失败(不过,如果在使用 WAL 归档,后备服务器可以通过从归档获取段来恢复)。
只设置pg_wal中保留的文件段的最小数目;系统可能需要为WAL归档或从一个检查点恢复保留更多段。如果wal_keep_segments为零(默认值),更多的空间来存放WAL归档或从一个检查点恢复。如果wal_keep_segments是零(缺省),系统不会为后备目的保留任何多余的段,因此后备服务器可用的旧 WAL 段的数量是一个上个检查点位置和 WAL归档状态的函数。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
wal_init_zero (boolean)
如果设置为on(默认值),这个选项会导致新的WAL文件被0填满。在某些文件系统上,这可以确保在需要写入WAL记录之前分配空间。不过,Copy-On-Write (COW)文件系统可能不会受益于这种技术,所以给出这个选项可以跳过不必要的工作。 如果设置为off,则在创建文件时只写入最后一个字节,使其具有预期的大小。
wal_recycle (boolean)
如果设置为 on (默认值), 这个选项会导致 WAL文件通过重命名它们来回收, 从而避免创建新文件的需要。在COW 文件系统, 创建新文件也许会更快,因此提供这个选项来禁用这种行为。
wal_sender_timeout (integer)
中断那些停止活动超过这个时间量的复制连接。这对发送服务器检测一个费用服务器崩溃或网络中断有用。如果指定值时没有单位,则以毫秒为单位。默认值是 60 秒。值0将禁用超时机制。
对于跨越多个地理位置分布的集群,每个位置使用不同的值可以为集群管理带来更大的灵活性。对于具有低延迟网络连接的备用服务器,较小的值有助于更快的故障检测; 对于位于远端位置的具有高延迟网络连接的备用服务器,较大的值有助于更好地判断备用服务器的健康状况。
track_commit_timestamp (boolean)
记录事务的提交时间。这个参数只能在postgresql.conf 文件中或在服务器命令行上设置。默认值是off。
主服务器
这些参数可以在发送复制数据给一个或多个后备服务器的主控/主要服务器上设置。注意除了这些参数之外,在主控服务器上必须设置合适的
wal_level,并且也启用可选的 WAL 归档。这些参数值与后备服务器无关,尽管你可能希望为了准备好一个后备机转变成主控机来设置这些参数。
synchronous_standby_names (string)
如上所述,这个参数指定一个支持同步复制的后备服务器的列表。可能会有一个或者多个活动的同步后备服务器,在这些后备服务器确认收到它们的数据之后,等待提交的事务将被允许继续下去。同步后备服务器是那些名字出现在这个列表前面,并且当前已连接并且正在实时流传输数据(如pg_stat_replication视图中streaming的状态所示)的服务器。指定多于一台同步后备可以得到非常高的可用性并且能防止数据丢失。
用于这一目的的后备服务器的名称是其application_name设置,它在后备服务器的连接信息中设置。在物理复制后备的情况下,这应该被设置在
primary_conninfo设置中,如果设置了,默认是cluster_name的设置,否则为 walreceiver。对于逻辑复制,可以在订阅的连接信息中设置。
这个参数使用下面的语法之一来指定一个后备服务器列表:
[FIRST] num_sync ( standby_name [, ...] )
ANY num_sync ( standby_name [, ...] )
standby_name [, ...]
其中num_sync是事务需要等待其回复的同步后备服务器的数量,standby_name是一个后备服务器的名称。FIRST以及ANY指定从所列服务器中选取同步后备的方法。
关键词FIRST加上num_sync指定一种基于优先的同步复制,并且会让事务提交等待,直到它们的WAL记录被复制到基于优先级选择的num_sync台同步后备上为止。例如,设置FIRST 3 (s1, s2, s3, s4)将导致每次提交都等待来自三台较高优先级的后备机的答复,这三台后备机将从后备服务器s1、s2、s3以及s4中选出。在该列表中出现较早的后备服务器将被给予较高的优先级,并且将被考虑为同步后备。列表中出现的其他后备服务器表示潜在的同步后备。如果当前的任何同步后备因为某种原因断开连接,它将立刻被下一个最高优先级的后备服务器替代。关键词FIRST是可选的。
关键词ANY加上num_sync指定一种基于规定数量的同步复制,并且会让事务提交等待,直到它们的WAL记录被复制到所列出后备服务器中的至少num_ sync台上为止。例如,设置ANY 3 (s1, s2, s3, s4)将导致每次提交会在收到s1、s2、s3以及s4中任意三台后备服务器的回答后立刻继续下去。
FIRST和ANY是大小写不敏感的。如果这些关键词被用作后备服务器的名字,其standby_name必须被放在双引号内。
瀚高数据库之前使用过第三种语法,目前也仍然支持。它和FIRST和num_sync等于1的第一种语法相同。例如,FIRST 1 (s1, s2)和s1, s2具有相同的含义:s1或者s2会被选中作为同步后备服务器。
特殊项*匹配任意后备名称。
没有机制强制后备服务器名称的唯一性。在出现重复的情况下,匹配的后备之一将被认为是较高优先级,不过无法弄清到底是哪一个。
| 注意: |
|---|
| 每一个standby_name都应该具有合法 SQL 标识符的形式,除非它是*。如果必要你可以使用双引号。但是注意在比较standby_name和后备机应用程序名称时是大小写不敏感的(不管有没有双引号)。 |
如果这里没有指定同步后备机名称,那么同步复制不能被启用并且事务提交将不会等待复制。这是默认的配置。即便当同步复制被启用时,个体事务也可以被配置为不等待复制,做法是将synchronous_commit参数设置为local或off。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
vacuum_defer_cleanup_age (integer)
指定VACUUM和HOT更新在清除死亡行版本之前,应该推迟多久(以事务数量计)。默认值是零个事务,表示死亡行版本将被尽可能快地清除,即当它们不再对任何打开的事务可见时尽快清除。在一个支持热后备服务器的主服务器上,你可能希望把这个参数设置为一个非零值。这允许后备机上的查询有更多时间来完成而不会由于先前的行清除产生冲突。但是,由于该值是用在主服务器上发生的写事务的数目衡量的,很难预测对后备机查询可用的附加时间到底是多少。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
你也可以考虑设置后备服务器上的hot_standby_feedback作为使用这个参数的一种替代方案。
这无法阻止已经达到old_snapshot_threshold所指定年龄的死亡行被清除。
后备服务器
这些设置空值接收复制数据的一个后备服务器的行为。它们的值与主服务器无关。
primary_conninfo (string)
指定备用服务器用来连接发送服务器的连接字符串。如果在这个字符串中有任何选项未被指定,那么将检查相应的环境变量。如果环境变量也没有被设置,则使用默认值。
连接字符串应当指定发送服务器的主机名(或地址),以及端口号(如果它和备用服务器的默认端口不同)。还要指定对应于发送服务器上合适权限角色的用户名。 如果发送服务器要求口令认证,还需要提供一个口令。它可以在primary_conninfo字符串中提供,或者在后备服务器(使用replication作为数据库名)的一个单独~/.pgpass文件中提供。不要在primary_conninfo字符串中指定一个数据库名。
这个参数只能在服务器启动时被设置。如果服务器没有处于备用模式,则此设置无效。
primary_slot_name (string)
有选择地指定通过流复制连接到发送服务器时使用一个现有的复制槽来控制上游节点上的资源移除。这个参数只能在服务器启动时被设置。如果没有设置primary_conninfo则这个设置无效。
promote_trigger_file (string)
指定一个触发器文件,该文件的存在会结束后备机中的恢复。即使这个值没有被设置,你也能够使用pg_ctl promote或调用pg_promote来提升后备机。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
hot_standby (boolean)
指定在恢复期间,你是否能够连接并运行查询。默认值是on。这个参数只能在服务器启动时设置。它只在归档恢复期间或后备机模式下才有效。
max_standby_archive_delay (integer)
当热后备机处于活动状态时,这个参数决定取消那些与即将应用的 WAL 项冲突的后备机查询之前,后备服务器应该等待多久。当 WAL 数据被从 WAL归档(并且因此不是当前的 WAL)时,max_standby_ archive_delay可以应用。如果指定值时没有单位,则以毫秒为单位。默认值是 30 秒。值 -1 允许后备机一直等到冲突查询结束。这个参数只能在
postgresql.conf文件中或在服务器命令行上设置。
注意,max_standby_archive_delay与取消之前一个查询能够运行的最长时间不同;它表示应用任何一个 WAL 段数据能够被允许的最长总时间。因此,如果一个查询早于 WAL段导致了显著的延迟,后续冲突查询将只有更少的时间。
max_standby_streaming_delay (integer)
当热后备机处于活动状态时,这个参数决定取消那些与即将应用的 WAL 项冲突的后备机查询之前,后备服务器应该等待多久,如第26.5.2节中所述。当 WAL 数据正在通过流复制被接收时,max_standby_streaming_delay可以应用。如果指定值时没有单位,则以毫秒为单位。默认值是 30 秒。值 -1 允许后备机一直等到冲突查询结束。 这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
注意,max_standby_streaming_delay与取消之前一个查询能够运行的最长时间不同;它表示在从主服务器接收到 WAL 数据并立刻应用它能够被允许的最长总时间。因此,如果一个查询导致了显著的延迟,后续冲突查询将只有更少的时间,直到后备服务器再次赶上进度。
wal_receiver_status_interval (integer)
指定在后备机上的 WAL 接收者进程向主服务器或上游后备机发送有关复制进度的信息的最小频度,它可以使用pg_stat_replication视图看到。后备机将报告它已经写入的上一个预写式日志位置、它已经刷到磁盘的上一个位置以及它已经应用的最后一个位置。
这个参数的值是报告之间的最大时间量。每次写入或刷出位置改变时会发送状态更新,或者至少按这个参数的指定的频度发送。因此,应用位置可能比真实位置略微滞后。如果指定值时没有单位,则以秒为单位。默认值是 10 秒。将这个参数设置为零将完全禁用状态更新。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
hot_standby_feedback (boolean)
指定一个热后备机是否将会向主服务器或上游后备机发送有关于后备机上当前正被执行的查询的反馈。这个参数可以被用来排除由于记录清除导致的查询取消,但是可能导致在主服务器上用于某些负载的数据库膨胀。反馈消息的发送频度不会高于每个wal_receiver_status_interval周期发送一次。默认值是off。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
如果使用级联复制,反馈将被向上游传递直到它最后到达主服务器。后备机在接收到反馈之后除了传递给上游不会做任何其他操作。
这个设置不会覆盖主服务器上的old_snapshot_threshold的行为,后备服务器上一个超过了主服务器年龄阈值的快照可能会变得不可用,导致后备服务器上事务的取消。这是因为old_snapshot_threshold是为了对死亡行能够存在的时间给出一个绝对限制,不然就会因为一个后备服务器的配置而被违背。
wal_receiver_timeout (integer)
中止处于非活动状态超过这个时间量的复制链接。这对于正在接收的后备服务器检测主服务器崩溃或网络断开有用。如果指定值时没有单位,则以毫秒为单位。默认值是 60秒。这个参数只能在postgresql.conf文件中或者服务器命令行中设置。
wal_retrieve_retry_interval (integer)
指定当从任何来源(流复制、本地pg_wal或者 WAL 归档)都得不到 WAL 数据时,后备服务器应该等待多久才去重新尝试获取 WAL 数据。如果指定值时没有单位,则以毫秒为单位。默认值是 5 秒。这个参数只能在
postgresql.conf文件或者服务器命令行中设置。
这个参数对恢复中的节点需要为新 WAL 数据可用等待多少时间的配置有用。例如,在归档恢复中,通过减小这个参数的值可以让恢复更积极地检测新的 WAL 日志文件。在一个 WAL 活动较低的系统上,增加这个参数的值可以减 少访问 WAL 归档所必需的请求数量,这对于例如云环境是有用的,在其中对于基础设施的访问时间也是被考虑的。
recovery_min_apply_delay (integer)
默认情况下,后备服务器会尽快恢复来自于发送服务器的 WAL 记录。有一份数据的延时拷贝是有用的,它能提供机会纠正数据丢失错误。这个参数允许你将恢复延迟一段指定的时间量。例如,如果你设置这个参数为5min,对于一个事务提交,只有当后备机上的系统时钟超过主服务器报告的提交时间至少 5分钟时,后备机才会重放该事务。如果指定值时没有单位,则以毫秒为单位。默认为0,不增加延迟。
有可能服务器之间的复制延迟会超过这个参数的值,在这种情况下则不会增加延迟。注意延迟是根据主服务器上写 WAL 的时间戳以及后备机上的当前时间来计算。由于网络延迟或者级联复制配置导致的传输延迟可能会显著地减少实际等待时间。如果主服务器和后备机上的系统时钟不同步,这会导致恢复比预期的更早应用记录。但这不是一个主要问题,因为这个参数有用的设置比服务器之间的典型事件偏差要大得多。
只有在事务提交的 WAL 记录上才会发生延迟。其他记录还是会被尽可能快地重放,这不会成为问题,因为 MVCC 可见性规则确保了在对应的提交记录被应用之前它们的效果不会被看到。
一旦恢复中的数据库已经达到一致状态,延迟就会产生,直到后备机被提升或者触发。在那之后,后备机将会结束恢复并且不再等待。
这个参数的目的是和流复制部署一起使用,但是,如果指定了该参数,除了崩溃恢复之外所有的情况下都会遵守它。使用这个特性也会让hot_standby_feedback被延迟,这可能导致主服务器的膨胀,两者一起使用时要小心。
| 注意: |
|---|
| 当synchronous_commit被设置为remote_apply时,同步复制会受到这个设置的影响,每一个COMMIT都需要等待被应用。 |
订阅者
这些设置控制逻辑复制订阅者的行为。它们在发布者上的值与此无关。
注意,配置参数wal_receiver_timeout、wal_receiver_status_interval以及wal_retrieve_retry_interval也影响逻辑复制工作者。
max_logical_replication_workers (int)
指定逻辑复制工作者的最大数目。这同时包括应用工作者和表同步工作者。逻辑复制工作者是从max_worker_processes定义的池中取出的。
默认值是4。
max_sync_workers_per_subscription (integer)
每个订阅的同步工作者的最大数目。这个参数控制订阅初始化期间或者新表增加时的初始数据拷贝的并行度。当前,每个表只能有一个同步工作者。
同步工作者是从max_logical_replication_workers定义的池中取出的。 默认值为2。
查询规划
规划器方法配置
这些配置参数提供了影响查询优化器选择查询规划的原始方法。如果优化器为特定的查询选择的缺省规划并不是最优,那么我们就可以通过使用这些 配置参数强制优化器选择一个更好的规划来temporary解决这个问题。不过,永久地关闭这些设置几乎从不是个好主意。更好的改善优化器选择规划的方法包括调节Section、更频繁运行ANALYZE、增大配置参数default_statistics_target的值、使用 ALTER TABLE SET STATISTICS为某个字段增加收集的 统计信息。这些配置参数影响查询优化器选择查询计划的暴力方法。如果优化器为一个特定查询选择的默认计划不是最优的,一种临时解决方案是使用这些配置参数之一来强制优化器选择一个不同的计划。提高优化器选择的计划质量的更好的方式包括调整规划器的代价常数、手工运行ANALYZE、增加default_statistics_target配置参数的值以及使用ALTER TABLE SET STATISTICS增加为特定列收集的统计信息量。
enable_bitmapscan (boolean)
允许或禁止查询规划器使用位图扫描计划类型。默认值是on。
enable_gathermerge (boolean)
启用或者禁用查询规划器对收集归并计划类型的使用。默认值是on。
enable_hashagg (boolean)
允许或禁用查询规划器使用哈希聚集计划类型。默认值是on。
enable_hashjoin (boolean)
允许或禁止查询规划器使用哈希连接计划类型。默认值是on。
enable_indexscan (boolean)
允许或禁止查询规划器使用索引扫描计划类型。默认值是on。
enable_indexonlyscan (boolean)
允许或禁止查询规划器使用只用索引扫描计划类型。默认值是on。
enable_material (boolean)
允许或者禁止查询规划器使用物化。它不可能完全禁用物化,但是关闭这个变量将阻止规划器插入物化节点,除非为了保证正确性。默认值是on。
enable_mergejoin (boolean)
允许或禁止查询规划器使用归并连接计划类型。默认值是on。
enable_nestloop (boolean)
允许或禁止查询规划器使用嵌套循环连接计划。它不可能完全禁止嵌套循环连接,但是关闭这个变量将使得规划器尽可能优先使用其他方法。默认值是on。
enable_parallel_append (boolean)
允许或禁止查询规划器使用并行追加计划类型。默认值是on。
enable_parallel_hash (boolean)
允许或禁止查询规划器对并行哈希使用哈希连接计划类型。如果哈希连接计划也没有启用,这个参数没有效果。默认值是on。
enable_partition_pruning (boolean)
允许或者禁止查询规划器从查询计划中消除一个分区表的分区。这也控制着规划器产生允许执行器在查询执行期间移除(忽略)分区的查询计划的能力。默认值是on。
enable_partitionwise_join (boolean)
允许或者禁止查询规划器使用面向分区的连接,这使得分区表之间的连接以连接匹配的分区的方式来执行。面向分区的连接当前只适用于连接条件包括所有分区键的情况,连接条件必须是相同的数据类型并且子分区集合要完全匹配。由于面向分区的连接规划在规划期间会使用可观的CPU时间和内存,所以默认值为off。
enable_partitionwise_aggregate (boolean)
允许或者禁止查询规划器使用面向分区的分组或聚集,这使得在分区表上的分组或聚集可以在每个分区上分别执行。如果GROUP BY子句不包括分区键,只有部分聚集能够以基于每个分区的方式执行,并且finalization必须最后执行。由于面向分区的分组或聚集在规划期间会使用可观的CPU时间和内存,所以默认值为off。
enable_seqscan (boolean)
允许或禁止查询规划器使用顺序扫描计划类型。它不可能完全禁止顺序扫描,但是关闭这个变量将使得规划器尽可能优先使用其他方法。默认值是on。
enable_sort (boolean)
允许或禁止查询规划器使用显式排序步骤。它不可能完全禁止显式排序,但是关闭这个变量将使得规划器尽可能优先使用其他方法。默认值是on。
enable_tidscan (boolean)
允许或禁止查询规划器使用TID扫描计划类型。默认值是on。
enable_insertparallel(boolean)
允许是否开启并行插入功能。
若启用此功能,在生成查询计划时,会考虑是否启动并行查询模式。实际能否启用,依赖于查询代价估算;
若不启用此功能,在生成查询计划时,不会考虑并行查询模式。
规划器代价常量
这一节中描述的代价变量可以按照任意尺度衡量。我们只关心它们的相对值,将它们以相同的因子缩放不会影响规划器的选择。默认情况下,这些代价变量是基于顺序页面获取的代价的,即seq_page_cost被设置为1.0并且其他代价变量都参考它来设置。不过你可以使用你喜欢的不同尺度,例如在一个特定机器上的真实执行时间。
| 注意: |
|---|
| 不幸的是,没有一种良定义的方法来决定代价变量的理想值。它们最好被作为一个特定安装将接收到的查询的平均值来对待。这意味着基于少量的实验来改变它们是有风险的。 |
seq_page_cost (floating point)
设置规划器计算一次顺序磁盘页面抓取的开销。默认值是1.0。 通过设置同名的表空间参数,这个值可以重写为一个特定的表空间。参阅ALTER TABLESPACE。设置规划器对一系列顺序磁盘页面获取中的一次的代价估计。默认值是 1.0。通过把表和索引放在一个特殊的表空间(要设置该表空间的同名参数)中可以覆盖这个值(见ALTER TABLESPACE)。
random_page_cost (floating point)
设置规划器对一次非顺序获取磁盘页面的代价估计。默认值是 4.0。通过把表和索引放在一个特殊的表空间(要设置该表空间的同名参数)中可以覆盖这个值(见ALTER TABLESPACE)。
减少这个值(相对于seq_page_cost)将导致系统更倾向于索引扫描;提高它将让索引扫描看起来相对更昂贵。你可以一起提高或降低两个值来改变磁盘 I/O 代价相对于 CPU 代价的重要性,后者由下列参数描述。
对磁盘存储的随机访问通常比顺序访问要贵不止四倍。但是,由于对磁盘的大部分随机访问(例如被索引的读取)都被假定在高速缓冲中进行,所以使用了一个较低的默认值(4.0)。默认值可以被想成把随机访问建模为比顺序访问慢 40 倍,而期望 90% 的随机读取会被缓存。
如果你相信 90% 的缓冲率对你的负载是一个不正确的假设,你可以增加
random_page_cost 来更好的反映随机存储读取的真正代价。相应地,如果你的数据可以完全放在高速缓存中(例如当数据库小于服务器总内存时),降低 random_page_cost 可能是合适的。为具有很低的随机读取代价的存储(例如固态驱动器)采用较低的random_page_cost 值可能更好。
| 提示: |
|---|
| 虽然允许你将random_page_cost设置的比seq_page_cost小,但是物理上的实际情况并不受此影响。然而当所有数据库都位于内存中时,两者设置为相等是非常合理的,因为在此情况下,乱序抓取并不比顺序抓取开销更大。同样,在缓冲率很高的 数据库上,你应当相对于 CPU 开销同时降低这两个值,因为获取内存中 的页比通常情况下的开销小许多。尽管系统可以是你把random_page_cost设置得小于seq_page_cost,但是实际上没有意义。不过,如果数据库被整个缓存在 RAM 中,将它们设置为相等是有意义的,因为在那种情况中不按顺序访问页面是没有惩罚值的。同样,在一个高度缓存化的数据库中,你应该相对于 CPU 参数降低这两个值,因为获取一个已经在 RAM 中的页面的代价要远小于通常情况下的代价。 |
cpu_tuple_cost (floating point)
设置规划器对一次查询中处理每一行的代价估计。默认值是 0.01。
cpu_index_tuple_cost (floating point)
设置规划器对一次索引扫描中处理每一个索引项的代价估计。默认值是 0.005。
cpu_operator_cost (floating point)
设置规划器对于一次查询中处理每个操作符或函数的代价估计。默认值是 0.0025。
parallel_setup_cost (floating point)
设置规划器对启动并行工作者进程的代价估计。默认是 1000。
parallel_tuple_cost (floating point)
设置规划器对于从一个并行工作者进程传递一个元组给另一个进程的代价估计。默认是0.1。
min_parallel_table_scan_size (integer)
为必须扫描的表数据量设置一个最小值,扫描的表数据量超过这一个值才会考虑使用并行扫描。对于并行顺序扫描,被扫描的表数据量总是等于表的尺寸,但是在使用索引时,被扫描的表数据量通常会更小。如果指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB。默认值是8兆字节(8MB)。
min_parallel_index_scan_size (integer)
为必须扫描的索引数据量设置一个最小值,扫描的索引数据量超过这一个值时才会考虑使用并行扫描。注意并行索引扫描通常并不会触及整个索引,它是规划器认为该扫描会实际用到的相关页面的数量。如果指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB。默认值是162千字(162kB)。
effective_cache_size (integer)
设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。 这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用。在设置这个参数时,你还应该考虑瀚高数据库的共享缓冲区以及将被用于瀚高数据库数据文件的内核磁盘缓冲区,尽管有些数据可能在两个地方都存在。另外,还要考虑预计在不同表上的并发查询数目,因为它们必须共享可用的空间。这个参数对瀚高数据库分配的共享内存尺寸没有影响,它也不会保留内核磁盘缓冲,它只用于估计的目的。系统也不会假设在查询之间数据会保留在磁盘缓冲中。如果指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB。默认值是4GB。(如果BLCKSZ不是8kB,默认值会按比例缩放它。)
jit_above_cost (floating point)
设置激活JIT编译的查询代价,如果查询代价超过这个值就会激活JIT编译。执行JIT会消耗一些规划时间,但是能够加速查询执行。将这个值设置为-1会禁用JIT编译。默认值是100000。
jit_inline_above_cost (floating point)设置JIT编译尝试内联函数和操作符的查询代价阈值,如果查询代价超过这个值,JIT编译就会尝试内联。内联会增加规划时间,但是可以提高执行速度。将这个参数设置成小于jit_above_cost是没有意义的。将这个参数设置为-1会禁用内联。默认值是500000。
jit_optimize_above_cost (floating point)
设置JIT编译应用优化的查询代价阈值,如果查询代价超过这个值,JIT编译就会应用开销较大的优化。这类优化会增加规划时间,但是更能够改进执行速度。将这个参数设置成小于jit_above_cost是没有意义的,并且将它设置成大于jit_inline_above_cost也未必有益。将这个参数设置为-1会禁用开销较大的优化。默认值是500000。
遗传查询优化
GEQO是一个使用探索式搜索来执行查询规划的算法。它可以降低负载查询的规划时间。同时,GEQO的检索是随机的,因此它的规划可能会不可确定。 更多信息参阅Chapter 50。遗传查询规划器(GEQO)是一种使用启发式搜索来进行查询规划的算法。它可以降低对于复杂查询(连接很多表的查询)的规划时间,但是代价是它产生的计划有时候要差于使用穷举搜索算法找到的计划。
geqo (boolean)
允许或禁止遗传查询优化。默认是启用。在生产环境中通常最好不要关闭
它。geqo_threshold变量提供了对 GEQO 更细粒度的空值。
geqo_threshold (integer)
只有当涉及的FROM项数量至少有这么多个的时候,才使用遗传查询优化(注意一个FULL OUTER JOIN只被计为一个FROM项)。默认值是 12。对于更简单的查询,通常会使用普通的穷举搜索规划器,但是对于有很多表的查询穷举搜索会花很长时间,通常比执行一个次优的计划带来的惩罚值还要长。因此,在查询尺寸上的一个阈值是管理 GEQO 使用的一种方便的方法。
geqo_effort (integer)
控制 GEQO 里规划时间和查询规划的有效性之间的平衡。这个变量必须是 一个范围从 1 到 10 的整数。缺省值是 5 。大的数值增加花在进行查询 规划上面的时间,但是也很可能会提高选中更有效的查询规划的几率。控制 GEQO 中规划时间和查询计划质量之间的折中。这个变量必须是位于 1 到 10 之间的一个整数。默认值是 5。更大的值会增加花在查询规划上的时间,但是同时也增加了选择一个高效查询计划的可能性。
geqo_effort实际并不直接做任何事情;它只是被用来计算其他影响 GEQO 行为的变量 (如下所述)的默认值。如果你愿意,你可以手工设置其他参数。
geqo_pool_size (integer)
控制 GEQO 使用的池尺寸,它就是遗传种群中的个体数目。它必须至少为 2,且有用的值通常在 100 到 1000 之间。如果它被设置为零(默认设置)则会基于geqo_effort和查询中表的数量选择一个合适的值。
geqo_generations (integer)
控制 GEQO 使用的子代数目。子代的意思是算法的迭代次数。它必须至少 是 1 ,有用的值范围和池大小相同。如果设置为零(缺省),那么将基于 geqo_pool_size选取合适的值。控制 GEQO 使用的代数,也是算法的迭代次数。它必须至少为 1,并且有用值的范围和池尺寸相同。如果它被设置为零(默认设置)则会基于geqo_pool_size选择一个合适的值。
geqo_selection_bias (floating point)
控制 GEQO 使用的选择偏好。选择偏好是种群中的选择压力。值可以是 1.5 到 2.0 之间,后者是默认值。
geqo_seed (floating point)
控制 GEQO 使用的随机数生成器的初始值,随机数生成器用于在连接顺序搜索空间中选择随机路径。该值可以从 0 (默认值)到 1。变化该值会改变被探索的连接路径集合,并且可能导致找到一个更好或更差的路径。
其他规划器选项
default_statistics_target (integer)
为没有通过ALTER TABLE SET STATISTICS设置列相关目标的表列设置默认统计目标。更大的值增加了需要做ANALYZE的时间,但是可能会改善规划器的估计质量。默认值是 100。
constraint_exclusion (enum)
控制查询规划器对表约束的使用,以优化查询。constraint_exclusion的允许值是on(对所有表检查约束)、off(从不检查约束)和partition(只对继承的子表和UNION ALL子查询检查约束)。 partition是默认设置。它通常与传统的继承树一起使
用来提高性能。
当对一个特定表允许这个参数,规划器比较查询条件和表的CHECK约束,并且忽略那些条件违反约束的表扫描。例如:
CREATE TABLE parent(key integer, ...);
CREATE TABLE child1000(check (key between 1000 and 1999)) INHERITS(parent);
CREATE TABLE child2000(check (key between 2000 and 2999)) INHERITS(parent);
...
SELECT * FROM parent WHERE key = 2400;
在启用约束排除时,这个SELECT将完全不会扫描child1000,从而提高性能。
目前,约束排除只在通过继承树实现表分区的情况中被默认启用。为所有表启用它会增加额外的规划开销,特别是在简单查询上并且不会产生任何好处。 如果没有用传统继承树分区的表时,最好是完全关闭它。(注意分区表的等效特性是由单独的参数控制的,enable_partition_pruning.)
更多关于使用约束排除实现分区的信息请参阅第5.11.5节。
cursor_tuple_fraction (floating point)
设置规划器对将被检索的一个游标的行的比例的估计。默认值是 0.1。更小的值使得规划器偏向为游标使用”快速开始”计划,它将很快地检索前几行但是可能需要很长时间来获取所有行。更大的值强调总的估计时间。最大设置为 1.0,游标将和普通查询完全一样地被规划,只考虑总估计时间并且不考虑前几行会被多快地返回。
from_collapse_limit (integer)
如果生成的FROM列表不超过这么多项,规划器将把子查询融合到上层查询。较小的值可以减少规划时间,但是可能会生成较差的查询计划。默认值是 8。
将这个值设置为geqo_threshold或更大,可能触发使用 GEQO 规划器,从而产生非最优计划。
jit (boolean)
决定瀚高数据库是否可以使用JIT编译。默认值是on。
join_collapse_limit (integer)
如果得出的列表中不超过这么多项,那么规划器将把显式JOIN(除了FULL JOIN)结构重写到 FROM项列表中。较小的值可减少规划时间,但是可能会生成差些的查询计划。
默认情况下,这个变量被设置成和from_collapse_limit相同,这样适合大多数使用。
把它设置为 1 可避免任何显式JOIN的重排序。因此查询中指定的显式连接顺序就是关系被连接的实际顺序。因为查询规划器并不是总能选取最优的连接顺序,高级用户可以选择暂时把这个变量设置为 1,然后显式地指定他们想要的连接顺序。更多信息请将这个值设置为geqo_threshold或更大,可能触发使用 GEQO 规划器,从而产生非最优计划。
parallel_leader_participation (boolean)
允许领导者进程执行Gather和Gather Merge节点之下的查询计划而不是等待工作者进程。默认值是on。将这个值设置为off会降低工作者由于领导者读取元组速度不够快而被阻塞的可能性,但是要求领导者在产生第一个元组之前等待工作者进程启动。领导者能够帮助或者阻碍性能的程度取决于计划的类型、工作者的数量以及查询时长。
force_parallel_mode (enum)
允许为测试目的使用并行查询,即便是并不期望在性能上得到效益。force_parallel_mode的允许值是off(只在期望改进性能时才使用并行模式)、on(只要查询被认为是安全的,就强制使用并行查询)以及regress(和on相似,但是有如下文所解释的额外行为改变)。
更具体地说,把这个值设置为on会在任何一个对于并行查询安全的查询计划顶端增加一个Gather节点,这样查询会在一个并行工作者中运行。即便当一个并行工作者不可用或者不能被使用时,诸如开始一个子事务等在并行查询环境中会被禁止的操作将会被禁止,除非规划器相信这样做会导致查询失败。当这个选项被设置时如果出现失败或者意料之外的结果,查询使用的某些函数可能需要被标记为PARALLEL UNSAFE(或者可能是PARALLEL RESTRICTED)。
把这个值设置为regress具有设置成on所有相同的效果,外加一些有助于自动回归测试的额外的效果。一般来说,来自于一个并行工作者的消息会包括一个上下文行指出这一点,但是设置为regress会消除这一行,这样输出就和非并行执行完全一样。同样,被这个设置加到计划上的Gather节点在EXPLAIN输出终会被隐藏起来,这样产生的输出匹配设置为off时产生的输出。
plan_cache_mode (enum)
准备语句(显式准备或隐式生成的,例如 PL/pgSQL)可以使用自定义或通用计划执行。使用其特定的参数值集为每个执行重新生成自定义计划,而通用计划不依赖于参数值,并且可以在执行中重复使用。因此,使用通用计划可以节省计划时间,但如果理想计划严重依赖参数值,则通用计划可能效率低下。这些选项之间的选择通常是自动进行的,但可以通过plan_cache_mode覆盖它。允许的值为auto (默认的),force_custom_plan 和 force_generic_plan。 这个设置是在执行缓存计划时考虑,而不是在准备计划时考虑。更多信息请参阅 PREPARE.
错误报告和日志
在哪里做日志
log_destination (string)
瀚高数据库支持多种方法来记录服务器消息,包括stderr、csvlog和syslog。设置这个参数为一个由想要的日志目的地的列表,之间用逗号分隔。默认值是只记录到stderr。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
如果csvlog被包括在log_destination中,日志项会以”逗号分隔值” (CSV)格式被输出,这样可以很方便地把日志载入到程序中。要产生 CSV 格式的日志输出,必须启用logging_collector。
当包括有stderr或csvlog时,会创建文件current_logfiles来记录当前正在被日志收集器使用的日志文件的位置以及相关的日志目的地。这提供了一种查找实例当前使用的日志的便利手段。
当由于轮转效应创建一个新的日志文件时以及log_destination被重载时,current_logfiles文件会被重建。当log_destination中不包括stderr和csvlog时以及当日志收集器被禁用时,这个文件会被删除。
| 注意: |
|---|
| 在大多数 Unix 系统上,你将需要修改系统的syslog守护进程的配置来使用log_destination的syslog选项。瀚高数据库可以在syslog设备LOCAL0到LOCAL7中记录(见syslog_facility),但是大部分平台上的默认syslog配置会丢弃所有这种消息。你将需要增加这样的内容: local0.* /var/log/postgresql 到syslog守护进程的配置文件来让它工作。 |
logging_collector (boolean)
这个参数启用日志收集器,它是一个捕捉被发送到stderr的日志消息的后台进程,并且它会将这些消息重定向到日志文件中。这种方法比记录到syslog通常更有用,因为某些类型的消息不会在syslog输出中出现(一个常见的例子是动态链接器错误消息;另一个例子是由archive_command等脚本产生的错误消息)。这个参数只能在服务器启动时设置。
| 注意: |
|---|
| 也可以不使用日志收集器而把日志记录到stderr,日志消息将只会去到服务器的stderr被定向到的位置。不过,那种方法只适合于低日志量,因为它没有提供方法来轮转日志文件。还有,在某些不使用日志收集器的平台上可能会导致丢失或者混淆日志输出,因为多个进程并发写入同一个日志文件时会覆盖彼此的输出。 |
| 注意: |
|---|
| 日志收集器被设计成从来不会丢失消息。这意味着在极高的负载下,如果服务器进程试图在收集器已经落后时发送更多的日志消息,那么它会被阻塞。相反,syslog倾向于在无法写入消息时丢掉消息,这意味着在这样的情况下它可能会无法记录某些消息,但是它不会阻塞系统的其他部分。 |
log_directory (string)
当logging_collector被启用时,这个参数决定日志文件将被在哪个目录下创建。它可以被指定为一个绝对路径,也可以被指定为一个相对于集簇数据目录的相对路径。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。 默认是pg_log。
log_filename (string)
当logging_collector被启用时,这个参数设置被创建的日志文件的文件名。该值被视为一种strftime模式,因此%转义可以被用来指定根据时间变化的文件名(注意如果有任何时区独立的%转义,计算将在由log_timezone指定的时区中完成)。被支持的%转义和开放组织的strftime1说明中列举的类似。注意系统的strftime不会被直接使用,因此平台相关(非标准)的扩展无法工作。默认是postgresql-%Y-%m-%d_%H%M%S.log。
如果你不使用转义来指定一个文件名,你应该计划使用一个日志轮转工具来避免最终填满整个磁盘。
如果在log_destination中启用了 CSV 格式输出,.csv将会被追加到时间戳日志文件名中来创建 CSV 格式输出(如果log_filename以.log结尾,该后缀会被替换)。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
log_file_mode (integer)
在 Unix 系统上,当logging_collector被启用时,这个参数设置日志文件的权限。这个参数值应当是一个数字形式的模式,它可以被chmod和umask系统调用接受(要使用通常的十进制格式,该数字必须以一个0(零)开始)。
默认的权限是0600,表示只有服务器拥有者才能读取或写入日志文件。其他常用的设置是0640,它允许拥有者的组成员读取文件。不过要注意你需要修改log_directory为将文件存储在集簇数据目录之外的某个位置,才能利用这个设置。在任何情况下,让日志文件变成任何人都可读是不明智的,因为日志文件中可能包含敏感数据。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
log_rotation_age (integer)
当logging_collector被启用时,这个参数决定使用一个单个日志文件的最大时间量,之后将创立一个新的日志文件。 如果指定值时没有单位,则以分钟为单位。默认为24小时。 将这个参数设置为零将禁用基于时间的新日志文件创建。
这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
log_rotation_size (integer)
当logging_collector被启用时,这个参数决定一个个体日志文件的最大尺寸。当这些数据量被发送到一个日志文件后,将创建一个新的日志文件。 如果指定值的时候没有单位,则以千字节为单位。默认值是10兆字节。设置为零时将禁用基于大小创建新的日志文件。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
log_truncate_on_rotation (boolean)
当logging_collector被启用时,这个参数将导致数据库截断(覆盖而不是追加)任何已有的同名日志文件。不过,截断只在一个新文件由于基于时间的轮转被打开时发生,在服务器启动或基于尺寸的轮转时不会发生。如果被关闭,在所有情况下以前存在的文件将被追加。例如,使用这个设置和一个类似postgresql-%H.log的log_filename将导致产生 24 个每小时的日志文件,并且循环地覆盖它们。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
例子:要保留 7 天的日志,每天的一个日志文件被命令为server_log.Mon、server_log.Tue等等,并且自动用本周的日志覆盖上一周的日志。可以这样做:将log_filename设置为server_log.%a、将log_truncate_on_rotation设置为on并且将log_rotation_age设置为1440。
例子:要保留 24 小时的日志,每个小时一个日志文件,但是在日志文件
尺寸超过 1GB 时轮转。可以这样做:将log_filename设置为server_log.%H
%M、将log_truncate_on_rotation设置为on、 将log_rotation_age设置为60并且将log_rotation_size设置为1000000。 在log_filename中包括%M允许发生任何尺寸驱动的轮转来选择一个不同于每个小时的初始文件名的新文件名。
syslog_facility (enum)
当启用了向syslog记录时,这个参数决定要使用的syslog”设备”。你可以在LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、 LOCAL5、LOCAL6、LOCAL7中选择,默认值是LOCAL0。还请参阅系统的syslog守护进程的文档。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
syslog_ident (string)
当启用了向syslog记录时,这个参数决定用来标识syslog中的瀚高数据库消息的程序名。默认值是postgres。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
syslog_sequence_numbers (boolean)
当日志被记录到syslog并且这个设置为on(默认)时,每一个消息会被加上一个增长的序号作为前缀(例如[2])。这种行为避开了很多syslog 实
现默认采用的”---上一个消息重复 N 次---“形式。在现代 syslog 实现中,抑制重复消息是可以配置的(例如rsyslog中的$RepeatedMsgReduction),因此这个参数可能不是必需的。此外,如果你真的想抑制重复消息,你可以把这个参数设置为 off。
这个参数只能在postgresql.conf文件或者服务器命令行上设置。
syslog_split_messages (boolean)
当启用把日志记录到syslog时,这个参数决定消息如何送达 syslog。当设置为 on(默认)时,消息会被分成行,并且长的行也会被划分以便能够放到 1024 字节中,这是传统 syslog 实现一种典型的尺寸限制。当设置为off时,瀚高数据库服务器日志消息会被原样送达 syslog 服务,而处理可能的大体量消息的任务由 syslog 服务负责。
如果 syslog 最终被记录到一个文本文件中,那么两种设置的效果是一样的,但最好设置为 on,因为大部分 syslog 实现要么不能处理大型消息,要么需要做特殊的配置以处理大型消息。但是如果 syslog 最终写入到某种其他媒介,有必要让消息保持逻辑上的整体性(也更加有用)。
这个参数只能在postgresql.conf文件或者服务器命令行上设置。
event_source (string)
当启用了向事件日志记录时,这个参数决定用来标识日志中瀚高数据库消息的程序名。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
什么时候记录日志
log_min_messages (enum)
控制哪些消息级别 被写入到服务器日志。有效值是DEBUG5、DEBUG4、
DEBUG3、DEBUG2、DEBUG1、 INFO、NOTICE、WARNING、 ERROR、LOG、FATAL和 PANIC。每个级别都包括以后的所有级别。级别越靠后,被发送的消息越少。默认值是WARNING。注意LOG在这里有与client_min_messages中不同的排名。只有管理员用户可以改变这个设置。
log_min_error_statement (enum)
控制哪些导致一个错误情况的 SQL 语句被记录在服务器日志中。任何指定 严重级别或更高级别的消息的当前 SQL 语句将被包括在日志项中。有效值是DEBUG5、 DEBUG4、DEBUG3、 DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、 LOG、 FATAL和PANIC。默认值是ERROR,它表示导致错误、日志消息、致命错误或恐慌错误的语句将被记录在日志中。要有效地关闭记录失败语句,将这个参数设置为PANIC。只有管理员用户可以改变这个设置。
log_min_duration_statement (integer)
如果语句运行至少指定的时间量,将导致记录每一个这种完成的语句的持续时间。如果指定值时没有单位,则以毫秒为单位。将这个参数设置为零将打印所有语句的执行时间。设置为 -1 (默认值)将停止记录语句持续时间。例如,如果你设置它为250ms,那么所有运行 250ms 或更久的 SQL 语句将被记录。启用这个参数可以有助于追踪应用中未优化的查询。只有管理员用户可以改变这个设置。对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。
| 注意: |
|---|
| 当把这个选项和log_statement一起使用时,已经被log_statement记录的语句文本不会在持续时间日志消息中重复。如果你没有使用syslog,我们推荐你使用log_line_prefix记录 PID 或会话 ID,这样你可以使用进程ID 或会话 ID 把语句消息链接到后来的持续时间消息。 |
log_transaction_sample_rate (real)
设置所有语句都被记录的交易的部分,以及由于其他原因而记录的语句。它适用于每个新事务,而不考虑其语句的持续时间。默认值是 0,表示不记录任何额外事务的语句。设置这个为1记录所有交易的所有语句。 log_transaction_sample_rate 有助于跟踪交易样本。只有管理员用户可以更改此设置。
| 注意: |
|---|
| 就像所有的语句-日志选项一样,这个选项可能会增加大量开销。 |
表2.1解释了瀚高数据库所使用的消息严重级别。如果日志输出被发送到syslog,严重级别会按照表中所示进行转换。
| 严重性 | 用法 | syslog | eventlog |
|---|---|---|---|
| DEBUG1..DEBUG5 | 为开发者提供连续的更详细的信息 | DEBUG | INFORMATION |
| INFO | 提供用户隐式要求的信息,例如来自VACUUM VERBOSE的输出 | INFO | INFORMATION |
| NOTICE | 提供可能对用户有用的信息,例如长标识符截断提示 | NOTICE | INFORMATION |
| WARNING | 提供可能出现的问题的警告,例如在一个事务块外COMMIT | NOTICE | WARNING |
| ERROR | 报告一个导致当前命令中断的错误 | WARNING | ERROR |
| LOG | 报告管理员可能感兴趣的信息,例如检查点活动 | INFO | INFORMATION |
| FATAL | 报告一个导致当前会话中断的错误 | ERR | ERROR |
| PANIC | 告一个导致所有数据库会话中断的错误 | CRIT | ERROR |
: 表 2.1 消息严重级别
记录什么到日志
application_name (string)
application_name可以是任意小于NAMEDATALEN个字符(标准编译中是 64 个字符)的字符串。这通常由一个应用通过到服务器的连接设置。该名称将被显示在pg_stat_activity视图中并被包括在 CSV 日志项中。它也会被通过log_line_prefix包括在普通日志项中。只有可打印 ASCII 字符能被使用在application_name之中。其他字符将被替换为问号(?)。
debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean)
这个参数启用发出各种调试输出。当设置时,会打印生成的解析树,查询重写输出,或执行的每个查询的执行计划。这些信息是在LOG信息级别发出,因此默认的,它们会出现在服务器日志中,但不会发送给客户端。可以通过 client_min_messages和/或log_min_messages 来设置。这些参数缺省off。 这些参数将会让多种调试输出被发出。当被设置时,它们为每一个被执行的查询打印结果分析树、查询重写器输出或执行计划。这些消息在LOG消息级别上被发出,因此默认情况下它们将出现在服务器日志中但不会被发送到客户端。你可以通过调整client_min_messages和/或log_min_messages来改变这种情况。这些参数默认是关闭的。
debug_pretty_print (boolean)
当被设置时,debug_pretty_print会缩进由debug_print_parse、
debug_print_rewritten或 debug_print_plan产生的输出。这将导致比关闭参数时使用的”紧凑”模式可读性更强但是更长的输出。它默认是打开的。
log_checkpoints (boolean)
导致检查点和重启点被记录在服务器日志中。一些统计信息也被包括在日志消息中,包括写入缓冲区的数据和写它们所花的时间。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是关闭。
log_connections (boolean)
导致每一次尝试对服务器的连接被记录,客户端认证的成功完成也会被记录。只有管理员用户能在会话开始时更改这个参数,在会话中它不能被更改。默认为off。
| 注意: |
|---|
| 某些客户端程序(例如psql)在要求密码时会尝试连接两次,因此重复 的”收到连接”消息并不一定表示一个错误。 |
log_disconnections (boolean)
导致会话终止被记录。日志输出提供的信息类似于 log_connections,不过还外加会话的持续时间。只有管理员用户能在会话开始时更改这个参数,在会话中它不能被更改。默认为off。
log_duration (boolean)
导致每一个完成的语句的持续时间被记录。默认值是off。只有管理员用户可以改变这个设置。
对于使用扩展查询协议的客户端,解析、绑定和执行步骤的持续时间将被独立记录。
| 注意: |
|---|
| 启用log_duration和设置log_min_duration_statement为零之间的区别是,超过log_min_duration_statement强制查询的文本被记录,但这个选项不会。因此,如果log_duration为on并且log_min_duration_statement为正值,所有持续时间都将被记录,但是只有超过阈值的语句才会被记录查询文本。这种行为有助于在高负载安装中收集统计信息。 |
log_error_verbosity (enum)
控制为每一个被记录的消息要写入到服务器日志的细节量。有效值是TERSE、DEFAULT和VERBOSE,每一个都为显示的消息增加更多域。TERSE排除记录DETAIL、HINT、QUERY和CONTEXT错误信息。VERBOSE输出包括SQLSTATE错误码以及产生错误的源代码文件名、函数名和行号。只有管理员用户能够更改这个设置。
log_hostname (boolean)
默认情况下,连接日志消息只显示连接主机的 IP 地址。打开这个参数将导致也记录主机名。注意根据你的主机名解析设置,这可能会导致很微小的性能损失。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
log_line_prefix (string)
这是一个printf风格的字符串,它在每个日志行的开头输出。%字符开始”转义序列”,它将被按照下文描述的替换成状态信息。未识别的转义被忽略。其他字符被直接复制到日志行。某些转义只被会话进程识别并且被主服务器进程等后台进程当作空。通过指定一个在%之后和该选项之前的数字可以让状态信息左对齐或右对齐。负值将导致在右边用空格填充状态信息已达到最小宽度,而正值则在左边填充。填充对于日志文件的人类可读性大有帮助。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。默认值是'%m [%p] ',它记录时间戳和进程ID。
| 转义 | 效果 | 只限会话 |
|---|---|---|
| %a | 应用名 | 是 |
| %u | 用户名 | 是 |
| %d | 数据库名 | 是 |
| %r | 远程主机名或 IP 地址,以及远程端口 | 是 |
| %h | 远程主机名或 IP 地址 | 是 |
| %p | 进程 ID | 否 |
| %t | 无毫秒的时间戳 | 否 |
| %m | 带毫秒的时间戳 | 否 |
| %n | 带毫秒的时间戳(作为 Unix 时间戳) | 否 |
| %i | 命令标签:会话当前命令的类型 | 否 |
| %e | SQLSTATE 错误代码 | 否 |
| %c | 会话 ID:见下文 | 否 |
| %l | 对每个会话或进程的日志行号,从 1 开始 | 否 |
| %s | 进程开始的时间戳 | 否 |
| %v | 虚拟事务 ID (backendID/ localXID | 否 |
| %x | 事务 ID (如果未分配则为0) | 否 |
| %q | 不产生输出,但是告诉非会话进程在字符串的这一点停止;会话进程忽略 | 否 |
| %% | 纯文字 % | 否 |
: 表 2.2 转义效果
%c转义打印一个准唯一的会话标识符,它由两个 4 字节的十六进制数(不带先导零)组成,以点号分隔。这些数字是进程启动时间和进程 ID,因此%c也可以被用作保存打印这些项的方式的空间。例如,要从pg_stat_activity生成会话标识符,使用这个查询:
SELECT to_hex(trunc(EXTRACT(EPOCH FROM backend_start))::integer) || '.' || to_hex(pid)
FROM pg_stat_activity;
| 提示: |
|---|
| 如果你为log_line_prefix设置了非空值,你通常应该让它的最后一个字符为空格,这样用以提供和日志行的剩余部分的视觉区别。也可以使用标点符号。 |
| 提示: |
|---|
| Syslog产生自己的时间戳和进程 ID 信息,因此如果你记录到syslog你可能不希望包括哪些转义。 |
| 提示: |
|---|
| 在包括仅在会话(后端)上下文中可用的信息(如用户名或者数据库名)时,%q转义很有用。例如:log_line_prefix = '%m [%p] %q%u@%d/%a |
log_lock_waits (boolean)
控制当一个会话为获得一个锁等到超过deadlock_timeout时,是否要产生一个日志消息。这有助于决定是否所等待造成了性能低下。默认值是off。只有管理员用户可以更改这个设置。
log_statement (enum)
控制哪些 SQL 语句被记录。有效值是 none (off)、ddl、mod和 all(所有语句)。ddl记录所有数据定义语句,例如CREATE、ALTER和 DROP语句。mod记录所有ddl语句,外加数据修改语句例如INSERT, UPDATE、DELETE、TRUNCATE, 和COPY FROM。 如果PREPARE、EXECUTE和 EXPLAIN ANALYZE包含合适类型的命令,它们也会被记录。对于使用扩展查询协议的客户端,当收到一个执行消息时会产生日志并且会包括绑定参数的值(任何内嵌的单引号会被双写)。
默认值是none。只有管理员用户可以改变这个设置。
| 注意: |
|---|
| 即使使用log_statement = all设置,包含简单语法错误的语句也不会被记录。这是因为只有在完成基本语法解析并确定了语句类型之后才会发出日志消息。在扩展查询协议的情况下,在执行阶段之前(即在解析分析或规划期间)出错的语句也不会被记录。将log_min_error_statement设置为ERROR(或更低)来记录这种语句。 |
log_replication_commands (boolean)
导致每一个复制命令都被记录在服务器日志中。默认值是off。只有管理员用户可以更改这个设置。log_temp_files (integer)
控制记录临时文件名和尺寸。临时文件可以被创建用来排序、哈希和存储临时查询结果。如果启用这个设置,当每一个临时文件被删除时都会产生一个日志项。 一个零值记录所有临时文件信息,而正值只记录尺寸大于或等于指定数据量的文件。如果指定值时没有单位,则以千字节为单位。默认设置为 -1,它禁用这种记录。只有管理员用户可以更改这个设置。
log_timezone (string)
设置在服务器日志中写入的时间戳的时区。和TimeZone不同,这个值是集簇范围的,因此所有会话将报告一致的时间戳。内建默认值是GMT,但是通常会被在postgresql.conf中覆盖。initdb将安装一个对应于其系统环境的设置。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
使用CVS格式的日志输出
在log_destination列表中包括csvlog提供了一种便捷方式将日志文件导入到一个数据库表。这个选项发出逗号分隔值(CSV)格式的日志行,包括这些列:带毫秒的时间戳、用户名、数据库名、进程 ID、客户端主机:端口号、会话 ID、每个会话的行号、命令标签、会话开始时间、虚拟事务 ID、普通事务 ID、错误严重性、SQLSTATE 代码、错误消息、错误消息详情、提示、导致错误的内部查询(如果有)、错误位置所在的字符计数、错误上下文、导致错误的用户查询(如果有且被log_min_error_statement启用)、 错误位置所在的字符计数、在瀚高数据库源代码中错误的位置(如果log_error_verbosity被设置为verbose)以及应用名。 下面是一个定义用来存储 CSV 格式日志输出的样表:
CREATE TABLE postgres_log
(
log_time timestamp(3) with time zone,
user_name text,
database_name text,
process_id integer,
connection_from text,
session_id text,
session_line_num bigint,
command_tag text,
session_start_time timestamp with time zone,
virtual_transaction_id text,
transaction_id bigint,
error_severity text,
sql_state_code text,
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
PRIMARY KEY (session_id, session_line_num)
);
使用COPY FROM命令将一个日志文件导入到这个表中:
COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;
你可以做一些事情来简化导入 CSV 日志文件:
1. 设置log_filename和log_rotation_age为你的日志文件提供一种一致的、可预测的命名空间。这让你预测文件名会是怎样以及知道什么时候一个个体日志文件完成并且因此准备好被导入。
2. 将log_rotation_size设置为 0 来禁用基于尺寸的日志轮转,因为它使得日志文件名难以预测。
3. 将log_truncate_on_rotation设置为on,这样在同一个文件中旧日志数据不会与新数据混杂。
4. 上述表定义包括一个主键声明。这有助于避免意外地两次导入相同的信息。COPY命令一次提交所有它导入的数据,因此任何错误将导致整个导入失败。如果你导入一个部分完成的日志文件并且稍后当它完全完成后再次导入,主键违背将导致导入失败。请等到日志完成且被关闭之后再导入。这个过程也可以避免意外地导入部分完成的行,这种行也将导致COPY失败。
进程标题
这些设置控制服务器进程的进程标题如何被修改。进程标题通常可以用ps来查看。
cluster_name (string)
为不同目的设置标识这个数据库集群(实例)的名称。此集群名称出现在该集群中所有服务器进程的进程标题中。此外,它还是备用连接的默认应用名称。(参见synchronous_standby_names.)这个名称可以是任何长度不超过NAMEDATALEN个字符(在标准编译中是 64字符)的任何字符串。只有可打印的 ASCII 字符能被用在cluster_name值中。其他字符将被替换为问号(?)。如果这个参数被设置为空字符串''(也是默认值),将不会显示名称。这个参数只能在服务器启动时设置。
update_process_title (boolean)
启用进程标题更新,每次服务器接收到一个新的 SQL 命令时都更新进程标题。在大部分平台上这个设置默认为on。
运行时统计数据
查询和索引统计收集器
这些参数控制服务器范围的统计数据收集特性。当统计收集被启用时,被产生的数据可以通过pg_stat和pg_statio系统视图族访问。
track_activities (boolean)
启用对每个会话的当前执行命令的信息收集,还有命令开始执行的时间。这个参数默认为打开。注意即使被启用,这些信息也不是对所有用户可见,只有管理员用户和拥有报告信息的会话的用户可见,因此它不会表现为一个安全风险。只有管理员用户可以更改这个设置。
track_activity_query_size (integer)
为每个活动会话指定存储当前执行命令的文本所保留的内存量,它们被用 于pg_stat_activity.query域。如果指定值时没有单位,则以字节为单位。默认值是1024字节。这个参数只能在服务器启动时被设置。
track_counts (boolean)
启用在数据库活动上的统计收集。这个参数默认为打开,因为自动清理守护进程需要被收集的信息。只有管理员用户可以更改这个设置。
track_io_timing (boolean)
启用对系统 I/O 调用的计时。这个参数默认为关闭,因为它将重复地向操作系统查询当前时间,这会在某些平台上导致显著的负荷。你可以使用pg_test_timing工具来度量你的系统中计时的开销。I/O 计时信息被显示在pg_stat_database中、当BUFFERS选项被使用时的EXPLAIN输出中以及pg_stat_statements中。只有管理员用户可以更改这个设置。
track_functions (enum)
启用跟踪函数调用计数和用时。指定pl只跟踪过程语言函数,指定all还会跟踪 SQL 和 C 语言函数。默认值是none,它禁用函数统计跟踪。只有管理员用户可以更改这个设置。
| 注意: |
|---|
| 简单到足以被”内联”到调用查询中的 SQL 语言函数不会被跟踪,而不管这个设置。 |
stats_temp_directory (string)
设置存储临时统计数据的目录。这可以是一个相对于数据目录的路径或一个绝对路径。默认值是pg_stat_tmp。在一个基于 RAM 的文件系统上指明这个参数将降低物理 I/O 需求,并且提高性能。这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
统计监控
log_statement_stats (boolean)
log_parser_stats (boolean)
log_planner_stats (boolean)
log_executor_stats (boolean)
对每个查询,向服务器日志里输出相应模块的性能统计。这是一种粗糙的分析工具。类似于 Unix 的getrusage()系统功能。log_statement_stats报告总的语句统计,而其它的报告针每个模块的统计。log_statement_stats不能和 其它任何针对每个模块统计的选项一起启用。所有这些选项都是默认禁用的。只有管理员用户可以更改这个设置。
自动清理
这些设置控制autovacuum特性的行为。注意很多这些设置可以被针对每个表的设置所覆盖,请见存储参数。
autovacuum (boolean)
控制服务器是否运行自动清理启动器后台进程。默认为开启,不过要自动清理正常工作还需要启用track_counts。该参数只能在postgresql.conf文件或服务器命令行中设置,不过,通过更改表存储参数可以为表禁用自动清理。
注意即使该参数被禁用,系统也会在需要防止事务ID回卷时发起清理进程。
log_autovacuum_min_duration (integer)
如果自动清理运行至少该值所指定的时间量,被自动清理执行的每一个动作都会被日志记录。将该参数设置为0会记录所有的自动清理动作。-1(默认值)将禁用对自动清理动作的记录。如果指定值时没有单位,则以毫秒为单位。 例如,如果你将它设置为250ms,则所有运行250ms或更长时间的 自动清理和分析将被记录。此外,当该参数被设置为除-1外的任何值时,如果一个自动清理动作由于一个锁冲突或者被并发删除的关系而被跳过,将会为此记录一个消息。开启这个参数对于追踪自动清理活动非常有用。这个参数只能在 postgresql.conf文件或者服务器命令行中设置。但是可以通过更改表的存储 参数为个别表覆盖这个设置。
autovacuum_max_workers (integer)
指定能同时运行的自动清理进程(除了自动清理启动器之外)的最大数量。默认值为3。该参数只能在服务器启动时设置。
autovacuum_naptime (integer)
指定自动清理在任意给定数据库上运行的最小延迟。在每一轮中后台进程检查数据库并根据需要为数据库中的表发出VACUUM和ANALYZE命令。 如果指定值时没有单位,则以秒为单位。默认值为1分钟(1min)。该参数只能在postgresql.conf文件或在服务器命令行上设置。
autovacuum_vacuum_threshold (integer)
指定能在一个表上触发VACUUM的被插入、被更新或被删除元组的最小数量。默认值为50个元组。该参数只能在postgresql.conf文件或在服务器命令中设置。但是对个别表可以通过修改表存储参数来覆盖该设置。 autovacuum_analyze_threshold (integer)
指定能在一个表上触发ANALYZE的被插入、被更新或被删除元组的最小数量。默认值为50 个元组。该参数只能在postgresql.conf文件或在服务器命令中设置。但是对个别表可以通过修改表存储参数来覆盖该设置。
autovacuum_vacuum_scale_factor (floating point)
指定一个表尺寸的分数,在决定是否触发VACUUM时将它加到autovacuum_vacuum_threshold上。默认值为0.2(表尺寸的20%)。该参数只能在postgresql.conf文件或在服务器命令中设置。但是对个别表可以通过修改表存储参数来覆盖该设置。
autovacuum_analyze_scale_factor (floating point)
指定一个表尺寸的分数,在决定是否触发ANALYZE时将它加到autovacuum_analyze_threshold上。默认值为0.1(表尺寸的10%)。该参数只能在postgresql.conf文件或在服务器命令中设置。但是对个别表可以通过修改表存储参数来覆盖该设置。
autovacuum_freeze_max_age (integer)
指定在一个VACUUM操作被强制执行来防止表中事务ID回卷之前,一个表的pg_class.relfrozenxid域能保持的最大年龄(事务的)。注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。
清理也允许从pg_xact子目录中移除旧文件,这也是为什么默认值被设置为较低的2亿事务。该参数只能在服务器启动时设置,但是对于个别表可以通过修改表存储参数来降低该设置。
autovacuum_multixact_freeze_max_age (integer)
指定在一个VACUUM操作被强制执行来防止表中多事务ID回卷之前,一个表的pg_class.relminmxid域能保持的最大年龄(多事务的)。注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。
清理多事务也允许从pg_multixact/members和pg_multixact/offsets子目录中移除旧文件,这也是为什么默认值被设置为较低的400万多事务。该参数只能在服务器启动时设置,但是对于个别表可以通过修改表存储参数来降低该设置。
autovacuum_vacuum_cost_delay (floating point)
指定用于自动VACUUM操作中的代价延迟值。如果指定-1(默认值),则使用vacuum_cost_delay值。 如果指定值时没有单位,则以毫秒为单位。默认值为2毫秒。该参数只能在postgresql.conf文件或在服务器命令中设置。但是对个别表可以通过修改表存储参数来覆盖该设置。
autovacuum_vacuum_cost_limit (integer)
指定用于自动VACUUM操作中的代价限制值。如果指定-1(默认值),则使用vacuum_cost_limit值。注意该值被按比例地分配到运行中的自动清理工作者上(如果有多个),因此每一个工作者的限制值之和不会超过这个变量中的值。该参数只能在postgresql.conf文件或在服务器命令中设置。但是对个别表可以通过修改表存储参数来覆盖该设置。
客户端连接默认值
语句行为
client_min_messages (enum)
控制被发送给客户端的消息级别。有效值是DEBUG5、 DEBUG4、DEBUG3、DEBUG2、 DEBUG1、LOG、NOTICE、WARNING、ERROR。 每个级别都包括其后的所有级别。级别越靠后,被发送的消息越少。默认值是NOTICE。 注意LOG在这里有与log_min_messages中不同的排名。
INFO 级别的消息总是被发送到客户端。
search_path (string)
这个变量指定当一个对象(表、数据类型、函数等)被用一个无模式限定的简单名称引用时,用于进行搜索该对象的模式顺序。当在不同模式中有同名对象时,将使用第一个在搜索路径中被找到的对象。一个不属于搜索路径中任何一个模式的对象只能通过用限定名(带点号)指定包含它的模式来引用。
search_path的值必需是一个逗号分隔的模式名列表。任何不是一个已有模式的名称,或者是一个用户不具有USAGE权限的模式,将被安静地忽略。
如果列表项之一是特殊名$user,则具有SESSION_USER返回的名字的模式将取代它(如果有这样一个模式并且该用户有该模式的USAGE权限;如果没有,$user会被忽略)。
系统目录模式pg_catalog总是被搜索,不管它是否在搜索路径中被提及。如果它在路径中被提及,那么它将被按照路径指定的顺序搜索。如果pg_catalog不在路径中,则它将在任何路径项之前被搜索。
同样,当前会话的临时表模式pg_temp_nnn也总是被搜索(如果存在)。它可以在路径中通过使用别名pg_temp显式列出。如果在路径中没有列出,那么会首先对它进行搜索(甚至是在pg_catalog之前)。然而,临时模式只被用来搜索关系(表、视图、序列等)和数据类型名。它从不用于搜索函数或操作符名。
当对象创建时没有指定一个特定目标模式,它们将被放置在search_path中第一个合法模式中。如果搜索路径为空将报告一个错误。
这个参数的缺省值是"$user", public。这种设置支持一个数据库(其中没有用户拥有私有模式,并且所有人共享使用public)、每个用户私有模式及其组合的共享使用。其它效果可以通过全局或者针对每个用户修改默认搜索路径设置获得。
更多有关方案处理的信息。特别地,只有当数据库只有一个用户或者 有少数的相互信任的用户时,默认配置是合适的。搜索路径的当前有效值可以通过SQL函数current_schemas检查。它和检查search_path的值不太一样,因为current_schemas显示出现在search_path中的项如何被解析。
row_security (boolean)
这个变量控制是否以抛出一个错误来代替应用一条行安全性策略。在设置为on时,策略正常应用。在设置为off时,只要有至少一条策略被应用则查询就会失败。默认为on。受限的行可见性会导致不正确的结果时,可将其改成off。例如,pg_dump默认会做这种更改。这个变量对能绕过每一条行安全性策略的角色(即管理员用户和具有BYPASSRLS)属性的角色没有效果。
default_table_access_method (string)
如果 CREATE命令没有显式指定访问方法,则此参数指定在创建表或物化视图时使用的默认表访问方法,或者在使用SELECT ... INTO 时,不允许指定表访问方法。默认为heap。
default_tablespace (string)
这个变量指定当一个CREATE命令没有显式指定一个表空间时,创建对象(表和索引)的默认表空间。它还决定了指导未来分区的分区关系的表空间。
该值要么是一个表空间的名字,要么是一个指定使用当前数据库默认表空间的空字符串。如果该值和任何现有表空间的名字都不匹配,瀚高数据库将自动使用当前数据库的默认表空间。如果指定了一个非默认的表空间,用户必须对它有CREATE权限,否则创建企图将失败。
这个变量不被用于临时表,对临时表会使用temp_tablespaces。
当创建数据库时也会使用这个变量。默认情况下,一个新数据库会从它的模板数据库继承其表空间设置。
有关表空间的更多的信息。
temp_tablespaces (string)
这个变量指定当一个CREATE命令没有显式指定一个表空间时,创建临时对象(临时表和临时表上的索引)的默认表空间。用于排序大型数据集的临时文件也被创建在这些表空间中。
该值是一个表空间名字的列表。当列表中有多于一个名称时,每次一个临时对象被创建时瀚高数据库随机选择列表中的一个成员。例外是在一个事务中,连续创建的临时对象被放置在里表中的连续表空间中。如果列表被选中元素是一个空字符串,瀚高数据库将自动使用当前数据库的默认表空间。
当temp_tablespaces被交互式地设置时,指定一个不存在的表空间是一种错误,类似于为用户指定一个不具有CREATE权限的表空间。不过,当使用一个之前设置的值时,不存在的表空间会被忽略,就像用户缺少CREATE权限的表空间一样。特殊地,使用一个在postgresql.conf中设置的值时,这条规则起效。
默认值是一个空字符串,它使得所有临时对象被创建在当前数据库的默认表空间中。参阅default_tablespace。
check_function_bodies (boolean)
这个参数通常为打开 。当设置为off时,它禁用CREATE FUNCTION期间对函数体字符串的验证。禁用验证避免了验证处理的副作用并且避免了如向前引用导致的伪肯定。在代表其他用户载入函数之前设置这个参数为off;pg_dump会自动这样做。
default_transaction_isolation (enum)
每个 SQL 事务都有一个隔离级别,可以是”读未提交”、”读已提交”、”可重复读”或者”可序列化”。这个参数控制每个新事务的默认隔离级别。默认是”读已提交”。
一个只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的默认只读状态 。默认是off(读/写)。更多信息请参考SET TRANSACTION。
default_transaction_deferrable (boolean)
当运行在可序列化隔离级别时,一个可延迟只读 SQL 事务可以在它被允许继续之前延迟一段时间。但是,一旦它开始执行就不会产生任何用来保证可序列化性的负荷;因此序列化代码将没有任何理由因为并发更新而强制它中断,使得这个选项适合于长时间运行的只读事务。
这个参数控制每个新事务的默认可延迟状态。目前它对读写事务或者那些操作在低于可序列化隔离级别上的事务无效。默认值是off。详情请参阅SET TRANSACTION。
session_replication_role (enum)
为当前会话控制复制相关的触发器和规则的触发。需要管理员用户权限才能设置这个变量,并且会导致丢弃任何之前缓存下来的查询计划。可能的值有origin(默认)、replica和local。
这个设置的预期用途是由逻辑复制系统在应用所复制的更改时将它设置为replica。其效果将是触发器和规则(没有对其默认配置做修改)在复制机上将不会被触发。更多信息请参考ALTER TABLE的子句ENABLE TRIGGER以及ENABLE RULE。
瀚高数据库在内部会把设置origin和local同样对待。第三方复制系统可能会把这两个值用于其内部目的,例如把local用来标出一个不应复制其更改的会话。
因为外键被实现为触发器,将这个参数设置为replica还会禁用所有的外键检查,如果使用不当可能会让数据处于一种不一致的状态。
statement_timeout (integer)
中止任何使用了超过指定时间量的语句。如果log_min_error_statement被设置为ERROR或更低,语句如果超时也会被记录。如果指定值时没有单位,则以毫秒为单位。一个零值(默认)将禁用超时。
超时从命令到达服务器的时间开始计算,一直到它被服务器完成为止。在扩展查询协议中,当任何与查询相关的消息(解析、绑定、执行、描述)到达时,超时就开始运行,并且可以通过执行完成或同步消息来取消超时。
我们不推荐在postgresql.conf中设置statement_timeout,因为它会影响所有会话。
lock_timeout (integer)
如果任何语句在试图获取表、索引、行或其他数据库对象上的锁时等到超过指定的时间量,该语句将被中止。 该时间限制独立地应用于每一次锁获取尝试。该限制会应用到显式锁定请求(如LOCK TABLE或不带NOWAIT的SELECT FOR UPDATE)和隐式获得的锁。如果指定值时没有单位,则以毫秒为单位。一个零值(默认)将禁用超时。与statement_timeout不同,这个超时只在等待锁时发生。注意如果statement_timeout为非零,设置lock_timeout为相同或更大的值没有意义,因为事务超时将总是第一个被触发。如果log_min_error_statement 被设置为ERROR 或更低,超时的语句将被记录。
我们不推荐在postgresql.conf中设置lock_timeout,因为它会影响所有会话。
idle_in_transaction_session_timeout (integer)
终止任何已经闲置超过这个参数所指定时间量的打开事务的会话。这使得该会话所持有的任何锁被释放,并且其所持有的连接槽可以被重用,它也允许只对这个事务可见的元组被清理。
如果指定值时没有单位,则以毫秒为单位。0值(默认值)禁用超时。
vacuum_freeze_table_age (integer)
当表的pg_class.relfrozenxid域达到该设置指定的年龄时,VACUUM会执行一次激进的扫描。激进的扫描与常规VACUUM的不同在于它会访问每一个可能包含未冻结 XID 或者 MXID 的页面,而不只是那些可能包含死亡元组的页面。默认值是 1.5 亿个事务。尽管用户可以把这个值设置为从 0 到 20 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。
vacuum_freeze_min_age (integer)
指定VACUUM在扫描表时用来决定是否冻结行版本的切断年龄(以事务计)。默认值是 5 千万个事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的一半,这样在强制执行的自动清理之间不会有过短的时间间隔。
vacuum_multixact_freeze_table_age (integer)
如果表的pg_class.relminmxid域超过了这个设置指定的年龄,VACUUM会执行一次激进的扫描。激进的扫描与常规VACUUM的区别在于它会访问每一个可能包含未冻结 XID 或者 MXID 的页面,而不是只扫描那些可能包含死亡元组的页面。默认值是 1.5 亿个组合事务。尽管用户可以把这个值设置为从 0 到20 亿,VACUUM会悄悄地将有效值设置为autovacuum_multixact_freeze_ max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。
vacuum_multixact_freeze_min_age (integer)
指定VACUUM在扫描表时用来决定是否把组合事务 ID 替换为一个更新的事务 ID 或组合事务 ID 的切断年龄(以组合事务计)。默认值是 5 千万个组合事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_multixact_freeze_max_age值的一 半,这样在强制执行的自动清理之间不会有过短的时间间隔。
vacuum_cleanup_index_scale_factor (floating point)
指定在以前的统计信息收集过程中计数到的堆元组总数的一个分数,插入不超过这一数量所代表的元组不会导致VACUUM清理阶段的索引扫描。这个设置当前仅适用于B-树索引。
如果没有元组从堆中删除,则当至少满足下列条件之一时,在VACUUM清理阶段仍会扫描B-树索引:索引统计信息过时或者索引中包含在清理时可回收的已删除页。如果新近插入的元组数占上次统计信息收集时检测到的堆元组总数的比例超过vacuum_cleanup_index_scale_factor,则认为索引信息已经过时。堆元组的总数被存放在索引的元页中。注意,直到VACUUM找不到死亡元组之前,元页中都不包括这个数据。因此只有在第二次以及之后的VACUUM周期检测不到死亡元组时,清理阶段的B-树索引扫描才能被跳过。
该值的取值范围可以是从0到10000000000。当vacuum_cleanup_index_scale_factor被设置为0时,在VACUUM清理期间不会跳过索引扫描。默认值是0.1。
bytea_output (enum)
设置bytea类型值的输出格式。有效值是hex(默认)和 escape(传统的格式)。不管这个设置的值如何,bytea类型总是接受这两种格式的输入。
xmlbinary (enum)
设置二进制值如何被编码为 XML。例如,这适用于通过xmlelement函数或xmlforest函数将bytea值转换到 XML 值。可能的值有base64和hex,它们都是用 XML 模式标准定义的。默认值是base64。
这里的实际选择都是根据爱好做出的,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码将比 base64 编码更大。
xmloption (enum)
当在XML和字符串值之间进行转换时,无论设置DOCUMENT或 CONTENT都是隐式的。可参阅 Section 8.13。有效值是DOCUMENT和CONTENT。缺省值是CONTENT。当在 XML 和字符串值之间进行转换时,设置DOCUMENT或CONTENT都是隐式的。有效值是DOCUMENT和CONTENT。默认值是CONTENT。
根据 SQL 标准,设置这个选项的命令是:SET XML OPTION { DOCUMENT | CONTENT };
这种语法在瀚高数据库也可用。
gin_pending_list_limit (integer)
设置fastupdate被启用时可以使用的 GIN索引的待处理列表的最大尺寸。 如果该列表增长到超过这个最大尺寸,会通过批量将其中的项移入索引的主 GIN 数据结构来清理列表。如果指定值时没有单位,则以千字节为单位。默认值是四兆字节(4MB)。可以通过更改索引的存储参数来为个别 GIN 索引覆盖这个设置。
区域和格式化
DateStyle (string)
设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因,这个变量包含两个独立的部分:输出格式声明(ISO、Postgres、SQL或German)、输入/输出的年/月/日顺序(DMY、MDY或YMD)。这些可以被独立设置或者一起设置。关键字Euro和European是DMY的同义词;关键字US、NonEuro和NonEuropean是MDY的同义词。内建默认值是ISO, MDY,但是initdb将用对应于选中的lc_time区域行为的设置初始化配置文件。
IntervalStyle (enum)
设置间隔值的显示格式。值sql_standard将产生匹配 SQL 标准间隔文本的输出。当DateStyle参数被设置为ISO时,值postgres(默认)将产生匹配瀚高数据库之前版本的输出。当DateStyle参数被设置为非ISO输出时,值postgres_verbose会产生匹配瀚高数据库之前版本的输出。值iso_8601会产生匹配在 ISO 8601 的 4.4.3.2 节中定义的”带标志符格式”的时间间隔的输出。
IntervalStyle参数也可以影响对有歧义的间隔输入的解释。TimeZone (string) 设置用于显示和解释时间戳的时区。内建默认值是GMT,但是它通常会在postgresql.conf中被覆盖;initdb将安装一个对应于其系统环境的设置。
timezone_abbreviations (string)
设置服务器接受的日期时间输入中使用的时区缩写集合。默认值为'Default', 这个集合在全世界大多数地方都能工作。也还有'Australia'和'India',以及可能为一种特定安装定义的其他集合。
extra_float_digits (integer)
这个参数调整用于文本输出浮点值的位数,包括float4,float8以及几何数据类型。
如果值为1(默认值)或更高,浮点值被输出为最短-精度格式;实际生成的位数只取决于输出的值,而不取决于此参数的值。 float8 值最多需要 17 位数字,float4值最多需要9位数字。这种格式既快速又精确,在正确读取时精确地保留了原始的二进制浮点值。为了历史兼容性,允许的值最大为3。
如果值为零或负,则输出四舍五入为给定的十进制精度。 使用的精度是根据此参数的值减小的类型((FLT_DIG或DBL_DIG,视情况而定)的标准位数。 (例如,指定 -1 将导致float4 值输出四舍五入为 5 位有效数字,而float8值四舍五入为 14 位。) 此格式较慢,不会保留二进制浮点值的所有位,但可能令人更易于阅读。
client_encoding (string)
设置客户端编码(字符集)。默认使用数据库编码。
lc_messages (string)
设置消息显示的语言。可接受的值是系统相关的。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
在一些系统上,这个区域分类并不存在。仍然可以设置这个变量,只是不会有任何效果。同样,所期望语言的翻译消息也可能不存在。在这种情况下,你将仍然继续看到英文消息。
只有管理员用户可以改变这个设置。因为它同时影响发送到服务器日志和客户端的消息。一个不正确的值可能会降低服务器日志的可读性。
lc_monetary (string)
设置用于格式化货币量的区域,例如用to_char函数族。可接受的值是系统相关的。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
lc_numeric (string)
设置用于格式化数字的区域,例如用to_char函数族。可接受的值是系统相关的。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
lc_time (string)
设置用于格式化日期和时间的区域,例如用to_char函数族。可接受的值是系统相关的。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。
default_text_search_config (string)
选择被那些没有显式参数指定配置的文本搜索函数变体使用的文本搜索配置。内建默认值是pg_catalog.simple,但是如果能够标识一个匹配区域的配置,initdb将用对应于选中的lc_ctype区域的设置初始化配置文件。
共享库载入
为了载入附加的功能或者达到提高性能的目的,可用多个设置来预先载入共享库到服务器中。例如'$libdir/mylib'设置可能会导致mylib.so(或者某些平台上的mylib.sl)从安装的标准库目录被预装载。这些设置之间的区别在于生效的时间以及改变它们所需的特权。
可以用这个方法预装载瀚高数据库的过程语言库,通常是使用'$libdir/plXXX'语法,其中的XXX是pgsql、perl、tcl或python。
只有特别为与瀚高数据库一起使用设计的共享库才能以这种方式载入。每一个瀚高数据库支持的库都有一个”魔法块”,它会被检查以保证兼容性。由于这个原因,非瀚高数据库无法以这种方式被载入。你可能可以使用操作系统的工具(如LD_PRELOAD)载入它。
总之,请参考特定模块的文档来用推荐的方法载入它。
local_preload_libraries (string)
这个变量指定一个或者多个要在连接开始时预载入的共享库。它包含一个由逗号分隔的库名列表,其中每个名称都会按LOAD命令的方式解析。项之间的空格会被忽略,如果需要在库名中包含空格或者逗号,请把库名放在双引号内。这个参数值只在连接开始时生效。后续的更改不会有任何效果。如果一个指定的 库没有找到,连接尝试将会失败。
任何用户都能设置这个选项。正因为如此,能被这样载入的库被严格限制为出现于安装的标准库目录中plugins子目录下的共享库(保证只有”安全的”库被安装到这里是数据库管理员的责任)。local_preload_libraries中的项可以显式指定这个目录,例如$libdir/plugins/mylib,或者只是指定库的名称 — mylib 和 $libdir/plugins/mylib的效果是相同的。
这个特性的目的是允许非特权用户在特定的会话中载入正在调试的或者性能度量库,而无需一个显式的LOAD命令。为了这个目的,通常通过使用客 户端的PGOPTIONS环境变量或者 ALTER ROLE SET来设置这个参数。
不过,除非一个模块被特别设计成由非管理员用户以这种方式使用,通常不推荐使用这个设置。应该看看 session_preload_libraries。
session_preload_libraries (string)
这个变量指定一个或者多个要在连接开始时预载入的共享库。只有管理员用户更够更改这个设置。它包含一个由逗号分隔的库名列表,其中每个名称都会按LOAD命令的方式解析。项之间的空格会被忽略,如果需要在库名中包含空格或者逗号,请把库名放在双引号内。这个参数只在连接开始时起效。后续的改变没有效果。如果指定的库没有找到,连接尝试将会失败。只有管理员用户能够更改这个设置。
这个特性的意图是允许在特定会话中载入调试用的或者测量性能的库,而不需要显式的给出一个LOAD命令。例如,通过用ALTER ROLE SET设置这个参数可以为一个给定用户名下的所有会话启用auto_explain。还有,无需重启服务器就能更改这个参数(但是只有新会话启动时才会生效),这样可以以这种方式更容易地增加新模块,即便它们会应用到所有会话。
和shared_preload_libraries不同,相对于在库被第一次使用时载入它,在会话开始时载入库并没有什么性能优势。不过,当使用连接池时这样做还是有一些 优势。
shared_preload_libraries (string)
这个变量指定一个或者多个要在服务器启动时预载入的共享库。它包含一个由逗号分隔的库名列表,其中每个名称都会按LOAD命令的方式解析。项之间的空格会被忽略,如果需要在库名中包含空格或者逗号,请把库名放在双引号内。这个参数只能在服务器启动时设置。如果指定的库没有找到,服务器将无法启动。
有些库需要执行只能在postmaster启动时发生的特定操作,例如分配共享内存、保留轻量级锁或者启动后台工作者。这些库必须通过这个参数在服务器启动时载入。每个库的详情请见文档。
其他库也能被预载入。通过预载入一个共享库,当该库被第一次使用时就可以避免库的启动时间。不过,启动每个新服务器进程的时间可能会略有增加,即使该进程从不使用该库。因此,推荐只把这个参数用于那些要在大多数会话中使用的库上。还有,改变这个参数要求重启服务器,因此对于短期的调试任务来说这不是好的选择,应该转用session_preload_libraries。
jit_provider (string)
这个变量是要被使用的JIT提供者库的名称。默认是llvmjit。这个参数只能在服务器启动时设置。
如果这个变量被设置为一个不存在的库,JIT将不可用,但是也不会发生错误。这种特性允许在主瀚高数据库包之外单独安装JIT支持。
其他默认值
dynamic_library_path (string)
如果需要打开一个可以动态装载的模块并且在CREATE FUNCTION或LOAD命令中指定的文件名没有目录部分(即名字中不包含斜线),那么系统将搜索这个路径以查找所需的文件。
dynamic_library_path的值必须是一个冒号分隔的绝对目录路径的列表。如果一个列表元素以特殊字符串开始,$libdir会被替换为瀚高数据库包中已编译好的库目录。这里是瀚高数据库发布提供的模块被安装的位置(使用pg_config --pkglibdir来找到这个目录的名字)。例如:
dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:
$libdir'
这个参数可以在运行时由管理员用户修改,但是这样修改的设置只能保持到这个客户端连接的结尾,因此这个方法应该保留给开发目的。 我们建议在postgresql.conf配置文件中设置这个参数。
gin_fuzzy_search_limit (integer)
GIN 索引返回的集合尺寸的软上限。
锁管理
deadlock_timeout (integer)
这是进行死锁检测之前在一个锁上等待的时间量。死锁检测相对昂贵,因此服务器不会在每次等待锁时都运行这个它。我们乐观地假设在生产应用中死锁是不常出现的,并且只在开始检测死锁之前等待一会儿。增加这个值就减少了浪费在无用的死锁检测上的时间,但是减慢了报告真正死锁错误的速度。如果指定值时没有单位,则以毫秒为单位。默认是 1 秒(1s),这可能是实际中你想要的最小值。在一个高负载的服务器上,你可能需要增大它。这个值的理想设置应该超过你通常的事务时间,这样就可以减少在锁释放之前就开始死锁检查的机会。只有管理员用户可以更改这个设置。
当log_lock_waits被设置时,这个参数还可以决定发出关于锁等待的日志之前等待的时间量。如果你想调查锁延迟,你可能希望设置一个比正常的deadlock_timeout小的值。
max_locks_per_transaction (integer)
共享锁表跟踪在max_locks_per_transaction * (max_connections +
max_prepared_transactions) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这不是能被锁住的行数,那个值是没有限制的。默认值 64 已经被历史证明是足够的,但是如果你有需要在一个事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。这个参数只能在服务器启动时设置。
当运行一个后备服务器时,你必须设置这个参数为大于等于主服务器上的值。否则,后备服务器上将不允许查询。
max_pred_locks_per_transaction (integer)
共享谓词锁表跟踪在max_pred_locks_per_transaction * (max_connections + max_prepared_transactions) 个对象(如表)上的锁。因此,在任何一个时刻,只有不超过这么多个可区分对象能够被锁住。这个参数控制为每个事务分配的对象锁的平均数量。个体事务可以锁住更多对象,数量可以和锁表中能容纳的所有事务的锁一样多。这不是能被锁住的行数,那个值是没有限制的。默认值 64 已经在测试中被证明通常是足够的,但是如果你有需要在一个可序列化事务中使用很多不同表的查询(例如查询一个有很多子表的父表),你可能需要提高这个值。这个参数只能在服务器启动时设置。
max_pred_locks_per_relation (integer)
这个参数控制在谓词锁被提升为覆盖整个关系之前,该谓词锁能够在单个关系上锁住多少页面或元组。大于等于零的值表示一种绝对限制,而负值表示
用max_pred_locks_per_transaction除以这个设置的绝对值。默认值为-2,它将保持以往版本的瀚高数据库中的行为。这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
max_pred_locks_per_page (integer)
这个参数控制在谓词锁被提升为覆盖整个页面之前,该谓词锁能在单一页面上锁住多少行。默认值是2。
这个参数只能在postgresql.conf文件中或者服务器命令行上设置。
错误处理
exit_on_error (boolean)
如果为开(on),任何错误将中止当前会话。默认情况下,这个值被设置为关(off),这样只有 FATAL 错误(致命)将中止会话。
restart_after_crash (boolean)
当被设置为开(on),瀚高数据库将在一次后端崩溃后自动重新初始化。 让这个值设置为开(on)通常是将数据库可用性最大化的最佳方法。但是在某些环境中,例如瀚高数据库被集群软件调用时,禁用重启可能很有用,这样集群软件可以得到控制并且采取它认为适当的行动。
data_sync_retry (boolean)
如果设置为关(off),瀚高数据库在将修改的数据文件刷新到文件系统失败时,将引发 PANIC级错误。这样会导致数据库服务器崩溃。这个参数只能在服务器启动时被设置。在某些操作系统上,回写失败后,内核页面缓存中的数据状态未知。在某些情况下,它可能已被完全遗忘,因此重试不安全;第二次尝试可能报告为成功,而事实上数据已丢失。在此类情形下,避免数据丢失的唯一方法是在报告任何故障后从WAL中恢复,最好是在调查了故障的根本原因并更换了任何有故障的硬件之后。
如果设置为开(on),瀚高数据库将报告错误,但会继续运行,以便可以在以后的检查点中重试数据刷新操作。仅在调查操作系统假如回写失败时对缓冲数据的处理方式的情况下,才将其设置为开(on)。