16.4. 运行时配置

有一堆配置参数可以影响数据库系统的行为。 我们在这里描述一下如何设置它们,然后在下一章我们将逐个讨论它们。

所有参数名都是大小写不敏感的。每个参数都可以接受四种类型之一:布尔, 整数,浮点数和字符串。布尔值可以是 ONOFFTRUEFALSEYESNO10 (都是大小写无关)或这些东西的任意清晰无歧义的前缀。

设置这些选项的一个方法是编辑文件 postgresql.conf, 这个文件通常在数据目录里。(initdb 在那里安装一个缺省的拷贝。) 比如,下面是一个该文件的例子:

# 这是一个注释
log_connections = yes
log_destination = 'syslog'
search_path = '$user, public'

象你看到的那样,选项是每条一行。选项名和值之间的等号是可选的。 空白和空行被忽略。井号(#)用做任何地方引入注释。 非简单标识符或者数字必须用单引号包围。

每次postmaster收到SIGHUP(最简单的发送方法就是使用 pg_ctl reload)。 信号后都会重新读取这个配置文件。 postmaster同时也将这个信号广播给所有正在运行的服务器进程,这样现有会话也能得到新的缺省。 另外,你可以只向一个服务器进程直接发送信号。 有些参数只能在服务器启动的时候设置;对这些条目中的任何进行修改都将忽略,直到下次服务器重启。

第二种设置这些配置参数的方法是把它们作为命令行参数传递给postmaster, 比如:

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

命令行选项覆盖任何与 postgresql.conf 冲突的选项。请注意,这意味着你不能通过编辑 postgresql.conf, 在运行时改变其数值,因此,虽然命令行方法很方便,但你在以后可能会付出灵活性的代价。

有时候,给某一个特定会话一个命令行参数也是很有用的。 可以在客户端使用环境变量 PGOPTIONS 来实现这个目的:

env PGOPTIONS='-c geqo=off' psql

(这个选项可以用于任何基于libpq的客户端应用,不光是 psql。) 请注意,这个变量对那些需要在服务器启动后固定的选项或者必须在 postgresql.conf 里声明的选项是无效的。

并且,我们可以给一个用户或者一个数据库赋予一套选项设置。 在一个会话开始的时候,装载所涉及到的用户和数据库的缺省设置。 命令 ALTER USERALTER DATABASE 分别用于配置这些设置。 每数据库的设置覆盖任何从 postmaster 命令行或者配置文件收到的设置, 然后接着又被每用户的设置覆盖;最后又会都被每会话的选项覆盖。

一些选项可以用 SET 在独立的 SQL 会话中修改, 方法是使用 SET 命令, 比如:

SET ENABLE_SEQSCAN TO OFF;

如果允许用 SET 设置,这种每数据库的设置覆盖任何来自 postmaster 命令行选项或者配置文件的设置。有些参数不能通过SET改变:比如, 如果这些选项不重启动PostgreSQL就无法合理控制其行为。 同样,有些参数是由超级用户通过 SETALTER 修改,而普通用户不能修改。

SHOW 命令允许检查所有参数的当前值。

我们也可以用虚表 pg_settings 来显示和更新当前会话的运行时参数。 (在 Section 41.35 里描述)。 它等效于 SHOWSET,但是用起来更方便,因为它可以和其它表连接起来使用, 或者用任意用户需要的选择条件来查询。

16.4.1. 文件位置

除了已经提到过的 postgresql.conf 文件之外, PostgreSQL 还使用另外两个手工编辑的配置文件, 它们控制客户端认证(它们的使用在 Chapter 19 里讨论)。 缺省时,所有三个配置文件都存放在数据库集群的数据目录里。 本节描述的选项允许配置文件放在别的地方。 (这么做可以简化管理,特别是如果配置文件独立放置,通常可以很容易保证它得到恰当的备份。)

data_directory (string)

声明为数据存储使用的目录。这个选项只能在服务器启动的时候设置。

config_file (string)

声明主服务器配置文件(通常叫做 postgresql.conf)。 这个选项只能在 postmaster 命令行上设置。

hba_file (string)

声明用于主机为基础的认证(HBA)配置文件的文件名。 (通常叫做 pg_hba.conf)。 这个选项只能在服务器启动的时候设置。

ident_file (string)

声明用于 ident (身份)认证的配置文件 (通常叫做pg_ident.conf)。 这个选项只能在服务器启动的时候设置。

external_pid_file (string)

声明服务器管理程序使用的一个附加的 postmaster 进程号(PID)文件的位置。 这个选项只能在服务器启动的时候设置。

在缺省安装里,不会明确设置这些参数。 取而代之的是用命令行参数 -D 或者环境变量 PGDATA 声明数据目录,而配置文件都放在数据目录里。

如果你想把配置文件放在别的地方,那么 postmaster 的命令行参数 -D 或者环境变量 PGDATA 必须指向包含配置文件的目录,而 postgresql.conf 里(或者命令行上)的 data_directory 选项必须设置为表示数据目录实际存放的地方。 请注意 data_directory 覆盖 -D 上的数据目录的设置, 但是不覆盖配置文件的目录。

如果你愿意,你可以使用选项 config_filehba_file 和/或 ident_file 分别声明配置文件的名字。 config_file 只能在 postmaster 命令行上设置, 但是其他的可以在主配置文件里设置。如果明确设置了所有三个选项和 data_directory, 那么我们必须声明 -D 或者 PGDATA

在设置任何这些选项的时候,一个相对路径将被解释为与 postmaster 启动的时候相对的路径。

16.4.2. 连接和认证

16.4.2.1. 连接设置

listen_addresses (string)

声明服务器监听客户端应用连接的 TCP/IP 地址。 数值是从一个逗号分隔的主机名和/或数字IP地址获取的。 特殊的条目 * 对应所有可用 IP 接口。 如果这个列表是空的,那么服务器不会监听任何 IP 接口,这种情况下, 只有 Unix 域套接字可以用于连接数据库。 缺省值是 localhost, 它只允许进行本地 "loopback" 连接。这个参数只能在服务器启动的时候设置。

port (integer)

服务器监听的 TCP 端口;缺省是 5432。请注意同一个端口号用于服务器监听的所有 IP 地址。 这个参数只能在服务器启动的时候设置。

max_connections (integer)

决定和数据库连接的并发连接数目的最大值。 缺省通常是 100,但是如果你的内核设置不支持这么大(在 initdb 的时候判断), 可能会比这个数少。这个参数只能在服务器启动的时候设置。

增大这个参数可能导致 PostgreSQL 要求更多的 System V 共享内存或者信号灯, 可能超过你的操作系统缺省配置的许可值。必要的话,参阅 Section 16.5.1 获取有关如何调节这个参数的信息。

superuser_reserved_connections (integer)

决定为 PostgreSQL 超级用户连接而保留的连接"槽位"。 一次最多可以同时激活 max_connections 个连接。 在活跃的并发连接到了 max_connections 减去 superuser_reserved_connections 的时候, 新的连接就只能由超级用户发起了。

缺省值是 2。这个值必须小于 max_connections 的值。 这个参数只能在服务器启动的时候设置。

unix_socket_directory (string)

声明服务器监听客户端应用连接来临的 Unix 域套接字的目录。 缺省通常是 /tmp,但是缺省值可以在制作的时候修改。 这个值只能在服务器启动的时候设置。

unix_socket_group (string)

设置 Unix 域套接字的组所有者。(套接字的所属用户总是启动服务器的用户。) 与选项 unix_socket_permissions 一起,就可以用于控制套接字类型的附加的访问控制。 缺省的时候,这是一个空字串,表示使用当前用户的缺省组。这个选项只能在服务器启动的时候设置。

unix_socket_permissions (integer)

设置 Unix 域套接字的访问权限。Unix 域套接字使用普通的 Unix 文件系统权限集。 这个选项值应该是数值的形式,也就是那种 Unix 域套接字调用 chmodumask 接受的形式。(要使用客户化的八进制格式,数字必须以0 (零)开头。)

缺省的权限是 0777,意思是任何人都可以连接。 合理的候选是 0770(只有用户和同组的人可以访问, 又见 unix_socket_group)和 0700 (只有用户)。(请注意,对于 Unix 域套接字,只有写权限有意义,设置或者撤销读和执行权限没有任何意义。)

这个访问控制机制与 Chapter 19 里描述的独立。

这个选项只能在服务器启动的时候设置。

rendezvous_name (string)

声明 Rendezvous 广播地址。缺省的时候,使用计算机名,声明是 ''。 如果编译时没有打开 Rendezvous 那么忽略这个参数。 这个选项只能在服务器启动的时候设置。

16.4.2.2. 安全和认证

authentication_timeout (integer)

完成客户端认证的最长时间,以秒计。如果一个客户端没有在这段时间里完成认证协议, 服务器将中断连接。这样就避免了出问题的客户端无限制地占据连接资源。 这个选项只能在服务器启动的时候设置或者在 postgresql.conf 里设置。 缺省是 60。

ssl (boolean)

打开 SSL 连接。请在使用这个选项之前阅读 Section 16.7。 缺省是关。这个参数只能在服务器启动的时候设置。

password_encryption (boolean)

CREATE USER 或者 ALTER USER 里声明一个口令, 而又没有写 ENCRYPTED 或者 UNENCRYPTED 的时候,这个选项决定口令是否要加密。 缺省是打开(加密口令)。

krb_server_keyfile (string)

设置 Kerberos 服务器键字文件的位置。参阅 Section 19.2.3 获取细节。

db_user_namespace (boolean)

这样就允许每个数据库的用户名。缺省是关闭的。

如果这是打开的,你应该像 username@dbname 这样创建用户。 在给一个正在连接的客户端传递 username 的时候,必须给用户名附加 @ 和数据库名字, 然后服务器查找该数据库相关的用户名字。请注意,如果你在 SQL 环境里创建包含 @ 的名字时, 你需要引起用户名。

打开这个选项之后,你还是能够创建普通的全局用户。 只要在客户端声明用户的时候附加一个 @ 即可。 在服务器查找这个用户名之前,这个 @ 会被剥除。

注意: 这个特性只是临时试验用途,直到找到一个完全的解决方案。 那个时候,这个选项将被删除。

16.4.3. 资源消耗

16.4.3.1. 内存

shared_buffers (integer)

设置数据库服务器将使用的共享内存缓冲区数量。缺省通常是 1000, 如果你的内核设置不支持这么大,那么可以少些(在 initdb 的时候决定)。 每个缓冲区大小的典型值是 8192 字节,除非你在编译的时候修改了 BLCKSZ 的值。这个数值必须大于 16, 并且至少是 max_connections 数值的两倍;不过,这个数值大一些通常可以改进性能。 对于生产安装,我们通常建议是几千。 这个选项只能在服务器启动的时候设置。

增大这个参数可能导致 PostgreSQL 要求更多 System V 的共享内存, 超出你的操作系统配置许可的范围。必要时请参阅 Section 16.5.1 获取如何调整这些参数的信息。

work_mem (integer)

声明内部排序操作和散列表在开始使用临时磁盘文件之前使用的内存数目。 数值是以千字节为单位的,缺省是 1024 千字节(1 MB)。 请注意对于复杂的查询,可能会同时并发运行好几个排序或者散列操作; 每个都会被批准使用这个参数声明的这么多内存,然后才会开始求助于临时文件。 同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是 work_mem 的好几倍。 在 ORDER BY,融合连接,以及 CREATE INDEX 里都要用到排序操作。 散列表在散列连接,散列为基础的聚集,以及散列为基础的 IN 子查询处理中都要用到。

maintenance_work_mem (integer)

声明在维护性操作中使用的最大的内存数,比如 VACUUMCREATE INDEX,和 ALTER TABLE ADD FOREIGN KEY 等。 数值是用千字节计的,缺省是 16384 千字节(16 MB)。因为在一个数据库会话里,任意时刻只有一个这样的操作可以执行, 并且一个数据库安装通常不会有太多这样的工作并发执行,把这个数值设置得比 work_mem 更大是安全的。 更大的设置可以改进清理和恢复数据库转储的速度。

max_stack_depth (integer)

声明服务器的执行堆栈的最大安全深度。为此设置一个参数的原因是内核强制的实际堆栈尺寸(就是 ulimit -s 或者局部等效物的设置),小于一个安全的一兆字节左右的范围。 需要这么一个安全的界限是因为在服务器里,并非所有过程都检查了堆栈深度, 儿只是在可能递规的过程,比如表达式计算这样的过程里面进行检查。 把这个参数设置得大于实际的内核限制讲意味着一个正在跑的递归函数可能会导致一个独立服务器进程的崩溃。 缺省设置是 2048 KB (两兆),这个值相对比较小,不容易导致崩溃。 但是,这个值可能太小了,以至于无法执行复杂的函数。

16.4.3.2. 自由空间映射

max_fsm_pages (integer)

设置在共享的自由空间映射表里自由空间会跟踪的最大数目的磁盘页面数。 每个页面槽位需要消耗六个字节的共享内存。这个设置必须大于 16 * max_fsm_relations。 缺省是 20000。这个选项只能在服务器启动的时候设置。

max_fsm_relations (integer)

设置自由空间将在共享地自由空间映射里跟踪的最大数目的关系(表和索引)。 每个槽位大概要使用五十字节左右。缺省是 1000。这个选项只能在服务器启动的时候设置。

16.4.3.3. 内核资源使用

max_files_per_process (integer)

设置每个服务器进程允许同时打开的最大的文件数目。缺省是 1000。 如果内核强制一个合理的每进程限制, 那么你不用操心这个设置。但是在一些平台上(特别指出的是,大多数 BSD 系统), sysconf 返回一个系统真正可以支持的数目大的多的数值。 如果你发现有 "Too many open files" 这样的失败现象,那么就尝试缩小这个设置。 这个选项只能在服务器启动时设置。

preload_libraries (string)

这个变量声明一个或者多个在服务器启动的时候预先装载的共享库。 可以选择在装载每个库的时候调用一个无参数的初始化函数。 要声明这个函数,可以在库名字后面加一个冒号,然后增加一个初始化函数名字。 比如 '$libdir/mylib:mylib_init' 会预先装载 mylib 并且执行 mylib_init。 如果装载了多过一个库,用逗号分隔它们。

如果没有找到声明的库或者没有找到初始化函数,那么服务器将启动失败。

可以用这个方法预先装载 PostgreSQL 的过程语言库, 通常是使用 '$libdir/plXXX:plXXX_init' 语法,这里的 XXXpgsqlperltcl,或者 python

通过预先装载一个共享库(以及在需要的时候初始化它), 我们就可以避免第一次使用这个库的那些启动时间。不过,启动每个服务器进程的时间可能会增加, 即使进程从来没有使用过这些库也这样。因此我们只是建议对那些将被大多数会话使用的库才使用这个选项。

16.4.3.4. 基于开销的清理延迟

VACUUMANALYZE 命令执行过程中, 系统维护一个内部的指针,这个指针跟踪所执行的各种 I/O 操作的近似开销。 如果积累的开销达到了一个限制(通过 vacuum_cost_limit 声明), 那么执行这个操作的进程将睡眠一会儿(用 vacuum_cost_delay 声明)。 然后它会重置指针然后继续执行。

这个特性的目的时允许管理员减少这些命令在并发活动的数据库上的 I/O 影响。 有些情况下,像 VACUUMANALYZE 这样的维护命令并不需要迅速完成; 但是,通常都不希望这些命令会严重干扰系统执行其它数据库操作的响应能力。 基于开销的清理延迟为管理员提供了一个实现这个目的的手段。

缺省的时候,这个特性是关闭的。要想打开它,把 vacuum_cost_delay 变量设置为一个非零值。

vacuum_cost_delay (integer)

以毫秒计的时间长度,如果超过了开销限制,那么进程将睡眠一会儿。 缺省值是 0,它关闭基于开销的清理延迟特性。正数值打开基于开销的清理。 不过,要注意在许多系统上,sleep 延迟的有效分辨率是 10 毫秒; 把 vacuum_cost_delay 设置为一个不是 10 的整数倍的数值与将它设置为下一个 10 的整数倍作用相同。

vacuum_cost_page_hit (integer)

清理一个在共享缓存里找到的缓冲区的开销。它代表锁住缓冲池,查找共享的散列表以及扫描页面的内容的开销。 缺省值是 1。

vacuum_cost_page_miss (integer)

清理一个要从磁盘上读取的缓冲区的估计开销。 这个行为代表锁住缓冲池,查找共享散列表,从磁盘读取需要的数据块以及扫描它的内容的开销。 缺省值是 10。

vacuum_cost_page_dirty (integer)

如果清理修改一个原先是干净的块的预计开销。它需要一个把脏的磁盘块再次冲刷到磁盘上的额外开销。 缺省值是 20。

vacuum_cost_limit (integer)

导致清理进程休眠的积累开销。缺省是 200。

注意: 有些操作会持有关键的锁,并且应该尽快结束。 在这样的操作过程中,基于开销的清理延迟不会发生作用。 为了避免在这种情况下的长延时,实际的延迟是这样计算的: vacuum_cost_delay * accumulated_balance / vacuum_cost_limitvacuum_cost_delay * 4 之间的最大值。

16.4.3.5. 后端写进程

PostgreSQL 8.0 开始,就有一个独立的服务器进程,叫做后端写进程, 它唯一的功能就是发出写"脏"共享缓冲区的命令。 这么做的目的是让持有用户查询的服务器进程应该很少或者几乎不等待写动作的发生, 因为后端写进程会做这件事情。这样的安排同样也减少了检查点造成的性能下降。 后端写进程将持续的把脏页面刷新到磁盘上,所以再检查点到来的时候,只有几个页面需要刷新到磁盘上。 但是这样还是增加了 I/O 的总净负荷,因为以前的检查点间隔里,一个重复弄脏的页面可能只会冲刷一次, 而同一个间隔里,后端写进程可能会写好几次。在大多数情况下,连续的低负荷要比周期性的尖峰负荷好, 但是在本节讨论的参数可以用于为本地需要调节其行为。

bgwriter_delay (integer)

声明后端写进程活跃回合之间的延迟。在每个回合里,写进程都会为一些脏的缓冲区发出写操作 (可以用下面的参数控制)。选取的缓冲区总是那些在当前的脏缓冲区里当前最少使用的。 然后它就休眠 bgwriter_delay 毫秒,然后重复动作。缺省值是 200。 请注意在许多系统上,休眠延时的有效分辨率是 10 毫秒;因此,设置 bgwriter_delay 为一个不是 10 的倍数的数值与把它设置为下一个 10 的倍数是一样的效果。 这个选项只能在服务器启动的时候或者 postgresql.conf 文件里设置。

bgwriter_percent (integer)

在每个回合里,当前的脏缓冲区中不超过这个百分比的量将被写到磁盘上 (把小数圆整为下一个整数缓冲区的数值)。 这个选项只能在服务器启动的时候或者 postgresql.conf 文件里设置。

bgwriter_maxpages (integer)

在每个回合里,不超过这个数值的脏缓冲区写入。缺省值是 100。 这个选项只能在服务器启动的时候或者 postgresql.conf 文件里设置。

小的 bgwriter_percentbgwriter_maxpages 减少后端写进程导致的额外 I/O 负荷, 但是会导致在检查点的时候的更多工作。要降低检查点时的峰值负荷,增加这些值。 要想完全关闭后台写进程,可以把 bgwriter_percent 和/或 bgwriter_maxpages 设置为零。

16.4.4. 预写式日志

又见 Section 25.2 获取 WAL 调节的细节。

16.4.4.1. 设置

fsync (boolean)

如果这个选项是打开,那么 PostgreSQL 服务器将在好几个地方使用 fsync() 系统调用来确保更新已经物理上写到磁盘中。 这样就保证了数据库集群将在操作系统或者硬件崩溃的情况下恢复到一个一致的状态。

不过,使用 fsync() 会对性能有影响: 在事务提交的时候,PostgreSQL 必须等待操作系统吧预写日志刷新到磁盘上。 在关闭 fsync 的时候,操作系统可以尽可能优化缓冲,排序和推迟写动作。 这样可以显著提高性能。不过,如果系统崩溃,最后提交的几个事务的结果可能部分或者全部丢失。 最糟糕的情况是可能出现不可恢复的崩溃。 (数据库服务器本身并不是这里的风险因素。 只有一个操作系统级别的崩溃会导致毁坏数据的风险。)

因为涉及的风险太高,fsync 的设置没有普适的原则。 有些管理员总是关闭 fsync,而其它一些只是在批量装载的时候关闭它, 因为这个时候,如果出现了错误,那么就有个明确的重新开始的点, 而另外一些管理员总是打开 fsync。 缺省是打开fsync,目的是最大限度的可靠性。 如果你信任你的操作系统,你的硬件,以及你的工具公司(或者你的备份电池), 你可以考虑关闭 fsync

这个选项只能在服务器启动或者 postgresql.conf 文件里设置。

wal_sync_method (string)

用来向磁盘强制更新 WAL 数据的方法。可能的值是 fsync(每次提交的时候调用 fsync()), fdatasync(每次提交的时候调用 fdatasync()), open_sync(带着 open() 选项 O_SYNC 写 WAL 文件),以及 open_datasync(带着 open() 选项 O_DSYNC 写 WAL 文件)。 不是在所有系统上都能使用上面四种选项。如果 fsync 关闭,那么这个设置无关。 这个选项只能在服务器启动的时候和在postgresql.conf文件里设置。

wal_buffers (integer)

放在共享内存里用于 WAL 数据的磁盘页面缓冲区的数目。 这个设置只需要大到能保存下一次事务生成的 WAL 数据即可。 这个选项只能在服务器启动的时候设置。

commit_delay (integer)

向 WAL 缓冲区写入记录和将缓冲区刷新到磁盘上之间的时间延迟,以微秒计。 一个非零的延迟允许多个事务共用一个 fsync() 系统调用提交, 如果系统负载足够搞,那么在给出的间隔里,其它的事务可能已经准备好提交了。 但是如果没有其它事务准备提交,那么这个间隔就是在浪费时间。 因此,这个延迟只是在一个服务器进程写其提交日志时,至少 commit_siblings 个其它事务在活跃的情况下执行。 缺省是零(无延迟)。

commit_siblings (integer)

在执行 commit_delay 延迟的时候,要求的最少的打开的并发事务数目。 大一些的数值会导致在延迟期间另外一个事务准备好提交的可能性增大。缺省是五。

16.4.4.2. 检查点

checkpoint_segments (integer)

在自动的 WAL 检查点之间的最大距离,以日志文件段(每个段通常 16 兆大)计。 缺省是三。这个选项只能在服务器启动或者在 postgresql.conf 文件里设置。

checkpoint_timeout (integer)

在自动 WAL 检查点之间的最长时间,以秒计。缺省是 300 秒。 这个选项只能在服务器启动的时候或者在 postgresql.conf 文件里设置。

checkpoint_warning (integer)

如果因为填充检查点段文件发生的检查点的间隔比这个数值表示的秒数更多, 那么向服务器日志发送一个消息。缺省是 30 秒。零则关闭警告。

16.4.4.3. 归档

archive_command (string)

用来将一个完整的 WAL 文件序列归档执行的 shell 命令。 如果这是一个空字串(缺省),那么 WAL 归档就关闭。字串中任何 %p 都被要归档的文件的绝对路径代替, 而任何 %f 都只被该文件名代替。如果你需要在命令里嵌入真正的 %,写 %%。 有关更多的信息,参阅 Section 22.3.1。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

有一点很重要:这个命令必须是当且仅当成功的时候才返回零。比如:

archive_command = 'cp "%p" /mnt/server/archivedir/"%f"'
archive_command = 'copy "%p" /mnt/server/archivedir/"%f"'  # Windows

16.4.5. 查询规划

16.4.5.1. 规划器方法配置

这些配置参数提供了一个用于影响查询优化器选择的查询规划的原始的方法。 如果优化器为特定的查询选择的缺省规划并不是最优, 那么我们就可以通过使用这些配置参数强制优化器选择一个更好的规划来临时解决这个问题。 不过,永久地关闭这些设置几乎从不是个好主意。 更好的改善优化器选择的规划的方法包括配置 规划器开销常量, 更频繁运行 ANALYZE, 增大配置参数 default_statistics_target 的值, 以及使用 ALTER TABLE SET STATISTICS 为某个字段增加收集的统计信息。

enable_hashagg (boolean)

打开或者关闭查询规划器对散列聚集规划类型的时候。缺省是打开。

enable_hashjoin (boolean)

打开或者关闭查询规划器对散列连接规划类型的使用。 缺省是打开。

enable_indexscan (boolean)

打开或者关闭查询规划期对索引扫描规划类型的使用。 缺省是打开。

enable_mergejoin (boolean)

打开或者关闭查询规划器对融合连接规划类型的使用。 缺省是打开。

enable_nestloop (boolean)

打开或者关闭查询规划器对嵌套循环连接规划类型的使用。 我们不可能完全消除嵌套循环连接,但是把这个变量关闭就会让规划器在存在其它方法的时候优先选择其他的。 缺省是打开。

enable_seqscan (boolean)

打开或者关闭查询规划器对顺序扫描规划类型的使用。 我们不可能完全消除顺序扫描,但是把这个变量关闭会让规划器在存在其它方法的时候优先选择其它的。 缺省是打开。

enable_sort (boolean)

打开或者关闭查询规划器使用明确的排序步骤。我们不可能完全消除明确的排序, 但是把这个变量关闭可以让规划器在存在其它方法的时候优先选择其它方法。 缺省是打开。

enable_tidscan (boolean)

打开或者关闭查询规划器对 TID 扫描规划类型的使用。 缺省是打开。

16.4.5.2. 规划器开销常量

注意: 糟糕的是,现在还没有定义得很合理的方法来判断下面出现的"开销"变量族的理想数值。 我们鼓励你做各种试验并分享你的发现。

effective_cache_size (floating point)

为规划器设置在一次索引扫描中可用的磁盘缓冲区的有效大小。 这个参数在计算一个索引的开销的预计值的时候会加以考虑; 一个更高的数值会导致很可能使用索引扫描,数值低了会更有可能选择顺序扫描。 在设置这个参数的时候,你还应该考虑 PostgreSQL 的数据文件会使用的的共享缓冲区和内核的磁盘缓冲。 还有,还要考虑预计会有的使用不同索引的并发查询数目, 因为它们必须共享可用的内存空间。这个参数对 PostgreSQL 分配的共享内存大小没有影响, 它也不会使用内核磁盘缓冲;它只用于估算。数值是用磁盘页来计算的, 通常每个页面是 8192 字节。缺省是 1000。

random_page_cost (floating point)

设置规划器计算的一次非顺序磁盘页面抓取的开销。 这是以顺序磁盘页面抓取的开销的倍数计量的。 更高的数值令优化器更倾向于选择一次顺序扫描,低数值的时候则倾向于使用索引扫描。 缺省是四。

cpu_tuple_cost (floating point)

设置规划器预计在一次查询中处理一个数据行的开销。 这是以一次顺序页面抓取的开销的分数来计量的。 缺省是 0.01。

cpu_index_tuple_cost (floating point)

设置在一次索引扫描中规划器计算出来的处理每条索引行的开销。 这是以一次顺序页面抓取的开销的分数来计量的。缺省是 0.001。

cpu_operator_cost (floating point)

设置规划器计算出来的处理一条WHERE子句中的每个操作符的开销。 这是以一次顺序页面抓取的开销的分数来计量的。缺省是 0.0025。

16.4.5.3. 基因查询优化器

geqo (boolean)

允许或禁止基因查询优化,这是一种试图不通过穷举搜索来实现查询规划的算法。缺省是允许。 geqo_threshold 变量提供了一种为特定类别的查询关闭 GEQO 的粒度更好的方法。

geqo_threshold (integer)

只有当涉及的FROM关系数量至少有这么多个的时候,才使用基因查询优化。 (请注意一个外JOIN构造只算做一个FROM项。) 缺省是 12,对于数量小于此数的查询,也许使用判定性的穷举搜索更有效。 但是对于有许多表的查询,规划器做判断要花很多时间。

geqo_effort (integer)

控制 GEQO 里规划时间和查询规划的有效性之间的平衡。 这个变量必须事一个范围从 1 到 10 的整数。缺省值是 5。 大的数值增加花在进行查询规划上面的时间,但是也很可能会提高选中更有效的查询规划的几率。

geqo_effort 实际上并没有直接干什么事情; 只是用于计算其它那些影响 GEQO 行为的变量的缺省值(在下面描述)。 如果你愿意,你可以手工设置其它参数。

geqo_pool_size (integer)

控制 GEQ0 使用的池大小。池大小是一个全体中的个体的数量。 它必须至少是二,并且有用的数值通常在 100 和 1000 之间。 如果把它设置为零(缺省设置),那么就会基于 geqo_effort 和查询中表的数量选取一个合适的缺省。

geqo_generations (integer)

控制 GEQO 使用的子代的数目。子代声明算法的迭代的数目。 它必须至少是一,有用的值范围和池的大小相同。如果设置为零(缺省),那么将基于 geqo_pool_size 选取合适的缺省。

geqo_selection_bias (floating point)

控制 GEQO 使用的选择性偏好。选择性偏好是在一个种群中的选择性压力。 数值可以是 1.5 到 2.0 之间;后者是缺省。

16.4.5.4. 其它规划器选项

default_statistics_target (integer)

为没有用 ALTER TABLE SET STATISTICS 设置字段相关目标的表中其它字段设置缺省统计目标。 更大的数值增加了 ANALYZE 所需要的时间,但是可能会改善规划器的估计质量。缺省值是 10。 有关 PostgreSQL 的查询规划器使用的统计的更多信息,请参考 Section 13.2

from_collapse_limit (integer)

如果生成的 FROM 列表不超过这个限制的项数,规划器将把子查询融合到上层查询。 小的数值降低规划的时间,但是可能会生成差些的查询计划。 缺省是 8。通常,把它限制在小于 geqo_threshold 的数值是比较明智的。

join_collapse_limit (integer)

如果得出的列表不超过这个数目的项,那么规划器将把明确的内 JOIN 构造抹平到 FROM 列表项中。 PostgreSQL 7.4 以前,通过 JOIN 构造声明的连接绝对不会被查询规划期重排。 现在的查询规划器已经改进过了,这样,用这种形式写出来的内层连接就可以重排了; 这个配置参数控制这种重排的程度。

注意: 目前,用 JOIN 构造声明的外联接的顺序从来不会查询规划器被调整; 因此,join_collapse_limit 在这个行为上没有效果。 在未来的 PostgreSQL 版本里,规划器可能会改进某些外联接类型的重排。

缺省时,这个值设置为和 from_collapse_limit 相同, 这个值适合大多数场合。把它设置为 1 则避免任何内 JOIN 的融合,就可以使用明确的 JOIN 语法来控制连接顺序。查询优化器并不是总能选取最优的联接顺序;高级用户可以选择暂时把这个变量设置为 1, 然后明确地声明他们需要的联接顺序。把这个变量设置为 1 的另外一个后果是查询规划器会表现得更像 PostgreSQL 7.3 查询规划器,可能对一些用户做向下兼容很有用。

把这个数值设置为 1 和 from_collapse_limit 之间可能对于在规划时间和选取的规划的质量之间有个平衡 (越高的数值生成越好的规划)。

16.4.6. 错误报告和日志

16.4.6.1. 在哪里记录日志

log_destination (string)

PostgreSQL 支持多种记录服务器日志的方法, 包括 stderrsyslog。 在 Windows 里,还支持 eventlog。 允许把 syslog 作为日志系统。 把这个选项设置为一个逗号分隔的日志目标的列表。缺省是只记录到 stderr。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

redirect_stderr (boolean)

这个选项允许把那些发送到 stderr 的消息捕获下来, 然后把它们重定向到日志文件里。这个选项,加上日志记录到 stderr 里的组合, 通常比记录到 syslog 更有用, 因为有些消息类型不出现在 syslog 输出(一个常见的例子是动态连接失败消息)。 这个选项只能在服务器启动的时候设置。

log_directory (string)

在打开了 redirect_stderr 的时候, 这个选项判断日志文件在哪个目录里创建。 它可以声明成绝对路径,或者是与集群的数据目录相对的路径。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_filename (string)

在打开了 redirect_stderr 的时候,这个选项设置所创建的日志文件的文件名。 这个数值是当作 strftime 模式看待的。 因此 % 逃逸可以声明因时间而变的文件名。 如果没有出现 % 逃逸,PostgreSQL 将附着日志文件打开的纪元时间。 比如,如果 log_filenameserver_log, 那么选择的文件名将是 server_log.1093827753 — 假如日志文件开始于 Sun Aug 29 19:02:33 2004 MST 的话。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_rotation_age (integer)

在打开了 redirect_stderr 的时候, 这个选项设置一个独立的日志文件的最大生存期。 在数值指定的分钟过去之后,将创建一个新的日志文件。 设置为零可以关闭以时间为基础的新日志文件的创建。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_rotation_size (integer)

在打开了 redirect_stderr 的时候, 这个选项设置一个独立的日志文件的最大尺寸。 在数值指定的千字节写入日志文件之后,将会创建一个新的日志文件。 设置为零可以关闭以尺寸为基础的新日志文件的创建。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

log_truncate_on_rotation (boolean)

如果打开了 redirect_stderr,这个选项将导致 PostgreSQL 阶段(覆盖),而不是附加到任何同名的现有日志文件上。 不过,截断只是发生在因为以时间为基础的旋转的时候创建的新文件上, 而不是在服务器启动的时候或者以尺寸为基础的旋转上。 比如,使用这个选项和类似 postgresql-%H.log 这样的 log_filename 将导致生成 24 个按小时生成的日志文件然后在这些文件上循环。 这个选项只能在服务器启动的时候在 postgresql.conf 文件里面设置。

例子:保留 7 天的日志,每天一个日志文件,叫做 server_log.Monserver_log.Tue,等等,并且上周的日志会自动被这周的日志覆盖, 把 log_filename 设置为 server_log.%alog_truncate_on_rotation 设置为 true, 并且把 log_rotation_age 设置为 1440

例子:保留 24 小时的日志,每小时一个日志,但是如果日志文件尺寸大于 1GB 也旋转日志, 设置 log_filenameserver_log.%H%Mlog_truncate_on_rotationtruelog_rotation_age60,并且把 log_rotation_size 设置为 1000000。 在 log_filename 里包含 %M 允许任何尺寸驱动的旋转选取一个和开始的文件名同小时数但是名字不同的文件。

syslog_facility (string)

如果把日志记录到 syslog 功能打开, 那么这个选项在打开syslog后判断要使用的 syslog "设施"。 你可以从 LOCAL0LOCAL1LOCAL2LOCAL3LOCAL4LOCAL5LOCAL6LOCAL7 中选择;缺省是LOCAL0。 又见你的系统的 syslog 守护进程文档。这个选项只能在服务器启动的时候设置。

syslog_ident (string)

如果打开了向syslog中记日志的功能, 这个选项决定用于在 syslog 日志中标识 PostgreSQL 的程序名。缺省是 postgres。 这个选项只能在服务器启动的时候设置。

16.4.6.2. 什么时候记日志

client_min_messages (string)

这个选项控制那些信息发送到客户端。 有效的数值是 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1LOGNOTICEWARNINGERROR。 每个级别包含所有它后面的级别,级别越靠后,发送的信息越少。 缺省是 NOTICE。这里的 LOGlog_min_messages 里面的有不同的级别。

log_min_messages (string)

控制写到服务器日志里的信息的详细程度。有效值是 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATAL,和 PANIC。 每个级别都包含它后面的级别。越靠后的数值发往服务器日志的信息越少。 缺省是 NOTICE。请注意 LOGclient_min_messages 里面的同名级别优先级不同。 只有超级用户可以修改这个设置。

log_error_verbosity (string)

控制记录的每条信息写到服务器日志里的详细程度。 有效的值是 TERSEDEFAULT,和 VERBOSE, 每个都会向显示的信息里增加更多的字段。只有超级用户可以改变这个设置。

log_min_error_statement (string)

控制是否在服务器日志里输出那些导致错误条件的 SQL 语句。 所有导致一个特定级别(或者更高级别)的错误的 SQL 语句都要被记录日志。 缺省是 PANIC(实际上是把这个特性关闭了)。 有效的值有 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORFATAL,和 PANIC。 比如,如果你把这个设置为 ERROR, 那么所有导致错误,致命错误,或者恐慌的 SQL 语句都将被记录日志。 打开这个选项可以帮助跟踪那些在服务器日志里出现的任何错误的源头。 只有超级用户可以改变这个设置。

log_min_duration_statement (integer)

设置要记录日志的语句的最小执行时间(以毫秒计)。 所有运行时间等于或者大于这个值的 SQL 语句都会在和他们的执行时间一起记录在日志里。 把这个设置为零将打印所有的查询和他们的持续时间。 设置为负一(缺省值)关闭这个功能。比如,如果你把它设置为 250, 那么所有运行时间等于或者超过 250ms 的 SQL 语句都会被记录日志。 打开这个选项可以很方便地跟踪你的应用里那些没有优化地查询。 只有超级用户可以修改这个设置。

silent_mode (boolean)

安静的运行服务器。如果设置了这个选项,服务器将自动在后台运行并且与控制终端脱开 (和 postmaster-S 选项效果一样)。 服务器的标准输出和标准错误重定向到 /dev/null,因此,发送的任何信息都将丢失。 除非打开了 syslog 日志或者打开了 redirect_stderr, 否则我们不建议使用这个选项,因为它让我们很难看到错误信息。

这里是这个设置里用到各种信息严重程度类型的一个列表:

DEBUG[1-5]

这个提供开发人员使用的信息。

INFO

这个提供用户隐含要求的信息,比如在 VACUUM VERBOSE 过程中的信息。

NOTICE

这个提供可能对用户有帮助的信息,比如,长标识符的截断, 作为主键一部分创建的索引。

WARNING

这个提供给用户的警告,比如在事务块范围之外的 COMMIT

ERROR

报告导致当前命令退出的错误。

LOG

这个报告一些管理员感兴趣的信息,比如,检查点活跃性。

FATAL

这个报告为什么当前会话终止。

PANIC

报告导致所有会话退出的原因。

16.4.6.3. 记录什么

debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean)
debug_pretty_print (boolean)

