pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
有大量配置参数以各种方式影响数据库系统的行为。这里我们描述如何 设置它们,随后的小节将逐一详细讨论。
所有参数名都不区分大小写。每个参数取以下四种类型之一的值:布尔、 整数、浮点、字符串,如下所述。布尔值可以是 ON、OFF、 TRUE、FALSE、 YES、NO、 1、0(不区分大小写)或 其中任何一个无歧义的前缀。
设置这些选项的一种方法是在数据目录(例如 /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 命令语言参考。
floating point)设置查询优化器对索引扫描期间处理每个索引元组的代价的估计。 它以顺序获取一个页面的代价的一个比例来计量。
floating point)设置优化器对处理 WHERE 子句中每个操作符的代价的估计。它以 顺序获取一个页面的代价的一个比例来计量。
floating point)设置查询优化器对查询期间处理每个元组的代价的估计。它以顺序 获取一个页面的代价的一个比例来计量。
floating point)设置优化器关于磁盘缓存有效大小的假设(即内核磁盘缓存中将被 用于 Postgres 数据文件的部分)。 它以磁盘页为单位计量,每页通常为 8kB。
boolean)启用或禁用查询规划器对哈希连接计划类型的使用。默认是打开的。 这主要用于调试查询规划器。
boolean)启用或禁用查询规划器对索引扫描计划类型的使用。默认是打开的。 这主要用于调试查询规划器。
boolean)启用或禁用查询规划器对归并连接计划类型的使用。默认是打开的。 这主要用于调试查询规划器。
boolean)启用或禁用查询规划器对嵌套循环连接计划的使用。不可能完全压制 嵌套循环连接,但关闭此变量会使规划器在有其他方法可用时不去 使用它。默认是打开的。这主要用于调试查询规划器。
boolean)启用或禁用查询规划器对顺序扫描计划类型的使用。不可能完全压制 顺序扫描,但关闭此变量会使规划器在有其他方法可用时不去使用 它。默认是打开的。这主要用于调试查询规划器。
boolean)启用或禁用查询规划器对显式排序步骤的使用。不可能完全压制显式 排序,但关闭此变量会使规划器在有其他方法可用时不去使用它。 默认是打开的。这主要用于调试查询规划器。
boolean)启用或禁用查询规划器对 TID 扫描计划类型的使用。默认是打开的。 这主要用于调试查询规划器。
boolean)启用或禁用遗传查询优化,它是一种试图不做穷举搜索就完成查询 规划的算法。默认是打开的。另见其他各种 GEQO_ 设置。
integer)integer)integer)integer)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;后者是默认值。随机种子(random seed)可以设置,以从 算法获得可复现的结果。如果设置为 -1,则算法的行为是非确定 性的。
integer)当查询涉及的 FROM 项至少达到此数量时,使用遗传查询优化进行 规划。(注意,一个 JOIN 结构只算一个 FROM 项。)默认值是 11。 对较简单的查询,通常最好使用确定性的穷举规划器。
boolean)键集查询优化器 (KSQO)使查询规划器把 WHERE 子句包含许多 OR 连接的 AND 子句的查询(例如 WHERE (a=1 AND b=2) OR (a=2 AND b=3) ...) 转换为 UNION 查询。这种方法可以比默认实现更快,但它不一定 会给出完全相同的结果,因为 UNION 隐式添加了一个 SELECT DISTINCT 子句来消除相同的输出行。使用 Microsoft Access 之类的产品时通常 会用到 KSQO,它们倾向于生成这种形式的查询。
KSQO 算法过去对包含许多 OR 连接的 AND 子句的查询绝对不可或缺, 但在 Postgres 7.0 及更高版本中, 标准规划器已经能相当好地处理这些查询。因此默认是 OFF。
floating point)设置查询优化器对非顺序获取一个磁盘页的代价的估计。它以顺序 获取一个页面的代价的倍数来计量。
遗憾的是,没有定义良好的方法来确定刚才描述的这组 “COST” 变量的理想值。鼓励你进行实验并分享你的发现。
boolean)打开各种断言检查。这是一种调试辅助。如果你遇到奇怪的问题或 崩溃,可能需要打开它,因为它可能暴露编程错误。要使用此选项, 构建 Postgres 时必须定义宏 USE_ASSERT_CHECKING(见 configure 选项 --enable-cassert)。注意,如果 Postgres 是以这种方式构建的,DEBUG_ASSERTIONS 默认是 ON。
integer)此值设置得越高,服务器运行期间在服务器日志中生成的各种 “调试”输出就越多。此选项默认为 0,表示没有调试 输出。目前大约最高到 4 的值是有意义的。
boolean)boolean)boolean)boolean)boolean)这些标志启用向服务器日志发送各种调试输出。对每个执行的查询, 打印查询文本、所得的语法解析树、查询重写器输出或执行计划 之一。DEBUG_PRETTY_PRINT 会对这些显示进行 缩进,产生更可读但也长得多的输出格式。把 DEBUG_LEVEL 设置为大于零会隐式打开其中一些 标志。
boolean)默认情况下,连接日志只显示连接主机 IP 地址。如果想让它显示 主机名,可以打开此选项,但取决于你的主机名解析配置,这可能 带来不可忽视的性能损失。此选项只能在服务器启动时设置。
boolean)在服务器日志中打印一行,告知每个成功的连接。默认是关闭的, 尽管它可能非常有用。此选项只能在服务器启动时设置。
boolean)在服务器日志的每条消息前加上后端进程的进程 id。这有助于分清 哪些消息属于哪个连接。默认是关闭的。
boolean)在服务器日志的每条消息前加上时间戳。默认是关闭的。
boolean)boolean)boolean)boolean)对每个查询,把相应模块的性能统计写入服务器日志。这是一种 粗略的性能剖析工具。
boolean)在连接日志消息中显示连接主机的源端口号。你可以追溯端口号, 找出是哪个用户发起的连接。除此之外它没什么用处,因此默认是 关闭的。此选项只能在服务器启动时设置。
integer)Postgres 允许使用 syslog 记录日志。如果此选项设置为 1,消息会同时发送到 syslog 和标准输出。设置为 2 则只把输出 发送到 syslog。(有些消息仍会发送到标准输出/错误。)默认值 是 0,表示 syslog 关闭。此选项必须在服务器启动时设置。
要使用 syslog,Postgres 的构建 必须用 --enable-syslog 选项配置。
string)此选项决定启用 syslog 时所使用的 syslog “设施”。 可以从 LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5、 LOCAL6、LOCAL7 中选择;默认值是 LOCAL0。另见你的系统的 syslog 文档。
string)如果启用了记录到 syslog,此选项决定在 syslog 日志消息中用于标识 PostgreSQL 消息的程序名。默认 是 “postgres”。
boolean)为 LISTEN 和 NOTIFY 命令生成大量调试输出。
integer)这是在等待锁多长时间(以毫秒计)之后才检查是否存在死锁条件。 死锁检查相对较慢,所以我们不想在每次等待锁时都运行它。我们 (乐观地?)假设生产应用中死锁并不常见,先在锁上等待一会儿, 然后才开始追问它究竟还能否被解锁。增大此值可以减少无谓的 死锁检查所浪费的时间,但会减慢真实死锁错误的报告。默认值是 1000(即一秒),这大概是你实践中想要的最小值。在负载很重的 服务器上,你可能需要提高它。理想情况下,该设置应当超过你的 典型事务时间,以便提高在等待者决定检查死锁之前锁就被释放的 机会。此选项只能在服务器启动时设置。
boolean)如果此选项打开,Postgres 后端会在多处使用 fsync() 系统调用,确保更新被物理写入磁盘,而不是 滞留在内核缓冲区缓存中。这会大大增加数据库安装在操作系统或 硬件崩溃之后仍然可用的机会。(数据库服务器自身的崩溃 不影响此考虑。)
不过,此操作会减慢 Postgres,因为在所有那些 位置它都必须阻塞并等待操作系统刷新缓冲区。不使用 fsync 时,操作系统被允许尽其所能地对写操作进行 缓冲、排序和延迟,这可以带来可观的性能提升。但是,如果系统 崩溃,最近若干已提交事务的结果可能部分或全部丢失;最坏情况 下,可能发生不可恢复的数据损坏。
此选项是 Postgres 用户和开发者社区中一场 永恒争论的主题。有些始终关闭它,有些只在批量装载时关闭它 (批量装载出问题时存在明确的重启点),还有些只是为保险起见 而保持打开。因为它是安全的一侧,打开也是默认值。如果你信任 你的操作系统、硬件和电力公司(更好的是你有 UPS),可能需要 禁用 fsync。
应当指出,做 fsync 的性能损失在 Postgres 7.1 版中已比以前的版本显著降低。如果你过去因性能问题禁用了 fsync,可以重新考虑你的选择。
此选项只能在服务器启动时或在 postgresql.conf 文件中设置。
string)设置 Kerberos 服务器密钥文件的位置。详情见 第 4.2.2 节。
integer)决定数据库服务器允许的并发连接数。默认值是 32。此值还有一个 编译进服务器的硬上限,通常是 1024(这两个数字都可以在编译 服务器时更改)。这个参数只能在服务器启动时设置。
integer)设置解析器可接受的最大表达式嵌套深度。默认值对任何正常查询 都足够高,但如有需要可以提高它。(但如果提得太高,就有因 栈溢出而导致后端崩溃的风险。)
integer)服务器监听的 TCP 端口,默认是 5432。这个选项只能在服务器启动 时设置。
integer)设置数据库服务器将使用的共享内存缓冲区数量。默认值是 64。 每个缓冲区通常为 8192 字节。这个选项只能在服务器启动时设置。
bool)让 postmaster 静默运行。如果设置了此选项,postmaster 将自动 在后台运行,并脱离任何控制终端,这样,不会有任何消息写到 stdout 或 stderr(效果与 postmaster 的 -S 选项相同)。除非 启用了 syslog 之类的日志系统,否则不建议使用此选项,因为它 会使你无法看到错误消息。
integer)指定内部排序和哈希在诉诸临时磁盘文件之前可使用的内存量。 值以千字节为单位指定,默认为 512 千字节。注意,对于复杂查询, 可能同时运行多个排序和/或哈希,每一个在被允许开始把数据放入 临时文件之前,都可以使用多达该值所指定的内存。而且别忘了, 每个运行中的后端可能正在做一个或多个排序。因此所需的总内存 可能是 SORT_MEM 值的许多倍。
bool)此参数控制继承语义,特别是各种命令在考虑范围中是否默认包含 子表。7.1 之前的版本不是这样。如果你需要旧行为,可以把此 变量设置为关闭,但长远来看,建议你修改应用程序,用 ONLY 关键字排除子表。关于继承的更多信息, 参见 SQL 语言参考和 用户指南。
boolean)启用SSL连接。使用前请阅读第 3.7 节。 默认是关闭的。
boolean)如果为真,服务器将接受 TCP/IP 连接。否则只接受本地 Unix 域 套接字连接。默认是关闭的。这个选项只能在服务器启动时设置。
string)指定 postmaster 用于监听来自客户端 应用连接的 Unix 域套接字所在的目录。默认值通常是 /tmp,但可以在构建时更改。
string)设置 Unix 域套接字的所属组。(套接字的所属用户总是启动 postmaster 的用户。)与选项 UNIX_SOCKET_PERMISSIONS 组合,可以作为这种套接字类型的一种附加访问控制机制。默认是 一个空字符串,表示使用当前用户的默认组。这个选项只能在服务 器启动时设置。
integer)设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。选项值应是以 chmod 和 umask 系统调用所接受格式指定的数字权限 模式。(要使用惯用的八进制格式,数字必须以 0(零)开头。)
默认权限是 0777,表示任何人都可以连接。 合理的其他取值可以是 0770(仅用户和组, 另见 UNIX_SOCKET_GROUP)和 0700(仅用户)。(注意,对 Unix 套接字 而言,实际上只有写权限起作用,设置或撤销读权限和执行权限 没有意义。)
此访问控制机制独立于 第 4 章 中描述的机制。
这个选项只能在服务器启动时设置。
string)指定 postmaster 用于监听来自客户端 应用连接的 TCP/IP 主机名或地址。默认监听所有已配置的地址 (包括 localhost)。
关于 WAL 调优的细节另见 第 9.3 节。
integer)自动 WAL 检查点之间的最大距离,以日志文件段为单位(每段通常 为 16 兆字节)。这个选项只能在服务器启动时或在 postgresql.conf 文件中设置。
integer)自动 WAL 检查点之间的最长时间,以秒为单位。这个选项只能在 服务器启动时或在 postgresql.conf 文件中 设置。
integer)向 WAL 缓冲区写入提交记录与把缓冲区刷到磁盘之间的时间延迟, 以微秒为单位。非零的延迟允许多个事务只做一次 fsync 提交, 前提是系统负载足够高,在给定的时间间隔内有额外的事务准备好 提交。但如果没有其他事务准备好提交,该延迟就只是白白浪费 时间。因此,只有当一个后端写入其提交记录的瞬间,至少有 COMMIT_SIBLINGS 个其他事务处于活跃状态时,才执行该延迟。
integer)执行 COMMIT_DELAY 延迟之前所要求的最少并发打开事务数。更大 的值使在延迟间隔内至少有另一个事务准备好提交更有可能。
integer)共享内存中用于 WAL 日志的磁盘页缓冲区数量。这个选项只能在 服务器启动时设置。
integer)如果非零,在标准错误上打开与 WAL 相关的调试输出。
integer)检查点时预先创建的日志文件数量。这个选项只能在服务器启动时 或在 postgresql.conf 文件中设置。
string)用于强制把 WAL 更新刷到磁盘的方法。可能的取值有 FSYNC(每次提交时调用 fsync())、 FDATASYNC(每次提交时调用 fdatasync())、 OPEN_SYNC(以 open() 选项 O_SYNC 写 WAL 文件) 或 OPEN_DATASYNC(以 open() 选项 O_DSYNC 写 WAL 文件)。并非所有平台上这些选择都可用。这个选项只能在 服务器启动时或在 postgresql.conf 文件 中设置。
为方便起见,许多参数还有单字母的选项开关。它们在下表中描述。
表 3.1. 短选项对照
| 短选项 | 等价形式 | 备注 |
|---|---|---|
-B x |
shared_buffers = x |
|
-d x |
debug_level = x |
|
| -F | fsync = off | |
-h x |
virtual_host = x |
|
| -i | tcpip_socket = on | |
-k x |
unix_socket_directory = x |
|
| -l | ssl = on | |
-N x |
max_connections = x |
|
-p x |
port = x |
|
| -fi, -fh, -fm, -fn, -fs, -ft | enable_indexscan=off, enable_hashjoin=off, enable_mergejoin=off, enable_nestloop=off, enable_seqscan=off, enable_tidscan=off | * |
-S x |
sort_mem = x |
* |
| -s | show_query_stats = on | * |
| -tpa, -tpl, -te | show_parser_stats=on, show_planner_stats=on, show_executor_stats=on | * |
由于历史原因,标有 “*” 的选项必须通过 -o postmaster 选项传给单个后端进程,例如:
> postmaster -o '-S 1024 -s'
或者从客户端一侧通过 PGOPTIONS 传递,如上文所述。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。