16.4. 运行时配置 #
有大量配置参数会影响数据库系统的行为。在本小节中,我们描述如何设置配置参数;随后的小节将逐一详细讨论每个参数。
所有参数名都不区分大小写。每个参数取以下四种类型之一的值:布尔、整数、浮点和字符串。布尔值可以是 ON、OFF、TRUE、FALSE、YES、NO、1、0(不区分大小写)或其中任何一个无歧义的前缀。
设置这些参数的一种方法是编辑数据目录中的
postgresql.conf
文件。(安装时会在此处放置一个默认文件。)该文件的内容可能类似于:
# This is a comment log_connections = yes syslog = 2 search_path = '$user, public'
每行指定一个参数。名称和值之间的等号是可选的。空白无关紧要,空行会被忽略。井号(#)可在任何位置引入注释。不是简单标识符或数字的参数值应当用单引号引起来。
每当 postmaster 进程收到
SIGHUP 信号时(用 pg_ctl reload 发送最为简单),配置文件就会被重新读取。postmaster 还会把该信号传播给所有当前运行的服务器进程,使现有会话也获得新值。另外,你也可以直接把信号发送给单个服务器进程。
设置这些配置参数的第二种方法是把它们作为命令行选项传给
postmaster,例如:
postmaster -c log_connections=yes -c syslog=2
命令行选项覆盖 postgresql.conf 中任何与之冲突的设置。
有时,只给某个特定会话指定命令行选项也很有用。为此可以在客户端一侧使用环境变量 PGOPTIONS:
env PGOPTIONS='-c geqo=off' psql
(这适用于任何基于 libpq 的客户端应用程序,不只是 psql。)注意,对那些在服务器启动时已固定的参数(例如端口号),这种方式不起作用。
此外,还可以把一组选项设置指派给某个用户或某个数据库。每当会话启动时,会加载相关用户和数据库的默认设置。配置这些设置分别使用
ALTER DATABASE 和 ALTER
USER 命令。每数据库设置覆盖从 postmaster
命令行或配置文件获得的任何设置,并依次被每用户设置覆盖;两者都会被每会话选项覆盖。
有些参数可以在单个 SQL 会话中用SET命令更改,例如:
SET ENABLE_SEQSCAN TO OFF;
如果允许 SET,它将覆盖该参数所有其他来源的值。超级用户被允许 SET 的值比普通用户更多。
SHOW命令允许查看所有参数的当前值。
虚拟表 pg_settings(见第 43.34 节)也允许显示和更新会话运行时参数。它等价于 SHOW 和 SET,但用起来可能更方便,因为它可以与其他表连接,或用任何想要的选择条件进行查询。
16.4.1. 连接和认证 #
16.4.1.1. 连接设置 #
tcpip_socket(boolean)如果为真,服务器将接受 TCP/IP 连接。否则只接受本地 Unix 域套接字连接。默认是关闭的。这个选项只能在服务器启动时设置。
max_connections(integer)决定数据库服务器允许的最大并发连接数。默认值通常是 100,但如果内核设置不支持(在 initdb 期间确定),则可能更少。这个参数只能在服务器启动时设置。
增加这个参数可能会导致PostgreSQL请求比操作系统的默认配置所允许的更多的System V 共享内存或信号量。如有必要,关于如何调整这些参数的信息见第 16.5.1 节。
superuser_reserved_connections(integer)决定为 PostgreSQL 超级用户的连接保留多少个“连接槽”。同时活跃的连接数最多始终只能达到
max_connections。每当活跃并发连接数至少达到max_connections减去superuser_reserved_connections时,新连接将只接受超级用户。默认值是 2。该值必须小于
max_connections的值。这个参数只能在服务器启动时设置。port(integer)服务器监听的 TCP 端口,默认是 5432。这个选项只能在服务器启动时设置。
unix_socket_directory(string)指定服务器用于监听来自客户端应用连接的 Unix 域套接字所在的目录。默认值通常是
/tmp,但可以在构建时更改。unix_socket_group(string)设置 Unix 域套接字的所属组。(套接字的所属用户总是启动服务器的用户。)与选项
unix_socket_permissions组合,可以作为这种套接字类型的一种附加访问控制机制。默认是一个空字符串,表示使用当前用户的默认组。这个选项只能在服务器启动时设置。unix_socket_permissions(integer)设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。选项值应是以
chmod和umask系统调用所接受格式指定的数字权限模式。(要使用惯用的八进制格式,数字必须以0(零)开头。)默认权限是
0777,表示任何人都可以连接。合理的其他取值包括0770(仅用户和组,另见unix_socket_group)和0700(仅用户)。(注意,对 Unix 域套接字而言,实际上只有写权限起作用,设置或撤销读权限和执行权限没有意义。)此访问控制机制独立于第 19 章中描述的机制。
这个选项只能在服务器启动时设置。
virtual_host(string)指定服务器用于监听来自客户端应用连接的主机名或 IP 地址。默认是监听所有已配置的地址(包括 localhost)。
rendezvous_name(string)指定 Rendezvous 广播名。默认使用计算机名,即指定为 ''。
16.4.1.2. 安全和认证 #
authentication_timeout(integer)完成客户端认证的最长时间,以秒为单位。如果一个潜在客户端没有在这段时间里完成认证协议,服务器将断开连接。这防止了挂起的客户端无限期占用连接。这个选项只能在服务器启动时或在
postgresql.conf文件中设置。默认值是 60。ssl(boolean)启用SSL连接。使用前请阅读第 16.7 节。默认是关闭的。
ssl_renegotiation_limit(integer)指定在一个SSL加密连接上可以流过多少数据之后将进行会话的重新协商。在发送大量数据时,重新协商能降低被密码分析的机会,但它也会带来很大的性能损失。该限制以发送和接收流量的总和来检查。如果这个参数被设置为 0,则禁用重新协商。默认值为
512MB。注意
2009 年 11 月之前的 SSL 库在使用 SSL 重新协商时不安全,原因是 SSL 协议中的一个漏洞。作为针对该漏洞的权宜修复,一些厂商发布的 SSL 库不具备重新协商能力。如果在客户端或服务器上正在使用这类库,应当禁用 SSL 重新协商。
password_encryption(boolean)在
CREATE USER或ALTER USER中指定口令,且既没有写ENCRYPTED也没有写UNENCRYPTED时,这个选项决定口令是否被加密。默认是打开的(加密口令)。krb_server_keyfile(string)设置 Kerberos 服务器密钥文件的位置。详情见第 19.2.3 节。
db_user_namespace(boolean)此参数允许各数据库独立的用户名。默认是关闭的。
如果启用此参数,你应以
username@dbname的形式创建用户。连接的客户端传入username时,会在用户名后附加@和数据库名,然后由服务器查找此数据库专属的用户名。请注意,在 SQL 环境中创建名称包含@的用户时,需要用引号括起用户名。启用此参数后,仍然可以创建普通的全局用户。只需在客户端指定用户名时附加
@。服务器查找用户名之前会去掉@。注意
此特性旨在作为找到完整解决方案之前的临时措施。届时将移除此选项。
16.4.2. 资源消耗 #
16.4.2.1. 内存 #
shared_buffers(integer)设置数据库服务器使用的共享内存缓冲区数量。默认值通常是 1000,但如果内核设置不支持(在 initdb 期间确定),则可能更少。除非在构建服务器时选择了不同的
BLCKSZ值,每个缓冲区为 8192 字节。此设置必须至少为 16,并且至少是max_connections值的两倍;不过,要获得良好的性能,通常需要显著高于最小值的设置。对于生产安装,建议取几千的值。这个选项只能在服务器启动时设置。增加这个参数可能会导致PostgreSQL请求比操作系统的默认配置所允许的更多的System V 共享内存。如有必要,关于如何调整这些参数的信息见第 16.5.1 节。
sort_mem(integer)指定内部排序操作和哈希表在切换到临时磁盘文件之前可使用的内存量。值以千字节为单位指定,默认为 1024 千字节(1 MB)。注意,对于复杂查询,可能同时运行多个排序或哈希操作;每一个在被允许开始把数据放入临时文件之前,都可以使用多达该值所指定的内存。此外,多个运行中的会话可能同时进行排序操作。因此,使用的总内存可能是
sort_mem值的许多倍。排序操作由ORDER BY、归并连接和CREATE INDEX使用。哈希表用于哈希连接、基于哈希的聚合以及基于哈希的IN子查询处理。由于恢复数据库时会使用CREATE INDEX,在进行大型恢复操作之前增大sort_mem可以提升性能。vacuum_mem(integer)指定
VACUUM用于跟踪待回收行所用的最大内存量。值以千字节为单位指定,默认为 8192 kB。对包含大量已删除行的大表进行清理时,更大的设置可能提升清理速度。
16.4.2.2. 空闲空间映射 #
max_fsm_pages(integer)设置共享空闲空间映射中为其跟踪空闲空间的磁盘页最大数量。每个页槽占用 6 字节共享内存。此设置必须大于 16 *
max_fsm_relations。默认值是 20000。这个选项只能在服务器启动时设置。max_fsm_relations(integer)设置共享空闲空间映射中为其跟踪空闲空间的关系(表和索引)的最大数量。每个槽大约占用 50 字节共享内存。默认值是 1000。这个选项只能在服务器启动时设置。
16.4.2.3. 内核资源使用 #
max_files_per_process(integer)设置每个服务器子进程允许同时打开的最大文件数。默认值是 1000。如果内核正在强制执行一个安全的每进程限制,则无需担心此设置。但在某些平台上(特别是大多数 BSD 系统),当大量进程都试图打开那么多文件时,内核会允许单个进程打开远超系统真正能够支持的文件数。如果你发现出现“Too many open files”失败,可尝试调低此设置。这个选项只能在服务器启动时设置。
preload_libraries(string)此变量指定服务器启动时预装载的一个或多个共享库。可以选择为每个库调用一个无参数的初始化函数。要指定它,在库名后加冒号和初始化函数名。例如
'$libdir/mylib:mylib_init'会导致预装载mylib并执行mylib_init。如果要装载多个库,用逗号分隔它们的名称。如果找不到
mylib或mylib_init,服务器将无法启动。PostgreSQL 过程语言库可以用这种方式预装载,通常使用语法
'$libdir/plXXX:plXXX_init',其中XXX是pgsql、perl、tcl或python。通过预装载共享库(并在适用时初始化它),可以避免首次使用该库时的库启动时间。不过,每个新服务器进程的启动时间可能增加,即使该进程从未使用过这个库。
16.4.3. 预写式日志 #
关于 WAL 调优的细节另见第 25.3 节。
16.4.3.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 文件)。并非所有平台上这些选择都可用。这个选项只能在服务器启动时或在postgresql.conf文件中设置。wal_buffers(integer)共享内存中用于 WAL 日志的磁盘页缓冲区数量。默认值是 8。这个选项只能在服务器启动时设置。
16.4.3.2. 检查点 #
checkpoint_segments(integer)自动 WAL 检查点之间的最大距离,以日志文件段为单位(每段通常为 16 兆字节)。默认值是三。这个选项只能在服务器启动时或在
postgresql.conf文件中设置。checkpoint_timeout(integer)自动 WAL 检查点之间的最长时间,以秒为单位。默认值是 300 秒。这个选项只能在服务器启动时或在
postgresql.conf文件中设置。checkpoint_warning(integer)如果检查点段文件写满所导致的检查点发生得比这个秒数更频繁,就向服务器日志写一条消息。默认值是 30 秒。零会关闭该警告。
commit_delay(integer)向 WAL 缓冲区写入提交记录与把缓冲区刷到磁盘之间的时间延迟,以微秒为单位。非零的延迟允许多个事务只通过一次
fsync()系统调用提交,前提是系统负载足够高,在给定的时间间隔内可能有额外的事务准备好提交。但如果没有其他事务准备好提交,该延迟就白白浪费了。因此,只有当服务器进程写入其提交记录的瞬间,至少有commit_siblings个其他事务处于活跃状态时,才执行该延迟。默认值是零(无延迟)。commit_siblings(integer)执行
commit_delay延迟之前所要求的最少并发打开事务数。更大的值使在延迟间隔内至少有另一个事务准备好提交更有可能。默认值是五。
16.4.4. 查询规划 #
16.4.4.1. 规划器方法配置 #
注意
这些配置参数提供了一种影响查询优化器所选查询计划的粗略方法。如果优化器为某个查询选择的默认计划不是最优的,可以临时用其中一个配置参数强制优化器选择更好的计划。改进优化器所选计划质量的其他方法包括配置 规划器代价常量
、更频繁地运行
ANALYZE,以及使用
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.4.2. 规划器代价常量 #
注意
遗憾的是,没有定义良好的方法来确定下面这组“代价”变量的理想值。鼓励你进行实验并分享你的发现。
effective_cache_size(floating point)设置规划器关于磁盘缓存有效大小的假设(即内核磁盘缓存中将被用于 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.4.3. 遗传查询优化器 #
geqo(boolean)启用或禁用遗传查询优化,它是一种试图不做穷举搜索就完成查询规划的算法。默认是打开的。另见其他各种
geqo_设置。geqo_threshold(integer)当查询涉及的
FROM项至少达到此数量时,使用遗传查询优化进行规划。(注意,一个外层JOIN结构只算一个FROM项。)默认值是 11。对较简单的查询,通常最好使用确定性的穷举规划器,但对有很多表的查询,确定性规划器耗时太长。geqo_effort(integer)geqo_generations(integer)geqo_pool_size(integer)geqo_selection_bias(floating point)遗传查询优化算法的各种调整参数:池大小(pool size)是一个种群中个体的数量。有效值在 128 到 1024 之间。如果设置为 0(默认值),则取池大小为 2^(QS+1),其中 QS 是查询中
FROM项的数量。effort 用于计算 generations 的默认值。有效值在 1 到 80 之间,默认为 40。generations 指定算法中迭代的次数。该数必须是正整数。如果指定为 0,则使用Effort * Log2(PoolSize)。算法的运行时间大致与池大小和 generations 之和成正比。选择偏差(selection bias)是种群内的选择压力。取值可以从 1.50 到 2.00;后者是默认值。
16.4.4.4. 其他规划器选项 #
default_statistics_target(integer)为没有通过
ALTER TABLE SET STATISTICS设置列专属目标的表列设置默认统计目标。较大的值会增加ANALYZE所需的时间,但可能改进规划器估计的质量。默认值是 10。from_collapse_limit(integer)如果合并后得到的 FROM 列表包含的项不多于此数,规划器就会把子查询合并到上层查询中。较小的值减少规划时间,但可能得到较差的查询计划。默认值是 8。通常明智的做法是让它小于
geqo_threshold。join_collapse_limit(integer)每当得到的列表包含的项不多于此数时,规划器就会把显式的内层
JOIN结构展平为FROM项列表。通常把它设置得与from_collapse_limit相同。把它设置为 1 可以阻止内层JOIN的任何展平,从而可以用显式JOIN语法来控制连接顺序。中间值可用于在规划时间与计划质量之间权衡。
16.4.5. 错误报告和日志 #
16.4.5.1. Syslog #
syslog(integer)PostgreSQL 允许使用 syslog 记录日志。如果此选项设置为 1,消息会同时发送到 syslog 和标准输出。设置为 2 则只把输出发送到 syslog。(有些消息仍会发送到标准输出/错误。)默认值是 0,表示 syslog 关闭。此选项必须在服务器启动时设置。
syslog_facility(string)此选项决定启用通过 syslog 记录日志时所使用的 syslog “设施”。可以从
LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5、LOCAL6、LOCAL7中选择;默认值是LOCAL0。另见你的系统的 syslog 文档。syslog_ident(string)如果启用了记录到 syslog,此选项决定在 syslog 日志消息中用于标识 PostgreSQL 消息的程序名。默认值是
postgres。
16.4.5.2. 何时记录日志 #
client_min_messages(string)控制发送到客户端的消息级别。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、WARNING和ERROR。每个级别包括排在它之后的全部级别。级别越靠后,发送的消息越少。默认值是NOTICE。注意,LOG在这里的级别排序与在log_min_messages中不同。log_min_messages(string)控制写入服务器日志的消息级别。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、LOG、FATAL和PANIC。每个级别包括排在它之后的全部级别。级别越靠后,发送到日志的消息越少。默认值是NOTICE。注意,LOG在这里的级别排序与在client_min_messages中不同。只有超级用户能调高此选项。log_error_verbosity(string)控制服务器日志中为每条被记录消息写入的细节量。有效值是
TERSE、DEFAULT和VERBOSE,每个都比前一个向显示的消息中增加更多字段。log_min_error_statement(string)控制导致错误条件的 SQL 语句是否也记录到服务器日志中。所有导致指定级别或更高级别错误的 SQL 语句都会被记录。默认值是
PANIC(对正常使用而言实际上关闭了此特性)。有效值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、FATAL和PANIC。例如,如果把它设置为ERROR,那么所有导致错误、致命错误或恐慌的 SQL 语句都将被记录。启用此选项有助于追踪服务器日志中出现的任何错误的来源。只有超级用户能调高此选项。log_min_duration_statement(integer)设置语句被记录的最短执行时间(以毫秒为单位)。所有运行时间达到或超过指定时间的 SQL 语句都将连同其时长被记录。设置为零会打印所有查询及其时长。负一(默认值)禁用此功能。例如,如果把它设置为
250,那么所有运行 250ms 或更长时间的 SQL 语句都将被记录。启用此选项有助于追踪应用程序中未经优化的查询。如果此选项是由管理员设置的,则只有超级用户能调高它或把它设置为负一。silent_mode(boolean)让服务器静默运行。如果设置了此选项,服务器将自动在后台运行,并脱离任何控制终端。这样,不会有任何消息写到标准输出或标准错误(效果与
postmaster的-S选项相同)。除非启用了 syslog 日志,否则不建议使用此选项,因为它会使你无法看到错误消息。
下面是这些设置中使用的各种消息严重级别的列表:
DEBUG[1-5]提供供开发者使用的信息。
INFO提供用户隐式请求的信息,例如在
VACUUM VERBOSE期间。NOTICE提供可能对用户有帮助的信息,例如长标识符被截断以及作为主键一部分创建索引。
WARNING向用户提供警告,例如在事务块之外执行
COMMIT。ERROR报告导致当前事务中止的错误。
LOG报告管理员可能关心的信息,例如检查点活动。
FATAL报告导致当前会话中止的错误。
PANIC报告导致所有会话中止的错误。
16.4.5.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_duration(boolean)使每条已完成语句的时长都被记录。要使用此选项,请启用
log_statement和log_pid,以便能用进程 ID 把语句和时长关联起来。默认是关闭的。如果此选项是由管理员启用的,则只有超级用户能把它关闭。log_pid(boolean)在服务器日志文件的每条消息前加上服务器进程的进程 ID。这有助于分清哪些消息属于哪个连接。默认是关闭的。此参数不影响通过 syslog 记录的消息,那些消息总是包含进程 ID。
log_statement(boolean)使每条 SQL 语句都被记录。默认是关闭的。如果此选项是由管理员启用的,则只有超级用户能把它关闭。
log_timestamp(boolean)在服务器日志的每条消息前加上时间戳。默认是关闭的。
log_hostname(boolean)默认情况下,连接日志只显示连接主机 IP 地址。如果想让它显示主机名,可以打开此选项,但取决于你的主机名解析配置,这可能带来不可忽视的性能损失。此选项只能在服务器启动时设置。
log_source_port(boolean)在连接日志消息中显示连接主机的源端口号。你可以追溯端口号,找出是哪个用户发起的连接。除此之外它没什么用处,因此默认是关闭的。此选项只能在服务器启动时设置。
16.4.6. 运行时统计 #
16.4.6.1. 统计监控 #
log_statement_stats(boolean)log_parser_stats(boolean)log_planner_stats(boolean)log_executor_stats(boolean)对每个查询,把相应模块的性能统计写入服务器日志。这是一种粗略的性能剖析工具。所有这些选项默认都是禁用的。如果这些选项是由管理员启用的,则只有超级用户能把它们关闭。
16.4.6.2. 查询和索引统计收集器 #
stats_start_collector(boolean)控制服务器是否应启动统计收集子进程。默认是打开的,但如果你确定对收集统计信息没有兴趣,可以把它关闭。此选项只能在服务器启动时设置。
stats_command_string(boolean)启用对每个会话当前正在执行的命令及其开始执行时间的统计收集。此选项默认是关闭的。注意,即使启用了它,这些信息也不是对所有用户可见,只有超级用户和被报告会话的属主才能看到;因此它不会构成安全风险。这些数据可以通过
pg_stat_activity系统视图访问;更多信息参见第 23 章。stats_block_level(boolean)stats_row_level(boolean)分别启用对数据库活动的块级和行级统计的收集。这些选项默认是关闭的。这些数据可以通过
pg_stat和pg_statio系列系统视图访问;更多信息参见第 23 章。stats_reset_on_server_start(boolean)如果打开,收集到的统计信息在服务器每次重启时清零。如果关闭,统计信息跨服务器重启累计。默认是打开的。此选项只能在服务器启动时设置。
16.4.7. 客户端连接默认值 #
16.4.7.1. 语句行为 #
search_path(string)此变量指定当对象(表、数据类型、函数等)以不带模式部分的简单名称被引用时,搜索模式的顺序。当不同模式中存在同名的对象时,使用搜索路径中最先找到的那个。不在搜索路径任何模式中的对象,只能通过用限定(带点号)名称指定其所属模式来引用。
search_path的值必须是一个逗号分隔的模式名列表。如果列表项之一是特殊值$user,则替换为名为SESSION_USER返回值的模式(如果存在这样的模式)。(如果不存在,$user被忽略。)系统目录模式
pg_catalog总是被搜索,无论路径中是否提到它。如果路径中提到了它,则按指定的顺序搜索。如果pg_catalog不在路径中,则会在搜索任何路径项之前搜索它。同样,当前会话的临时表模式
pg_temp_(如果存在)也总是被搜索。可以使用别名nnnpg_temp把它显式列在路径中。如果它没有列在路径中,则会最先被搜索(甚至在pg_catalog之前)。不过,只有关系(表、视图、序列等)和数据类型名称才搜索临时模式,函数和操作符名称永远不会搜索它。当创建对象而没有指定特定的目标模式时,对象会被放在搜索路径中列出的第一个模式中。如果搜索路径为空,则会报告错误。
此参数的默认值是
'$user, public'(其中第二部分在没有名为public的模式时被忽略)。这支持共享使用一个数据库(其中没有用户拥有私有模式,所有人共享使用public)、每用户私有模式以及两者的组合。通过全局或逐用户地更改默认搜索路径设置,可以获得其他效果。搜索路径的当前有效值可以通过 SQL 函数
current_schemas()查看。这与查看search_path的值并不完全相同,因为current_schemas()显示的是search_path中出现的请求是如何被解析的。关于模式处理的更多信息,见第 5.8 节。
check_function_bodies(boolean)此参数通常为真。设置为假时,它会禁用对
CREATE FUNCTION中函数体字符串的验证。在从转储恢复函数定义时,禁用验证偶尔有用,可以避免前向引用之类的问题。default_transaction_isolation(string)每个 SQL 事务都有一个隔离级别,可以是“读已提交”或“可串行化”。此参数控制每个新事务的默认隔离级别。默认是“读已提交”。
更多信息参见第 12 章和SET TRANSACTION。
default_transaction_read_only(boolean)只读 SQL 事务不能修改非临时表。此参数控制每个新事务的默认只读状态。默认是假(读/写)。
更多信息参见SET TRANSACTION。
statement_timeout(integer)中止任何耗时超过指定毫秒数的语句。值为零时关闭计时器,这也是默认值。
16.4.7.2. 区域和格式化 #
datestyle(string)设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因,此变量包含两个独立的组成部分:输出格式规范(
ISO、Postgres、SQL或German)和日期字段顺序规范(DMY、MDY或YMD)。它们可以分别设置,也可以一起设置。关键字Euro和European是DMY的同义词;关键字US、NonEuro和NonEuropean是MDY的同义词。更多信息见第 8.5 节。默认值是ISO, MDY。timezone(string)设置用于显示和解释时间戳的时区。默认使用系统环境指定的时区。更多信息见第 8.5 节。
australian_timezones(boolean)如果设置为真,
ACST、CST、EST和SAT会被解释为澳大利亚时区,而不是北美/ 南美时区和星期六。默认是假。extra_float_digits(integer)此参数调整浮点值(包括
float4、float8和几何数据类型)显示的位数。参数值被加到标准位数(FLT_DIG或DBL_DIG,视情况而定)上。该值最高可以设置为 2,以包含部分有效的数字;这在转储需要精确恢复的浮点数据时特别有用。也可以设置为负值来抑制不需要的数字。client_encoding(string)设置客户端编码(字符集)。默认使用数据库编码。
lc_messages(string)设置显示消息所用的语言。可接受的值依赖于系统;更多信息见第 20.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。
在某些系统上,此区域设置类别不存在。设置此变量仍然有效,但不会有任何作用。另外,所需语言的已翻译消息也可能不存在。那种情况下你将继续看到英文消息。
lc_monetary(string)设置用于格式化货币金额的区域设置,例如供
to_char函数族使用。可接受的值依赖于系统;更多信息见第 20.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。lc_numeric(string)设置用于格式化数字的区域设置,例如供
to_char()函数族使用。可接受的值依赖于系统;更多信息见第 20.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。lc_time(string)设置用于格式化日期和时间值的区域设置。(目前此设置不起作用,但将来可能会有。)可接受的值依赖于系统;更多信息见第 20.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。
16.4.7.3. 其他默认值 #
explain_pretty_print(boolean)决定
EXPLAIN VERBOSE显示详细的查询树转储时使用缩进格式还是非缩进格式。默认是打开的。dynamic_library_path(string)当需要打开一个动态可加载模块而指定的名称不含目录部分(即名称中不含斜杠)时,系统会在此路径中搜索指定的文件。(所用的名称是
CREATE FUNCTION或LOAD命令中指定的名称。)dynamic_library_path的值必须是一个冒号分隔的绝对目录名列表。如果目录名以特殊值$libdir开头,则替换为编译时确定的 PostgreSQL 包库目录。PostgreSQL 发行版提供的模块就安装在那里。(使用pg_config --pkglibdir可以打印此目录的名称。)例如:dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'
此参数的默认值是
'$libdir'。如果值设置为空字符串,则关闭自动路径搜索。超级用户可以在运行时更改此参数,但以那种方式做的设置只会保持到客户端连接结束,因此这种方法应仅保留用于开发目的。设置此参数的推荐方式是在
postgresql.conf配置文件中。max_expr_depth(integer)设置解析器的最大表达式嵌套深度。默认值 10000 对任何正常查询都足够高,但如有需要可以提高它。(但如果提得太高,就有因栈溢出而导致服务器崩溃的风险。)
16.4.8. 锁管理 #
deadlock_timeout(integer)这是在等待锁多长时间(以毫秒计)之后才检查是否存在死锁条件。死锁检查相对较慢,所以服务器不会在每次等待锁时都运行它。我们(乐观地?)假设生产应用中死锁并不常见,先在锁上等待一会儿,然后才开始检查死锁。增大此值可以减少无谓的死锁检查所浪费的时间,但会减慢真实死锁错误的报告。默认值是 1000(即一秒),这大概是你实践中想要的最小值。在负载很重的服务器上,你可能需要提高它。理想情况下,该设置应当超过你的典型事务时间,以便提高在等待者决定检查死锁之前锁就被释放的机会。
max_locks_per_transaction(integer)共享锁表的大小基于这样的假设:任意时刻最多有
max_locks_per_transaction*max_connections个不同的对象需要加锁。默认值 64 历史上已被证明是足够的,但如果你的客户端在单个事务中会接触许多不同的表,可能需要提高此值。此选项只能在服务器启动时设置。
16.4.9. 版本和平台兼容性 #
16.4.9.1. 以前的 PostgreSQL 版本 #
add_missing_from(boolean)当为
true时,查询引用的表如果尚未出现在FROM子句中,会被自动加入其中。默认值是true,以兼容以前的 PostgreSQL 版本。但此行为不符合 SQL 标准,许多人也不喜欢它,因为它可能掩盖错误。设置为false可获得 SQL 标准行为:拒绝引用未在FROM中列出的表。backslash_quote(string) #此参数控制字符串字面量中是否可以用
\'表示引号。表示引号的首选 SQL 标准方式是把它加倍(''),但 PostgreSQL 历史上也接受\'。然而,使用\'会带来安全风险,因为在某些客户端字符集编码中,存在最后一个字节在数值上等于 ASCII\的多字节字符。如果客户端代码的转义不正确,就可能发生 SQL 注入攻击。让服务器拒绝引号似乎被反斜杠转义的查询,可以防止这种风险。backslash_quote的允许值是on(总是允许\')、off(总是拒绝)和safe_encoding(仅当客户端编码不允许在多字节字符中出现 ASCII\时才允许)。默认设置是safe_encoding。regex_flavor(string)正则表达式的“风格”可以设置为
advanced、extended或basic。默认是advanced。extended设置可用于与 7.4 之前的 PostgreSQL 版本精确向后兼容。sql_inheritance(boolean)此参数控制继承语义,特别是各种命令是否默认包含子表。7.1 之前的版本不包含子表。如果你需要旧行为,可以把此变量设置为关闭,但长远来看,建议你修改应用程序,用
ONLY关键字排除子表。关于继承的更多信息见第 5.5 节。
16.4.9.2. 平台和客户端兼容性 #
transform_null_equals(boolean)打开时,形如
(或expr= NULLNULL =)的表达式会被当作expr处理,即当exprIS NULLexpr求值为空值时返回真,否则返回假。的正确行为是总是返回空值(未知)。因此此选项默认是关闭的。expr= NULL不过,Microsoft Access 中的筛选形式生成的查询看起来是用
来测试空值,因此如果你用该界面访问数据库,可能需要打开此选项。由于形如expr= NULL的表达式(按正确解释)总是返回空值,它们不是很有用,在正常应用中也不常出现,所以此选项实际上没什么害处。但新用户经常对涉及空值的表达式的语义感到困惑,所以此选项默认不打开。expr= NULL注意,此选项只影响字面上的
=操作符,不影响其他比较操作符,也不影响在计算上等价于某个涉及等号操作符表达的其他表达式(例如IN)。因此,此选项不是对不良编程的通用修复。相关信息参见第 9.2 节。
16.4.10. 开发者选项 #
以下选项用于 PostgreSQL 源代码方面的工作,某些情况下也用于协助恢复严重损坏的数据库。在生产数据库环境中没有理由使用它们。因此,它们没有被列入示例
postgresql.conf 文件。注意,其中许多选项需要特殊的源码编译标志才能工作。
debug_assertions(boolean)打开各种断言检查。这是一种调试辅助。如果你遇到奇怪的问题或崩溃,可能需要打开它,因为它可能暴露编程错误。要使用此选项,构建 PostgreSQL 时必须定义宏
USE_ASSERT_CHECKING(通过configure选项--enable-cassert完成)。注意,如果 PostgreSQL 构建时启用了断言,DEBUG_ASSERTIONS默认是打开的。pre_auth_delay(integer)如果非零,新服务器进程被 fork 之后、进行认证过程之前,会发生这么多秒的延迟。这是为了给用调试器附到服务器进程上、追踪认证中的错误行为提供机会。
trace_notify(boolean)为
LISTEN和NOTIFY命令生成大量调试输出。要分别把此输出发送到客户端或服务器日志,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(integer)如果非零,打开与 WAL 相关的调试输出。
zero_damaged_pages(boolean)检测到损坏的页头通常会使 PostgreSQL 报告错误并中止当前事务。把
zero_damaged_pages设置为真会使系统改为报告警告,将损坏页清零并继续处理。此行为会破坏数据,即损坏页上的所有行。但它允许你跳过该错误,从表中可能存在的未损坏页中取回行。因此,当因硬件或软件错误发生损坏时,它对恢复数据很有用。通常,在对从表的损坏页恢复数据不抱希望之前,不应把它设置为真。默认设置是关闭的,且只有超级用户能更改它。
16.4.11. 短选项 #
为方便起见,有些参数还有单字母的命令行选项开关。它们在表 16.1中描述。
表 16.1. 短选项对照
| 短选项 | 等价形式 |
|---|---|
-B | shared_buffers = |
-d | log_min_messages = DEBUG |
-F | fsync = off |
-h | virtual_host = |
-i | tcpip_socket = on |
-k | unix_socket_directory = |
-l | ssl = on |
-N | max_connections = |
-p | port = |
-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 [a]
| sort_mem = |
-tpa, -tpl, -te[a] | log_parser_stats=on,
log_planner_stats=on,
log_executor_stats=on |
[a] 由于历史原因,这些选项必须通过 $
或者从客户端一侧通过 | |