这个选项打开出的各种调试输出。 对于执行的每个查询,它们打印生成的它生成的分析树,查询重写,或者执行规划。 debug_pretty_print 把这些输出进行缩进,会生成漂亮些但是长一些的输出格式。 client_min_messages 或者 log_min_messages 必须是 DEBUG1 或者更低才实际上把输出发往客户端或者服务器日志。这些选项缺省都是关闭的。

log_connections (boolean)

这样会在每次成功的联接的时候都向服务器日志里打印一行详细信息。 缺省时是关闭的,尽管它可能很有用。这个选项只能在服务器启动的时候设置, 或者在 postgresql.conf 配置文件里设置。

log_disconnections (boolean)

这个选项在会话结束的时候在服务器日志里输出一行,类似 log_connections。 缺省是关闭的。这个选项只能在服务器开始时设置或者在 postgresql.conf 配置文件里设置。

log_duration (boolean)

导致每个满足 log_statement 之条件已完成语句的持续时间都写入日志。要使用这个选项, 而你又不使用 syslog,那么我们建议你用 log_line_prefix 记录 PID 或者会话 ID, 这样你就可以用进程 ID 或者会话 ID 把语句和持续时间连接起来。 缺省是关闭。如果管理员打开过它,那么只有超级用户可以修改这个设置。

