3.4. 运行时配置

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

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

设置这些选项的一个方法是在数据目录里(比如 /usr/local/pgsql/data) 创建一个文件 postgresql.conf 比如,下面是一个例子:

# This is a comment
log_connections = yes
syslog = 2
象你看到的那样,选项是每条一行.选项名和值之间的等号是可选的. 空白和空行被忽略.井号(“#”)用做任何地方 引入注释.

每次 postmaster 收到 SIGHUP 信号后都会重新读取这个配置文件. 这个信号同样也广播给所有正在运行的后端进程,所以正在运行 的会话得到新的缺省.另外,你可以只向一个后端进程直接发送信号.

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

postmaster -c log_connections=yes -c syslog=2
这样和上面的例子有同样效果. 命令行选项覆盖任何与 postgresql.conf 冲突的选项.

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

env PGOPTIONS='-c geqo=off' psql
(这个选项可以用于任何客户端应用,不光是 psql.)请注意,这个变量对那些需要在 服务器启动后固定的选项是无效的,比如端口号.

最后,有些选项可以在独立的 SQL 会话中修改,使用 SET 命令,比如

=> SET ENABLE_SEQSCAN TO OFF;
请参考 SQL 命令语言手册获取命令语法的详细信息.

3.4.1. 规划器和优化器调节

CPU_INDEX_TUPLE_COST (浮点数)

设置在一次索引扫描中优化器计算出来的处理每条索引元组的开销. 这是以一次顺序页面抓取的开销的分数来计量的.

CPU_OPERATOR_COST (浮点数)

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

CPU_TUPLE_COST (浮点数)

设置优化器预计在一次查询中处理每条元组的开销. 这是以一次顺序页面抓取的开销的分数来计量的.

EFFECTIVE_CACHE_SIZE (浮点数)

设置优化器假设的磁盘缓冲的有效尺寸(内核的磁盘缓冲中将被 Postgres数据文件使用的比例). 这是以磁盘页面计量的,通常是 8KB/页.

ENABLE_HASHJOIN (布尔数)

允许或禁止查询规划器使用散列连接( hash-join )规划类型. 缺省是允许.这个选项对调试查询规划器很有用.

ENABLE_INDEXSCAN (布尔数)

允许或禁止查询规划器使用索引扫描规划类型. 缺省是允许.这个选项对调试查询规划器很有用.

ENABLE_MERGEJOIN (布尔数)

允许或禁止查询规划器使用融合连接规划类型. 缺省是允许.这个选项对调试查询规划器很有用.

ENABLE_NESTLOOP (布尔数)

允许或禁止查询规划器使用嵌套循环连接规划. 实际上不可能完全禁止使用嵌套循环连接,不过把这个选项设置为 禁止会令优化器在存在其它方法的情况下优先选用其它方法. 缺省是允许.这个选项对调试查询规划器很有用.

ENABLE_SEQSCAN (布尔数)

允许或禁止查询规划器使用顺序扫描规划类型. 实际上不可能完全禁止规划器使用顺序扫描,不过把这个选项设置为 禁止会令优化器在存在其它方法的情况下优先选用其它方法. 缺省是允许.这个选项对调试查询规划器很有用.

ENABLE_SORT (布尔数)

允许或禁止查询规划器使用明确的排序步骤. 实际上不可能完全禁止规划器使用排序,不过把这个选项设置为 禁止会令优化器在存在其它方法的情况下优先选用其它方法. 缺省是允许.这个选项对调试查询规划器很有用.

ENABLE_TIDSCAN (布尔)

允许或禁止查询规划器使用 TID 扫描规划类型. 缺省是允许.这个选项对调试查询规划器很有用.

GEQO (布尔

允许或禁止基因查询优化,这是一种试图不通过穷举搜索来实现 查询规划的算法.缺省是允许.参阅各种其他 GEQO_ 设置.

GEQO_EFFORT (整数), GEQO_GENERATIONS (整数), GEQO_POOL_SIZE (整数), GEQO_RANDOM_SEED (整数), GEQO_SELECTION_BIAS (浮点数

各种各样的调节基因查询优化的参数: 缓冲池大小(pool size)是一个全体中的个体的数量.有效值介于 128 和 1024 之间.如果把它设置为 0(缺省),那么就使用 2^(QS+1) 大小的缓冲池,这里 QS 是查询中关系的数量.影响(effort)用于为每一代 计算一个缺省值.有效值是介于 1 和 80 之间的数字,40 是缺省值. 代(Generations)声明算法中的反复次数.此数字必须是正整数. 如果声明了 0,那么就使用 Effort * Log2(PoolSize).此算法的运行 时间大概是缓冲池大小(pool size)和代(Generations)之和的分数. 选择偏移(selection bias)是全体内部的选择性压力 (selective pressure). 其值可以介于 1.50 到 2.00 之间;后者是缺省. 随机种子可以设置为让这个算法表现为能够产生可复现的值.如果把 它设置为 -1 那么此算法的行为将不可判定.

GEQO_THRESHOLD (整数

只有当涉及的 FROM 关系数量至少有 GEQO_THRESHOLD 个时,才使用基因查询优化. (请注意一个 JOIN 构造只算做一个 FROM 项.) 缺省是 11,对于数量小于此数的查询,也许使用判定性的穷举搜索更 有效.

KSQO (布尔

Key Set Query Optimizer(键集查询优化)KSQO)促使查询优化器把一个 WHERE 子句里面 有很多 OR,AND 子句的查询,( 比如 WHERE (a=1 AND b=2) OR (a=2 AND b=3) ...转换成一个 UNION 查询.这个方法比缺省实现快得多, 但是它不一定给出完全一样的结果,因为 UNION 隐含地增加了一条 SELECT DISTINCT 子句以消除重复输出行. 当和类似Microsoft Access这样的 产品一起使用的时候,常常用到 KSQO,因为它总是喜欢生成上面 样子的查询.

以前,对那些有许多 OR 和 AND 子句的查询,KSQO 是绝对必要的,但是到了 Postgres 7.0 和以后,标准的规划器 就可以很合理地处理这些查询.因此缺省是 OFF.

RANDOM_PAGE_COST (浮点数

设置优化器计算的一次非顺序磁盘页面抓取的开销. 这是以顺序磁盘页面抓取的开销的倍数计量的.

注意: 糟糕的是,我们没有很好的定义我们上面刚刚描述完的“COST(开销)” 家族的典型值的方法.我们鼓励你自己试验并且与我们共享你的发现.

3.4.2. 日志和调试

DEBUG_ASSERTIONS (布尔

打开各种断言检查.这是调试助手.如果你经历了奇怪的毛病或者 崩溃,可能你希望把这个选项打开,因为它可能会暴露程序的错误. 要使用这个选项,制作 Postgres 的时候必须定义 USE_ASSERT_CHECKING宏. (参阅配置选项 --enable-cassert). 请注意如果 Postgres 是这样制作的话,那么 DEBUG_ASSERTIONS 缺省是 ON.

DEBUG_LEVEL (整数

这个值越高,那么在服务器运行过程中 就有越多 “调试”日志生成. 缺省时,此值为 0,意味着没有调试输出.目前有意义的最高值为 4.

DEBUG_PRINT_PARSE (布尔), DEBUG_PRINT_PLAN (布尔), DEBUG_PRINT_REWRITTEN (布尔), DEBUG_PRINT_QUERY (布尔), DEBUG_PRETTY_PRINT (布尔

对于任何执行的查询,把该查询,它生成的分析树,它生成的执行规划,或者其 查询重写输出打印到服务器日志中. 选择 DEBUG_PRETTY_PRINT 会生成漂亮些但是长一些的输出格式. 把 DEBUG_LEVEL 设置为大与零的值会隐含地打开 这些标志中的一些.

HOSTNAME_LOOKUP (布尔

缺省时,联接日志只记录所联接主机的 IP 地址.如果你想显示主机名, 你可以打开这个选项,不过,这样有可能带来一些不可忽略的性能损失, --取决于你的名字解析的设置. 这个选项只能在服务器启动的时候设置.

LOG_CONNECTIONS (布尔

对每次成功的联接都向服务器日志里打印一行信息. 缺省时是关闭的,尽管它可能很有用.这个选项只能在服务器启动的时候设置.

LOG_PID (布尔

在每条服务器信息前面加上后端服务进程的进程号前缀. 这对理出某条信息属于那个联接很有帮助. 缺省时是关闭的.

LOG_TIMESTAMP (布尔

在每条服务器信息前面加上时间戳前缀. 缺省时是关闭的.

SHOW_QUERY_STATS (布尔), SHOW_PARSER_STATS (布尔), SHOW_PLANNER_STATS (布尔), SHOW_EXECUTOR_STATS (布尔

对每条查询,向服务器日志里输出相应模块的性能统计. 这是原始的调节工具.

SHOW_SOURCE_PORT(布尔

在联接日志信息里面显示正在连接的主机的端口号. 你可以回朔此端口号并找出是哪个用户初始化的联接. 因为这个功能基本没用,所以缺省是关闭. 这个选项只能在服务器启动的时候设置.

SYSLOG (整数

Postgres 允许把 syslog 作为日志系统.如果这个选项 设为 1,则信息同时往 syslog 和标准输出输出.如果设为 2, 则只输出到 syslog.(有些信息还是会输出到标准输出/标准错误.) 缺省是 0,意味着关闭向 syslog 的输出. 这个选项只能在服务器启动的时候设置.

要使用 syslog,制作 Postgres 时必须打开 --enable-syslog 配置选项.

SYSLOG_FACILITY (字串)

这个选项在打开 syslog 后判断要使用的 syslog “功能”.你可以从 LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,LOCAL6,LOCAL7 中选择;缺省是 LOCAL0.参阅你的系统的 syslog

SYSLOG_IDENT (字串)

如果打开了向 syslog 中记日志的功能, 这个选项决定用于在 syslog 日志信息中标识 PostgreSQL 的程序名.缺省是 “postgres”.

TRACE_NOTIFY (布尔

LISTENNOTIFY 命令生成一大堆调试输出.

3.4.3. 一般操作

DEADLOCK_TIMEOUT (整数

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

FSYNC (布尔

如果这个选项打开,Postgres后端就会在若干个 位置调用fsync()系统调用以保证更新物理地写入磁盘 而不是悬在写缓冲区里. 这样做增加了一个数据库安装在经历了大规模的操作系统或硬件 崩溃后仍然可用的机会.(数据库服务器的崩溃不会 出现这个问题).

不过,这个操作大大地降低了 Postgres 的速度,因为在所有的这些位置,它都必须 停下来等待操作系统输出它的缓冲区. 没有 fsync的时候,操作系统就可以尽可能地处理好 缓冲,排序,和后写,因此可以有非常显著的性能提升. 不过,如果系统崩溃,一次已经提交的事务的部分数据--对应是磁盘上 的信息--将仍然停留在内存中.就可能导致不连贯的数据

这个选项一直在Postgres用户和开发者社团里有 争论,有些人总是把它关闭,有些人只是在大量数据装载的时候才 关闭它,这样如果出错了的话就有一个显而易见的重新开始的起点. 有些人把它打开只是为了保证安全.因为这样做更安全,所以 缺省是打开的.如果你信任你的操作系统,你的 硬件和你的工具公司(或者是你的 UPS),你可能愿意关闭它.

我们需要指出的是做 fsync 的性能下降在 Postgres 版本 7.1 里面比以前版本显著减少了.如果以前你因为性能原因 禁止了 fsync,那么现在你可能会重新考虑一下.

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

KRB_SERVER_KEYFILE

设置 Kerberos 服务器密钥文件的位置.参阅 Section 4.2.2 获取细节.

MAX_CONNECTIONS (整数

决定允许多少个并发联接.缺省是 32.同时还有一个编译好了的该数值的 硬上限,一般是 1024(两个数都可以在编译服务器时修改). 这个选项只能在服务器启动的时候设置.

MAX_EXPR_DEPTH (整数

设置分析器接受的最大表达式嵌套深度.缺省值对任何常见查询来说 都够高了,但是如果你需要的话你可以提高这个数值. (不过如果你把它升得太高,你就得冒因为栈溢出导致的后端崩溃 的风险.)

PORT (整数

服务器侦听的 TCP 端口;缺省 5432.这个选项只能在服务器启动的时候设置.

SHARED_BUFFERS (整数

设置数据库服务器将使用的共享内存缓冲区数量.缺省是 64. 每个缓冲区大小的典型值是 8192 字节. 这个选项只能在服务器启动的时候设置.

SILENT_MODE (bool)

安静地运行 postmaster.如果设置这个选项, postmaster 将自动 在后台运行并且抛弃掉控制 tty,因此不会有任意信息输出到标准输出 或标准错误(和 postmaster 的 -S 选项效果相同).除非打开了 比如 syslog 这样的日志系统,我们不建议使用这个选项,因为这样 令查找错误信息非常困难.

SORT_MEM (整数

声明在求助于临时磁盘文件之前用于内部排序和散列(hash)的内存 的数量.此值是以千字节为计量单位的,缺省为 512KB. 请注意,对于复杂查询,多个排序和/或散列(hash)可能会并行 运行,而且在开始向临时文件输出数据之前, 每个操作都会被允许使用这里声明的数量的内存. 因为每个后端都会做一个或更多的排序,因此需要的空间可能是 SORT_MEM 的许多倍.

SQL_INHERITANCE (布尔

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

SSL (布尔数)

打开 SSL 联接.使用之前请参阅 Section 3.7 .缺省是关.

TCPIP_SOCKET (布尔

如果此值为真,那么服务器接受 TCP/IP 联接. 否则只接受本地的 Unix 域套接字联接. 缺省是关闭. 这个选项只能在服务器启动的时候设置.

UNIX_SOCKET_DIRECTORY (string)

声明 postmaster 用于侦听来自客户端应用联接的 Unix 域套接字目录名. 缺省通常是 /tmp,不过可以在制作时改变.

UNIX_SOCKET_GROUP (string)

设置 Unix 域套接字的组所有人.(套接字的所有权用户总是启动 postmaster 的用户.)与 UNIX_SOCKET_PERMISSIONS 选项一起使用可以给这种套接字类型增加额外的访问控制机制. 缺省时是一个空字串,也就是使用当前用户的缺省的组. 这个选项只能在服务器启动时设置.

UNIX_SOCKET_PERMISSIONS (整型)

给 Unix 域套接字设置访问权限.Unix 域套接字使用通常的 Unix 文件系统权限集.可选的值可以是一个 chmodumask 系统调用可以接受的数字模式. (要使用客户化的八进制格式,该数字必须以 0 (零)开头.)

缺省权限是 0777,意即任何人都可以联接. 合理的选则可能是0770 (只有用户和组, 参阅UNIX_SOCKET_GROUP)和 0700 (只有用户). (请注意对于 Unix 套接字而言,实际上只有写权限有意义,而且 也没有办法设置或者取消读或执行权限.)

这种访问控制机制是和 Chapter 4. 里面描述的那些完全独立的.

这个选项只能在服务器启动时设置.

VIRTUAL_HOST (string)

声明 postmaster 用于侦听来自客户端应用联接的 TCP/IP 主机名或者地址. 缺省是 PGHOST 环境变量的值, 如果没有设置 PGHOST,缺省是侦听 所有配置了的地址(包括 localhost).

3.4.4. WAL

又见 Section 9.3 获取 WAL 调节的细节.

CHECKPOINT_SEGMENTS (整数)

在自动 WAL 检查点之间的最大距离,单位是日志文件段 (每个段一般是 16 兆字节). 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.

CHECKPOINT_TIMEOUT (整数)

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

WAL_BUFFERS (整数)

共享内存中用于 WAL 的磁盘页缓冲区数目. 这个选项只能在服务器启动时设置.

WAL_DEBUG (整数)

如果为非零,则在标准错误上打开与 WAL 相关的调试输出.

WAL_FILES (整数)

在检查点时预先创建的日志文件数目. 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.

WAL_SYNC_METHOD (字串)

用于强制 WAL 更新到磁盘上的方法.可能的数值是 FSYNC (在每次提交时调用 fsync()) FDATASYNC (在每次提交时调用 fdatasync()) OPEN_SYNC (用带 O_SYNC 选项的 open 写 WAL 文件),或者是 OPEN_DATASYNC (用带 O_DSYNC 选项的 open 写 WAL 文件). 并非在所有平台上都可以使用这些选项. 这个选项只能在服务器启动的时候设置,或者设置在 postgresql.conf 文件里.

3.4.5. 短选项

为了方便起见,这里还为许多参数提供了好多单字母选项开关. 它们在下表里描述.

Table 3-1. 短选项键字

短选项等效评注
-B xshared_buffers = x 
-d xdebug_level = x 
-Ffsync = off 
-h xvirtual_host = x 
-itcpip_socket = on 
-k xunix_socket_directory = x 
-lssl = on 
-N xmax_connections = x 
-p xport = x 
-fi, -fh, -fm, -fn, -fs, -ftenable_indexscan=off, enable_hashjoin=off, enable_mergejoin=off, enable_nestloop=off, enable_seqscan=off, enable_tidscan=off*
-S xsort_mem = x*
-sshow_query_stats = on*
-tpa, -tpl, -teshow_parser_stats=on, show_planner_stats=on, show_executor_stats=on*
由于历史原因,带有 “*” 标记的选项必须通过 postmaster 的-o选项传递给独立的后端进程,例如,
> postmaster -o '-S 1024 -s'
或者通过客户端的PGOPTIONS,象前面的例子那样.