log_line_prefix (string)

这是一个 printf 风格的字串,在日志的每行开头输出。 缺省时一个空字串。每个可识别的逃逸都会按照下面说明的那样逃逸 - 任何其它看起来像逃逸的都会被忽略。 其它字符都直接拷贝到日志行中。有些逃逸只被会话进程识别,不能应用于后端进程,比如 postmaster。 Syslog 生成自己的时间戳和进程 ID 信息,因此,如果你使用了 syslog, 可能不会想使用那些逃逸。这个选项只能在服务器启动或者 postgresql.conf 配置文件里设置。

逃逸效果仅用于会话
%u用户名
%d数据库名
%r远程主机名或者 IP 地址,以及远端端口
%p进程 ID
%t时间戳
%i命令标签。这是生成日志行的命令。
%c 会话 ID。一个每个会话的唯一标识符。 它是两个 4 字节的十六进制数字(没有前导零),用句点分开。 数字是会话开始时间和进程 ID,因此也可以用做一种打印这些项目的节约空间的方法。
%l 每个进程的日志行的编号,从 1 开始。
%s会话开始的时间戳
%x事务 ID
%q 不生成任何输出,但是告诉非会话进程在字串的这个位置停止。 被会话进程忽略。
%%文本 %

log_statement (string)

控制记录哪个 SQL 语句。有效的值是 noneddlmod,和 allddl 记录所有数据定义命令, 比如 CREATEALTER,和 DROP 命令。 mod 记录所有 ddl 语句, 加上 INSERTUPDATEDELETETRUNCATE,和 COPY FROM。如果所包含的命令类型对路,那么PREPAREEXPLAIN ANALYZE 语句也同样被记录。

缺省是 none。只有超级用户可以修改这个设置。

注意: EXECUTE 语句不认为是 ddl 或者 mod 语句。 如果记录它的日志,那么只有准备好的语句的名字被记录,不包括实际的准备好的语句。

如果一个函数用一种类似 PL/pgSQL 的服务器端编程语言定义, 那么,任何该函数执行的查询都只在该函数第一此调用的时候记录日志。 这是因为 PL/pgSQL 为函数里的 SQL 语句保存一份该查询规划的缓存。

log_hostname (boolean)

缺省时,联接日志只记录所联接主机的 IP 地址。 打开这个选项导致同时记录主机名。 请注意,这样有可能带来一些不可忽略的性能损失, — 取决于你的名字解析的设置。这个选项只能在服务器启动的时候或者在 postgresql.conf 里设置。

16.4.7. 运行时统计

16.4.7.1. 统计监控

log_statement_stats (boolean)
log_parser_stats (boolean)
log_planner_stats (boolean)
log_executor_stats (boolean)

对每条查询,向服务器日志里输出相应模块的性能统计。 log_statement_stats 报告总的语言统计,而其它的报告模块的统计。 这是原始的剖析工具。log_statement_stats 不能和其它任何按模块统计的选项一起打开。 缺省时所有这些选项都是关闭的。只有超级用户才能修改这些设置。

16.4.7.2. 查询和索引统计收集器

stats_start_collector (boolean)

控制服务器是否启动统计收集子进程。缺省时是打开, 但如果你对统计收集不感兴趣,那么可以关闭。这个选项只能在启动服务器时设置。

stats_command_string (boolean)

打开每个会话当前执行的命令的统计收集,以及该命令开始执行的时间。 这个选项缺省是关闭的。请注意即使把它打开,这个信息也不是所有用户都可见的, 只有超级用户和会话的所有者才能看到;因此它不应该是个安全漏洞。 这些数据可以通过系统视图 pg_stat_activity 访问, 请参考 Chapter 23 获取更多信息。

stats_block_level (boolean)

打开数据库活跃性的块级别的统计收集。这个选项缺省时是关闭的。 如果打开这个选项,生成的数据可以通过 pg_statpg_statio 族函系统视图访问; 请参考 Chapter 23 获取更多信息。

stats_row_level (boolean)

打开数据库活跃性的块级别和行级别的统计。 这个选项缺省是关闭的。生成的数据可以通过 pg_statpg_statio 族系统视图来访问。 请参考 Chapter 23 获取更多信息。

stats_reset_on_server_start (boolean)

如果打开,那么在服务器启动的时候收集的信息被清零。 如果关闭,那么统计在服务器重起过程中累加。缺省是打开。 这个选项只能在服务器启动的时候设置。

16.4.8. 客户端连接缺省

16.4.8.1. 语句行为

search_path (string)

这个变量声明模式的搜索顺序,在一个被引用对象(表,数据类型,函数等)只是一个简单名字, 没有附加模式部分时需要这样的搜索。 如果在另外一个模式里有一个相同的对象名,那么使用在这个搜索路径中找到的第一个。 一个没有在搜索路径中任何一个模式里出现的对象只能通过其所在模式的全称(打点的)名字来声明。

search_path 的值必需是一个逗号分隔的模式名的列表。 如果列表项之一是特殊值 $user, 那么该模式和 SESSION_USER 所代换的名字一样 — 如果存在这个模式的话。 (如果没有,那么忽略 $user。)

系统表模式,pg_catalog,总是被搜索,不管我们有没有在路径里提到它。 如果我们在路径中提到它,那么将按照指定的顺序搜索。 如果 pg_catalog 没有在路径中,那么它将在任何路径项之前得到搜索。 我们还要注意的是,临时表模式,pg_temp_nnn,也隐含在任何这些项之前得到搜索。

如果创建对象时没有声明特定的目标模式,那么它将被放到搜索路径中的第一个模式。如果搜索路径是空的,那么会报告一个错误。

这个参数的缺省值是 '$user, public' (如果没有叫 public 的模式,那么第二部分将被忽略)。 这样就支持共享使用一个数据库(这个时候没有用户拥有私有模式, 并且所有人都共享使用 public),私有的每用户的模式, 以及这些的组合。其它效果可以通过(全局或者每用户地)修改搜索路径设置获取。

搜索路径当前的有效值可以用 SQL 函数 current_schemas() 检查。 它和检查 search_path 的值并不太一样, 因为 current_schemas() 显示的是在 search_path 里出现的请求如何被分析。

有关模式处理的更多信息,参阅 Section 5.8

default_tablespace (string)

这个变量声明当 CREATE 命令没有明确声明表空间时, 所创建之对象(表和索引等)的缺省表空间。

数值要么是一个表空间的名字,要么是一个空串,表明使用当前数据库的缺省表空间。 如果这个数值和任意现存表空间的名字不匹配,那么 PostgreSQL 将自动使用当前数据库的缺省表空间。

有关表空间的更多的信息,参阅 Section 18.6

check_function_bodies (boolean)

这个参数通常是真。如果设置为假,那么就关闭在 CREATE FUNCTION 时候的函数体字串的合法性检查。 关闭合法性检查有时候会有用,比如可以避免在从转储中恢复函数定义的时候类似前向引用的问题。

default_transaction_isolation (string)

每个 SQL 事务都有一个隔离级别,可以是"读未提交""读已提交""可重复读"或者是"可串性化"。 这个参数控制每个新的事务的隔离级别。缺省是读已提交。

参考 Chapter 12SET TRANSACTION 获取更多信息。

default_transaction_read_only (boolean)

只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的只读状态。 缺省是假(读/写).

参考 SET TRANSACTION 获取更多信息。

statement_timeout (integer)

退出任何使用了超过此参数指定时间(毫秒)的语句。 零值(缺省)关闭这个计时器。

16.4.8.2. 区域和格式化

DateStyle (string)

设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 由于历史原因,这个变量包含两个独立的部分:输出格式声明(ISOPostgresSQL,或者 German)以及日志字段顺序声明(DMYMDY,或者 YMD)。 这两个可以独立设置或者一起设置。关键字 EuroEuropeanDMY 的同义词; 关键字 USNonEuro,和 NonEuropeanMDY 的同义词。 参阅 Section 8.5 获取更多信息。缺省是 ISO, US

timezone (string)

设置用于显示和解析时间戳的时区。缺省是 'unknown',意味着使用系统环境声明的时区。 参阅 Section 8.5 获取更多信息。

australian_timezones (boolean)

如果设置为真,那么ACSTCSTCSTEST,和 SAT 都解释成澳大利亚时区,而不是南/北美时区和周六。 缺省是假。

extra_float_digits (integer)

这个参数为浮点数值调整显示的数据位数,浮点类型包括 float4float8,和几何数据类型。 参数值加在标准的数据位数上(FLT_DIG 或者 DBL_DIG 中合适的)。 数值可以设置为最高 2,以包括部分关键的数据位;这个功能对转储那些需要精确恢复的浮点数据特别有用。 或者你也可以把它设置位负数以消除不需要的数据位。

client_encoding (string)

设置客户端编码(字符集)。缺省使用数据库编码。

lc_messages (string)

设置信息显示的语言。可接受的值是系统相关的;参阅 Section 20.1 获取更多信息。 如果这个变量设置为空字串(缺省值),那么其值以一种系统相关的方式从服务器的执行环境中继承过来。

在一些系统上,这个区域范畴并不存在。设置这个变量仍然是允许的, 但是将不会有任何效果。同样,也有可能是所期望的语言的翻译信息不存在。在这种情况下,你仍然能看到英文信息。

lc_monetary (string)

为格式化金额数量设置区域。比如为 to_char 族函数设置。 可接受的值是系统相关的;参阅 Section 20.1 获取更多信息。 如果这个变量设置为空字串(缺省值),那么其值是以一种系统相关的方式从服务器的执行环境中继承过来的。

lc_numeric (string)

设置用于格式化数字的区域,比如那些用于 to_char 族函数的。可接受的值是系统相关的;参阅 Section 20.1 获取更多信息。如果这个变量设置为空字串(缺省值),那么其值以一种系统相关的方法从服务器的执行环境中继承过来。

lc_time (string)

设置用于格式化日期和时间值的区域。(目前,这个设置什么事也没干,但将来可能会有用。) to_char 族函数的。 可接受的值是系统相关的;参阅 Section 20.1 获取更多信息。 如果这个变量设置为空字串(缺省值),那么其值是以一种系统相关的方式从服务器的执行环境中继承过来的。

16.4.8.3. 其它缺省

explain_pretty_print (boolean)

决定 EXPLAIN VERBOSE 是使用缩进格式还是使用非缩进格式显示详细的查询树转储。 缺省是打开。

dynamic_library_path (string)

如果需要打开一个可以动态装载的模块并且在 CREATE FUNCTION 或者 LOAD 命令里面声明的名字没有目录部分(也就是说名字里不包含斜杠), 那么系统将搜索这个目录以查找声明的文件。

用于 dynamic_library_path 的数值必须是一个冒号分隔(或者是在 Windows 上分号分隔)的绝对路径名字列表。 如果一个路径名字以特殊变量 $libdirPostgreSQL编译好的库目录)开头, 那么就替换为PostgreSQL发布提供的模块安装路径。 这是标准 PostgreSQL 发布提供的模块安装的目录。 (使用 pg_config --pkglibdir 打印这个目录的名字。) 比如:

dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'

或者是在 windows 环境里:

dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'

这个参数的缺省值是 '$libdir'。 如果把这个值设置为一个空字串,则关闭自动路径搜索。

这个参数可以在运行时由超级用户修改,但是这么修改的设置只能保持到这个客户端连接的结束, 因此这个方法应该保留给开发用途使用。 我们建议的设置这个参数的方法是在 postgresql.conf 配置文件里设置。

16.4.9. 锁管理

deadlock_timeout (integer)

这个是以毫秒计的时间,用于设置在检查是否存在死锁条件之前的等待时间。 检查是否存在死锁条件是一个缓慢的过程,因此服务器不会在每次等待锁的时候都运行这个过程。 我们(乐观地?)假设在生产应用中的死锁是不常出现的, 因此我们在开始询问是否可以解锁之前只等待一个锁相对短的一段时间。 增加这个值就减少了浪费在无用的死锁检查上的时间,但是减慢了报告真正死锁错误的速度。 缺省是 1000(也就是 1 秒),可能是你能够耐心等待的最短时间。 在一个重载的服务器上,你可能需要增大它。这个值的典型设置应该超过你的事务的时间, 这样就可以减少在锁释放之前就开始死锁检查的问题。

max_locks_per_transaction (integer)

共享的锁表的大小是以假设任意时刻最多只有 max_locks_per_transaction * max_connections 个独立的对象需要被锁住为基础进行计算的。 (所以,这个参数的名字可能有些让人糊涂:这不是单个事务可以使用的锁数目的硬限制,而是一个平均值。) 缺省值 64, 已经经历史证明是足够的了,不过如果你的客户可能在一个事务里面修改很多不同的表, 那么你就可能需要提高这个数值。这个选项只能在服务器启动的时候设置。

16.4.10. 版本和平台兼容性

16.4.10.1. 以前的 PostgreSQL 版本

add_missing_from (boolean)

如果为 true,查询引用的表将自动增加到 FROM 里 -如果还没有出现这个子句的话。 缺省是 true,为的是和以前的 PostgreSQL 版本兼容。 不过,这个行为不是 SQL 的标准,并且很多人不喜欢她,因为它会隐藏错误(比如该引用别名的时候引用了表名)。 设置为 false 则遵循 SQL 标准行为:拒绝引用不在 FROM 里列出的表。

regex_flavor (string)

正则表达式"风味"可以设置为 advancedextended, 或者 basic。通常的缺省是 advancedextended 设置对于和 7.4 以前的 PostgreSQL 精确的向下兼容很有用。 参阅 Section 9.7.3.1 获取细节。

sql_inheritance (boolean)

这个选项控制继承语义,尤其是在缺省时是否在各种命令里把子表包括进来。 版本 7.1 以前是不包括的。如果你需要老特性,你可以把这个变量设为假, 但是从长远看来,我们建议你修改你的应用以使用 ONLY 关键字来排除子表。 参考 Section 5.5 获取关于继承的更多信息。

default_with_oids (boolean)

如果既没有声明 WITH OIDS,又没有声明 WITHOUT OIDS, 那么这个选项控制 CREATE TABLECREATE TABLE AS 是否在新创建的表中包含一个 OID 字段。它还决定 SELECT INTO 创建的表里面是否包含 OID。 在 PostgreSQL 8.0.0 default_with_oids 缺省为真。 这也是以前的版本的 PostgreSQL 的行为。 不过,我们不鼓励假设表里面缺省会包含 OID。因此,在将来的版本的 PostgreSQL 里, 这个选项缺省会是假。

为了容易与那些使用了 OID 的应用兼容,这个选项应该是打开。 为了容易和将来版本的 PostgreSQL 兼容, 这个选项应该关闭,而要求某些表上有 OID 的应用在创建表的时候应该明确声明 WITH OIDS

16.4.10.2. 平台和客户端兼容性

transform_null_equals (boolean)

如果打开它,那么下面这样的表达式 expr = NULL (或者 NULL = expr)被当做 expr IS NULL,处理,也就是说, 如果 expr 得出 NULL 值则返回真,否则返回假。 expr = NULL 正确的 SQL 标准兼容的行为总是返回 NULL(未知)。 因此这个选项缺省时是关闭的。

不过,在Microsoft Access里的过滤表单生成的查询好像使用的是 expr = NULL 测试空值, 因此,如果你使用这个界面访问数据库,你可能想把这个选项打开。 因为形如 expr = NULL 的表达式总是返回 NULL (使用正确的代换),因此它们并不常用, 而且在一般的应用中也不常见,因此这个选项实际上没有什么害处。 但是新用户常常在涉及 NULL 的表达式语义上感到胡涂,因此缺省时不打开这个选项。

请注意这个选项只影响 = NULL 形式, 不包括其它比较操作符或者其它与一些涉及等号操作符的表达式计算(比如 IN)。 因此,这个选项不是垃圾程序的狗皮膏药。

请参考 Section 9.2 获取相关信息。

16.4.11. 预置的选项

下面的"参数"是只读的,是在编译或安装 PostgreSQL 的时候决定的。 因此,他们被排除在了 postgresql.conf 文件之外。这些选项报告各种 PostgreSQL 某些应用可能感兴趣的行为,特别是管理性的前端。

block_size (integer)

显示磁盘块的大小。它是由制作服务器的时候 BLCKSZ 的值确定的。 缺省值是 8192 字节。 有些配置变量的含义(比如 shared_buffers)会被block_size影响。 参阅 Section 16.4.3 获取信息。

integer_datetimes (boolean)

显示 PostgreSQL 是否打开了 64 位整数日期和时间制作的。 这是制作 PostgreSQL 的时候由配置 --enable-integer-datetimes 设置的。 缺省值是 off

lc_collate (string)

显示文本数据排序使用的区域。参阅 Section 20.1 获取更多信息。 该值是在初始化数据库集群的时候判断的。

lc_ctype (string)

显示决定字符分类的区域。参阅 Section 20.1 获取更多信息。 该值是在数据库集群初始化的时候决定的。通常它和 lc_collate 一样, 但是可以为特殊应用设置成不同的。

max_function_args (integer)

显示函数参数的最大个数。它是由制作服务器的时候的 FUNC_MAX_ARGS 值决定的。 缺省是 32。

max_identifier_length (integer)

显示最大标识符长度。它是由制作服务器时的 NAMEDATALEN 减一决定的。 NAMEDATALEN 的缺省值时 64;因此缺省的 max_identifier_length 是 63。

max_index_keys (integer)

显示最大索引键字的个数。它是由制作服务器时的 INDEX_MAX_KEYS 值决定的。 缺省值是 32。

server_encoding (string)

显示数据库编码(字符集)。 这是在创建数据库的时候决定的。通常,客户端值需要关心 client_encoding 的值。

server_version (string)

显示服务器版本号。它是在制作服务器的时候由 PG_VERSION 决定的。

16.4.12. 客户化的选项

这个特性是用来允许那些通常 PostgreSQL 不知道的选项可以被附加模块添加(比如过程语言)。 这样,就允许附加的模块(比如触发器和函数的语言映射)可以以一种一致的方式配置。

custom_variable_classes (string)

这个变量以逗号分隔的列表的形式声明一个或者多个用于客户变量的类。 一个客户变量通常是一个 PostgreSQL 并不太知道的变量, 但是被一些附加的模块使用。这样的变量的名字必须由一个类别名,一个点,以及一个变量名组成。 custom_variable_classes 声明在一次安装里的所有类别名。

这里声明的每一类都可以定义任意个变量。这些变量将被看作占位符,知道定义他们的模块装载之前, 他们没有意义。在装载了某种类特定的模块之后,它将为与之关联的类增加合适的变量定义, 根据这些定义转换任何的占位符,并且为任何到该时刻还剩下的占位符发出警告。 这个选项只能在服务器启动的时候或者在 postgresql.conf 配置文件里设置。

postgresql.conf 里设置客户变量的困难在于这个文件必须在附加模块装载之前读取, 因此客户化变量通常会被认为是未知而拒绝。在设置了 custom_variable_classes 之后, 服务器将接受每个声明的类别里的任意变量。这些变量将被当作占位符,并且在定义它们的模块装载之前没有任何用处。 在一个特定类别的模块装在后,它将为这个类别名增加合适的变量定义,根据它们的定义把那些占位符数值进行转换, 并且为该类别剩下的任何占位符发出警告(这些很有可能是拼写错的配置变量)。

下面是一个在使用客户化变量时,postgresql.conf 可能包含的东西的例子。

custom_variable_classes = 'plr,pljava'
plr.path = '/usr/lib/R'
pljava.foo = 1
plruby.bar = true        # 生成一个错误,未知的类别名

16.4.13. 开发人员选项

下面的选项目的是在 PostgreSQL 代码上使用, 并且在某些情况下可以帮助恢复严重损坏了的数据库。 在生产环境里没有使用这些设置的理由。 因此,我们把他们从样例 postgresql.conf 文件中排除了出去。 请注意许多这些选项要求特殊的源代码编译标志才能运转。

debug_assertions (boolean)

打开各种断言检查。这是调试助手。如果你经历了奇怪的问题或者崩溃, 那么你可能会想把这个打开,因为它可能暴露编程的错误。 要使用这个选项,我们必须在制作 PostgreSQL 的时候定义宏 USE_ASSERT_CHECKING (通过 configure 选项 --enable-cassert 完成)。 请注意,如果带着断言打开的选项编译 PostgreSQL, 那么 debug_assertions 缺省就是打开的。

debug_shared_buffers (integer)

ARC 报告之间的秒数。如果设置为大于零,每隔这么多秒就向日志中发出 ARC 统计。 零(缺省)关闭报告。

pre_auth_delay (integer)

如果为非零,那么在一个新的服务器进程派生出来之后,就会延迟这么多秒,然后才会继续认证过程。 这样就给我们一个机会用调试器附着在一个服务器进程上跟踪认证里面的异常行为。

trace_notify (boolean)

LISTENNOTIFY 命令生长大量调试输出。 client_min_messages 或者 log_min_messages 必须是 DEBUG1 或者更低才能把这些输出分别发送到客户端或者服务器日志。

trace_locks (boolean)
trace_lwlocks (boolean)
trace_userlocks (boolean)
trace_lock_oidmin (boolean)
trace_lock_table (boolean)
debug_deadlocks (boolean)
log_btree_build_stats (boolean)

各种其它的代码跟踪和调试选项。

wal_debug (boolean)

如果为真,打开 WAL 相关的调试输出。 只有在编译 PostgreSQL 的时候打开了 WAL_DEBUG 宏的情况下,这个选项才可用。

zero_damaged_pages (boolean)

如果侦测到一个损坏了的页面头通常会导致 PostgreSQL 报告一个错误,并且退出当前命令。把 zero_damaged_pages 设置为真则令系统报告一个警告,把损坏的页面填充零,然后继续处理。 这种行为会破坏数据,也就是所有在已经损坏页面上的行。 但是它允许你绕开坏页面然后从表中还有的未损坏的页面上继续检索数据行。 因此它在因为硬件或者软件错误导致的崩溃中进行恢复是很有用的。 通常你不应该把它设置为真,除非你已经彻底放弃从崩溃底页面中恢复数据。缺省的设置是关闭,并且只有超级用户可以改变它。

16.4.14. 短选项

为了方便起见,这里还为一些参数提供了好多单字母命令行选项开关。 它们在下Table 16-1里描述。

Table 16-1. 短选项键字

短选项等效
-B xshared_buffers = x
-d xserver_min_messages = DEBUGx
-Ffsync = off
-h xlisten_addresses = x
-ilisten_addresses = '*'
-k xunix_socket_directory = x
-lssl = on
-N xmax_connections = x
-p xport = x
-fi, -fh, -fm, -fn, -fs, -ft[a] enable_indexscan = off, enable_hashjoin = off, enable_mergejoin = off, enable_nestloop = off, enable_seqscan = off, enable_tidscan = off
-s[a]log_statement_stats = on
-S x[a]work_mem = x
-tpa,-tpl,-te[a]log_parser_stats = on, log_planner_stats = on, log_executor_stats = on
Notes:
a. 因为历史原因,这些选项通过-o postmaster选项传递给独立得服务器进程,比如,

$ postmaster -o '-S 1024 -s'

或者是通过客户端的 PGOPTIONS, 像上面解释地那样。