3.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。)注意,对那些在服务器启动时已固定的选项(例如端口号),这种方式不起作用。
有些选项可以在单个 SQL 会话中用 SET 命令更改,例如:
=> SET ENABLE_SEQSCAN TO OFF;语法的细节参见 SQL 命令语言参考。
此外,还可以把一组选项设置指派给某个用户或某个数据库。每当会话启动时,会加载相关用户和数据库的默认设置。配置这些设置分别使用
ALTER DATABASE 和 ALTER
USER 命令。此类每数据库设置覆盖从 postmaster 或配置文件获得的任何设置,并依次被每用户设置覆盖。
3.4.1. pg_settings #
pg_settings 虚拟表允许显示和更新当前会话的运行时参数。SHOW ALL 提供的每个可用参数各有一个条目,但其形式允许与其他关系连接并施加选择条件。
对 pg_settings 执行 UPDATE
等价于对该命名参数执行 SET 命令。此更改只影响当前会话使用的值。如果 UPDATE 是在一个随后被中止的事务中发出的,则事务回滚时 UPDATE 命令的效果即告消失。一旦外围事务提交,其效果将持续到会话结束,除非被另一次
UPDATE 或 SET 覆盖。
表 3.1. pg_settings 的列
| 名称 | 类型 | 描述 |
|---|---|---|
name | text | 当前会话运行时参数的名称 |
setting | text | 当前会话运行时参数的值 |
3.4.2. 规划器和优化器调整 #
CPU_INDEX_TUPLE_COST(floating point)设置查询优化器对索引扫描期间处理每个索引元组的代价的估计。它以顺序获取一个页面的代价的一个比例来计量。
CPU_OPERATOR_COST(floating point)设置优化器对处理
WHERE子句中每个操作符的代价的估计。它以顺序获取一个页面的代价的一个比例来计量。CPU_TUPLE_COST(floating point)设置查询优化器对查询期间处理每个元组的代价的估计。它以顺序获取一个页面的代价的一个比例来计量。
DEFAULT_STATISTICS_TARGET(integer)为没有通过
ALTER TABLE SET STATISTICS设置列专属目标的表列设置默认统计目标。较大的值会增加ANALYZE所需的时间,但可能改进规划器估计的质量。EFFECTIVE_CACHE_SIZE(floating point)设置优化器关于磁盘缓存有效大小的假设(即内核磁盘缓存中将被用于 PostgreSQL 数据文件的部分)。它以磁盘页为单位计量,每页通常为 8 kB。
ENABLE_HASHJOIN(boolean)启用或禁用查询规划器对哈希连接计划类型的使用。默认是打开的。这用于调试查询规划器。
ENABLE_INDEXSCAN(boolean)启用或禁用查询规划器对索引扫描计划类型的使用。默认是打开的。这用于调试查询规划器。
ENABLE_MERGEJOIN(boolean)启用或禁用查询规划器对归并连接计划类型的使用。默认是打开的。这用于调试查询规划器。
ENABLE_NESTLOOP(boolean)启用或禁用查询规划器对嵌套循环连接计划的使用。不可能完全压制嵌套循环连接,但关闭此变量会使规划器在有其他方法可用时不去使用它。默认是打开的。这用于调试查询规划器。
ENABLE_SEQSCAN(boolean)启用或禁用查询规划器对顺序扫描计划类型的使用。不可能完全压制顺序扫描,但关闭此变量会使规划器在有其他方法可用时不去使用它。默认是打开的。这用于调试查询规划器。
ENABLE_SORT(boolean)启用或禁用查询规划器对显式排序步骤的使用。不可能完全压制显式排序,但关闭此变量会使规划器在有其他方法可用时不去使用它。默认是打开的。这用于调试查询规划器。
ENABLE_TIDSCAN(boolean)启用或禁用查询规划器对 TID 扫描计划类型的使用。默认是打开的。这用于调试查询规划器。
GEQO(boolean)启用或禁用遗传查询优化,它是一种试图不做穷举搜索就完成查询规划的算法。默认是打开的。另见其他各种
GEQO_设置。GEQO_EFFORT(integer)GEQO_GENERATIONS(integer)GEQO_POOL_SIZE(integer)GEQO_RANDOM_SEED(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;后者是默认值。随机种子(random seed)可以设置,以从算法获得可复现的结果。如果设置为 -1,则算法的行为是非确定性的。GEQO_THRESHOLD(integer)当查询涉及的
FROM项至少达到此数量时,使用遗传查询优化进行规划。(注意,一个JOIN结构只算一个FROM项。)默认值是 11。对较简单的查询,通常最好使用确定性的穷举规划器。此参数还控制优化器将子查询的FROM子句合并到上层查询的积极程度。RANDOM_PAGE_COST(floating point)设置查询优化器对非顺序获取一个磁盘页的代价的估计。它以顺序获取一个页面的代价的倍数来计量。
注意
遗憾的是,没有定义良好的方法来确定刚才描述的这组 “COST” 变量的理想值。鼓励你进行实验并分享你的发现。
3.4.3. 日志和调试 #
SERVER_MIN_MESSAGES(string)此参数控制写入服务器日志的消息细节量。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、LOG、FATAL和PANIC。越靠后的值发送到日志的细节越少。默认值是NOTICE。注意,LOG在这里的优先级与在CLIENT_MIN_MESSAGES中不同。下面是各种消息类型的概要:
DEBUG[1-5]提供供开发者使用的信息。
INFO提供用户隐式请求的信息,例如在
VACUUM VERBOSE期间。NOTICE提供可能对用户有帮助的信息,例如长标识符被截断以及作为主键一部分创建索引。
WARNING向用户提供警告,例如在事务之外执行
COMMIT。ERROR报告导致事务中止的错误。
LOG报告管理员可能关心的信息,例如检查点活动。
FATAL报告后端会话为何终止。
PANIC报告所有后端会话为何重启。
CLIENT_MIN_MESSAGES(string)此参数控制发送到客户端的消息细节量。有效值是
DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、WARNING和ERROR。越靠后的值发送到客户端的信息越少。默认值是NOTICE。注意,LOG在这里的优先级与在SERVER_MIN_MESSAGES中不同。各种取值的解释另见那一节。DEBUG_ASSERTIONS(boolean)打开各种断言检查。这是一种调试辅助。如果你遇到奇怪的问题或崩溃,可能需要打开它,因为它可能暴露编程错误。要使用此选项,构建 PostgreSQL 时必须定义宏
USE_ASSERT_CHECKING(通过configure选项--enable-cassert完成)。注意,如果 PostgreSQL 构建时启用了断言,DEBUG_ASSERTIONS默认是打开的。DEBUG_PRINT_PARSE(boolean)DEBUG_PRINT_REWRITTEN(boolean)DEBUG_PRINT_PLAN(boolean)DEBUG_PRETTY_PRINT(boolean)这些标志启用向服务器日志发送各种调试输出。对每个执行的查询,打印查询文本、所得的语法解析树、查询重写器输出或执行计划之一。
DEBUG_PRETTY_PRINT会对这些显示进行缩进,产生更可读但也长得多的输出格式。EXPLAIN_PRETTY_PRINT(boolean)决定
EXPLAIN VERBOSE显示详细的查询树转储时使用缩进格式还是非缩进格式。HOSTNAME_LOOKUP(boolean)默认情况下,连接日志只显示连接主机 IP 地址。如果想让它显示主机名,可以打开此选项,但取决于你的主机名解析配置,这可能带来不可忽视的性能损失。此选项只能在服务器启动时设置。
LOG_CONNECTIONS(boolean)向服务器日志输出一行,详述每个成功的连接。默认是关闭的,尽管它可能非常有用。此选项只能在服务器启动时或在
postgresql.conf配置文件中设置。LOG_DURATION(boolean)使每条已完成语句的时长都被记录。要使用此选项,请启用
LOG_STATEMENT和LOG_PID,以便能用进程 ID 把语句和时长关联起来。LOG_MIN_ERROR_STATEMENT(string)此参数控制对于哪些消息级别,导致该消息的 SQL 语句被记录到服务器日志中。所有导致所设级别或更高级别消息的语句都会被记录。默认值是
PANIC(实际上关闭了此特性)。有效值是DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、FATAL和PANIC。例如,如果把它设置为ERROR,那么所有导致错误、致命错误或恐慌的 SQL 语句都将被记录。建议同时启用
LOG_PID,以便更容易把错误语句与错误消息对应起来。LOG_PID(boolean)在日志文件的每条服务器消息前加上后端进程的进程 ID。这有助于分清哪些消息属于哪个连接。默认是关闭的。此参数不影响通过 syslog 记录的消息,那些消息总是包含进程 ID。
LOG_STATEMENT(boolean)使每条 SQL 语句都被记录。
LOG_TIMESTAMP(boolean)在服务器日志的每条消息前加上时间戳。默认是关闭的。
SHOW_STATEMENT_STATS(boolean)SHOW_PARSER_STATS(boolean)SHOW_PLANNER_STATS(boolean)SHOW_EXECUTOR_STATS(boolean)对每个查询,把相应模块的性能统计写入服务器日志。这是一种粗略的性能剖析工具。
SHOW_SOURCE_PORT(boolean)在连接日志消息中显示连接主机的源端口号。你可以追溯端口号,找出是哪个用户发起的连接。除此之外它没什么用处,因此默认是关闭的。此选项只能在服务器启动时设置。
STATS_COMMAND_STRING(boolean)STATS_BLOCK_LEVEL(boolean)STATS_ROW_LEVEL(boolean)这些标志决定后端向统计收集器进程发送什么信息:当前命令、块级活动统计或行级活动统计。全部默认关闭。启用统计收集会让每个查询花费少量时间,但对调试和性能调优非常宝贵。
STATS_RESET_ON_SERVER_START(boolean)如果打开,收集到的统计信息在服务器每次重启时清零。如果关闭,统计信息跨服务器重启累计。默认是打开的。此选项只能在服务器启动时设置。
STATS_START_COLLECTOR(boolean)控制服务器是否应启动统计收集子进程。默认是打开的,但如果你确定对收集统计信息没有兴趣,可以把它关闭。此选项只能在服务器启动时设置。
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。TRACE_NOTIFY(boolean)为
LISTEN和NOTIFY命令生成大量调试输出。
3.4.4. 常规操作 #
AUTOCOMMIT(boolean)如果设置为真,PostgreSQL 会在每个不在显式事务块内(即没有给出未配对的
BEGIN而没有COMMIT)的成功命令之后自动执行COMMIT。如果设置为假,PostgreSQL 只在收到显式COMMIT命令时才提交。这种模式也可以看作是在收到不在事务块内的命令时隐式发出BEGIN。默认值为真,以兼容 PostgreSQL 的历史行为。不过,要获得与 SQL 规范的最大兼容性,应把它设置为假。注意
即使
autocommit设置为假,SET、SHOW和RESET也不会开启新的事务块。它们在各自的事务中运行。一旦发出另一条命令,事务块即告开始,此后的SET、SHOW或RESET命令都被视为事务的一部分,即它们随事务的完成状态一起提交或回滚。要在事务块开始时执行SET、SHOW或RESET命令,请先使用BEGIN。注意
截至 PostgreSQL 7.3,把
autocommit设置为假尚未得到充分支持。这是一项新特性,并非所有客户端库和应用程序都已处理它。在你的安装中把它设为默认值之前,请仔细测试。AUSTRALIAN_TIMEZONES(boolean)如果设置为真,
CST、EST和SAT会被解释为澳大利亚时区,而不是北美中部/东部时区和星期六。默认是假。AUTHENTICATION_TIMEOUT(integer)完成客户端认证的最长时间,以秒为单位。如果一个潜在客户端没有在这段时间里完成认证协议,服务器将断开连接。这防止了挂起的客户端无限期占用连接。此选项只能在服务器启动时或在
postgresql.conf文件中设置。BACKSLASH_QUOTE(string) #此参数控制字符串字面量中是否可以用
\'表示引号。表示引号的首选 SQL 标准方式是把它加倍(''),但 PostgreSQL 历史上也接受\'。然而,使用\'会带来安全风险,因为在某些客户端字符集编码中,存在最后一个字节在数值上等于 ASCII\的多字节字符。如果客户端代码的转义不正确,就可能发生 SQL 注入攻击。让服务器拒绝引号似乎被反斜杠转义的查询,可以防止这种风险。backslash_quote的允许值是on(总是允许\')、off(总是拒绝)和safe_encoding(仅当客户端编码不允许在多字节字符中出现 ASCII\时才允许)。默认设置是safe_encoding。CLIENT_ENCODING(string)为多字节字符集设置客户端编码。默认使用数据库编码。
DATESTYLE(string)设置日期的显示格式,以及解释有歧义的输入日期的规则。默认值是
ISO, US。DB_USER_NAMESPACE(boolean)此参数允许各数据库独立的用户名。默认是关闭的。
如果启用此参数,应以
username@dbname的形式创建用户。连接的客户端传入username时,会在用户名后附加@和数据库名,然后由服务器查找此数据库专属的用户名。请注意,在 SQL 环境中创建名称包含@的用户时,需要用引号括起用户名。启用此参数后,仍然可以创建普通的全局用户。只需在客户端指定用户名时附加
@。服务器查找用户名之前会去掉@。注意
此特性旨在作为找到完整解决方案之前的临时措施。届时将移除此选项。
DEADLOCK_TIMEOUT(integer)这是在等待锁多长时间(以毫秒计)之后才检查是否存在死锁条件。死锁检查相对较慢,所以服务器不会在每次等待锁时都运行它。我们(乐观地?)假设生产应用中死锁并不常见,先在锁上等待一会儿,然后才开始检查死锁。增大此值可以减少无谓的死锁检查所浪费的时间,但会减慢真实死锁错误的报告。默认值是 1000(即一秒),这大概是你实践中想要的最小值。在负载很重的服务器上,你可能需要提高它。理想情况下,该设置应当超过你的典型事务时间,以便提高在等待者决定检查死锁之前锁就被释放的机会。此选项只能在服务器启动时设置。
DEFAULT_TRANSACTION_ISOLATION(string)每个 SQL 事务都有一个隔离级别,可以是“读已提交”或“可串行化”。此参数控制每个新事务的默认隔离级别。默认是“读已提交”。
更多信息参见 PostgreSQL 用户指南 以及命令
SET TRANSACTION。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配置文件中。KRB_SERVER_KEYFILE(string)设置 Kerberos 服务器密钥文件的位置。详情见第 6.2.3 节。
FSYNC(boolean)如果此选项打开,PostgreSQL 后端会在多处使用
fsync()系统调用,确保更新被物理写入磁盘。这保证数据库安装在操作系统或硬件崩溃之后能恢复到一致状态。(数据库服务器自身的崩溃与此无关。)不过,此操作会减慢 PostgreSQL,因为事务提交时它必须等待操作系统把预写日志刷出。不使用
fsync时,操作系统被允许尽其所能地对写操作进行缓冲、排序和延迟,这可以显著提升性能。但是,如果系统崩溃,最近若干已提交事务的结果可能部分或全部丢失。最坏情况下,可能发生不可恢复的数据损坏。由于上述原因,有些管理员始终关闭它,有些只在批量装载时关闭它(批量装载出问题时存在明确的重启点),还有些只是为保险起见而保持打开。因为它总是安全的,默认是打开的。如果你信任你的操作系统、硬件和电力公司(更好的是你有 UPS),可能需要禁用
fsync。应当指出,PostgreSQL 7.1 及更高版本中打开
fsync的性能损失已显著降低。如果你过去出于性能原因禁用了fsync,可以重新考虑你的选择。此选项只能在服务器启动时或在
postgresql.conf文件中设置。LC_MESSAGES(string)设置显示消息所用的语言。可接受的值依赖于系统;更多信息见第 7.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。
在某些系统上,此区域设置类别不存在。设置此变量仍然有效,但不会有任何作用。另外,所需语言的已翻译消息也可能不存在。那种情况下你将继续看到英文消息。
LC_MONETARY(string)设置用于格式化货币金额的区域设置,例如供
to_char()函数族使用。可接受的值依赖于系统;更多信息见第 7.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。LC_NUMERIC(string)设置用于格式化数字的区域设置,例如供
to_char()函数族使用。可接受的值依赖于系统;更多信息见第 7.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。LC_TIME(string)设置用于格式化日期和时间值的区域设置。(目前此设置不起作用,但将来可能会有。)可接受的值依赖于系统;更多信息见第 7.1 节。如果此变量设置为空字符串(默认值),则以依赖于系统的方式从服务器的执行环境继承该值。
MAX_CONNECTIONS(integer)决定数据库服务器允许的最大并发连接数。默认值是 32(除非在构建服务器时被更改)。这个参数只能在服务器启动时设置。
MAX_EXPR_DEPTH(integer)设置解析器的最大表达式嵌套深度。默认值对任何正常查询都足够高,但如有需要可以提高它。(但如果提得太高,就有因栈溢出而导致后端崩溃的风险。)
MAX_FILES_PER_PROCESS(integer)设置每个服务器子进程允许同时打开的最大文件数。默认值是 1000。代码实际使用的限制是此设置与
sysconf(_SC_OPEN_MAX)结果中的较小者。因此,在sysconf返回合理限制的系统上,你无需担心此设置。但在某些平台上(特别是大多数 BSD 系统),sysconf返回的值远大于当大量进程都试图打开那么多文件时系统真正能够支持的值。如果你发现出现 “Too many open files”失败,可尝试调低此设置。此选项只能在服务器启动时或在postgresql.conf配置文件中设置;如果在配置文件中更改,只影响随后启动的服务器子进程。MAX_FSM_RELATIONS(integer)设置共享空闲空间映射中为其跟踪空闲空间的关系(表)的最大数量。默认值是 1000。这个选项只能在服务器启动时设置。
MAX_FSM_PAGES(integer)设置共享空闲空间映射中为其跟踪空闲空间的磁盘页最大数量。默认值是 10000。这个选项只能在服务器启动时设置。
MAX_LOCKS_PER_TRANSACTION(integer)共享锁表的大小基于这样的假设:任意时刻最多有
max_locks_per_transaction*max_connections个不同的对象需要加锁。默认值 64 历史上已被证明是足够的,但如果你的客户端在单个事务中会接触许多不同的表,可能需要提高此值。此选项只能在服务器启动时设置。PASSWORD_ENCRYPTION(boolean)在
CREATE USER或ALTER USER中指定口令,且既没有写ENCRYPTED也没有写UNENCRYPTED时,此标志决定口令是否被加密。默认是打开的(加密口令)。PORT(integer)服务器监听的 TCP 端口,默认是 5432。这个选项只能在服务器启动时设置。
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中出现的请求是如何被解析的。关于模式处理的更多信息,见 PostgreSQL 用户指南。
STATEMENT_TIMEOUT(integer)中止任何耗时超过指定毫秒数的语句。值为零时关闭计时器。
SHARED_BUFFERS(integer)设置数据库服务器使用的共享内存缓冲区数量。默认值是 64。每个缓冲区通常为 8192 字节。此值必须大于 16,并且至少是
MAX_CONNECTIONS值的两倍;不过,在现代机器上,更高的值常常能改进性能。对于生产安装,建议至少取几千的值。这个选项只能在服务器启动时设置。增加这个参数可能会导致PostgreSQL请求比操作系统的默认配置所允许的更多的System V 共享内存。如有必要,关于如何调整这些参数的信息见第 3.5.1 节。
SILENT_MODE(bool)让服务器静默运行。如果设置了此选项,服务器将自动在后台运行,并脱离任何控制终端,这样,不会有任何消息写到标准输出或标准错误(效果与
postmaster的-S选项相同)。除非启用了 syslog 之类的日志系统,否则不建议使用此选项,因为它会使你无法看到错误消息。SORT_MEM(integer)指定内部排序和哈希在切换到临时磁盘文件之前可使用的内存量。值以千字节为单位指定,默认为 1024 千字节(1 MB)。注意,对于复杂查询,可能同时运行多个排序,每一个在被允许开始把数据放入临时文件之前,都可以使用多达该值所指定的内存。此外,每个运行中的后端可能同时进行一个或多个排序,因此使用的总内存可能是
SORT_MEM值的许多倍。排序由ORDER BY、归并连接和CREATE INDEX使用。SQL_INHERITANCE(bool)此参数控制继承语义,特别是各种命令是否默认包含子表。7.1 之前的版本不包含子表。如果你需要旧行为,可以把此变量设置为关闭,但长远来看,建议你修改应用程序,用
ONLY关键字排除子表。关于继承的更多信息,参见 SQL 语言参考和 PostgreSQL 用户指南。SSL(boolean)启用SSL连接。使用前请阅读第 3.7 节。默认是关闭的。
SUPERUSER_RESERVED_CONNECTIONS(integer)决定为 PostgreSQL 超级用户的连接保留多少个“连接槽”。同时活跃的连接数最多始终只能达到
max_connections。每当活跃并发连接数至少达到max_connections减去superuser_reserved_connections时,新连接将只接受超级用户账户。默认值是 2。该值必须小于
max_connections的值。这个参数只能在服务器启动时设置。TCPIP_SOCKET(boolean)如果为真,服务器将接受 TCP/IP 连接。否则只接受本地 Unix 域套接字连接。默认是关闭的。这个选项只能在服务器启动时设置。
TIMEZONE(string)设置用于显示和解释时间戳的时区。默认使用系统环境指定的时区。
TRANSFORM_NULL_EQUALS(boolean)打开时,形如
(或expr= NULLNULL =)的表达式会被当作expr处理,即当exprIS NULLexpr求值为空值时返回真,否则返回假。的正确行为是总是返回空值(未知)。因此此选项默认是关闭的。expr= NULL不过,Microsoft Access 中的筛选形式生成的查询看起来是用
来测试空值,因此如果你用该界面访问数据库,可能需要打开此选项。由于形如expr= NULL的表达式(按正确解释)总是返回空值,它们不是很有用,在正常应用中也不常出现,所以此选项实际上没什么害处。但新用户经常对涉及空值的表达式的语义感到困惑,所以此选项默认不打开。expr= NULL注意,此选项只影响字面上的
=操作符,不影响其他比较操作符,也不影响在计算上等价于某个涉及等号操作符表达的其他表达式(例如IN)。因此,此选项不是对不良编程的通用修复。相关信息参见 PostgreSQL 用户指南。
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 域套接字而言,实际上只有写权限起作用,设置或撤销读权限和执行权限没有意义。)此访问控制机制独立于第 6 章中描述的机制。
这个选项只能在服务器启动时设置。
VACUUM_MEM(integer)指定
VACUUM用于跟踪待回收元组所用的最大内存量。值以千字节为单位指定,默认为 8192 千字节。对包含大量已删除元组的大表进行清理时,更大的设置可能提升清理速度。VIRTUAL_HOST(string)指定 postmaster 用于监听来自客户端应用连接的 TCP/IP 主机名或地址。默认监听所有已配置的地址(包括 localhost)。
ZERO_DAMAGED_PAGES(boolean)检测到损坏的页头通常会使 PostgreSQL 报告错误并中止当前事务。把
zero_damaged_pages设置为真会使系统改为报告警告,将损坏页清零并继续处理。此行为会破坏数据,即损坏页上的所有行。但它允许你跳过该错误,从表中可能存在的未损坏页中取回行。因此,当因硬件或软件错误发生损坏时,它对恢复数据很有用。通常,在对从表的损坏页恢复数据不抱希望之前,不应把它设置为真。默认设置是关闭的,且只有超级用户能更改它。
3.4.5. WAL #
关于 WAL 调优的细节另见第 12.3 节。
CHECKPOINT_SEGMENTS(integer)自动 WAL 检查点之间的最大距离,以日志文件段为单位(每段通常为 16 兆字节)。这个选项只能在服务器启动时或在
postgresql.conf文件中设置。CHECKPOINT_TIMEOUT(integer)自动 WAL 检查点之间的最长时间,以秒为单位。这个选项只能在服务器启动时或在
postgresql.conf文件中设置。COMMIT_DELAY(integer)向 WAL 缓冲区写入提交记录与把缓冲区刷到磁盘之间的时间延迟,以微秒为单位。非零的延迟允许多个事务只通过一次
fsync系统调用提交,前提是系统负载足够高,在给定的时间间隔内可能有额外的事务准备好提交。但如果没有其他事务准备好提交,该延迟就白白浪费了。因此,只有当后端进程写入其提交记录的瞬间,至少有COMMIT_SIBLINGS个其他事务处于活跃状态时,才执行该延迟。COMMIT_SIBLINGS(integer)执行
COMMIT_DELAY延迟之前所要求的最少并发打开事务数。更大的值使在延迟间隔内至少有另一个事务准备好提交更有可能。WAL_BUFFERS(integer)共享内存中用于 WAL 日志的磁盘页缓冲区数量。默认值是 4。这个选项只能在服务器启动时设置。
WAL_DEBUG(integer)如果非零,在标准错误上打开与 WAL 相关的调试输出。
WAL_SYNC_METHOD(string)用于强制把 WAL 更新刷到磁盘的方法。可能的取值有
FSYNC(每次提交时调用fsync())、FDATASYNC(每次提交时调用fdatasync())、OPEN_SYNC(以open()选项O_SYNC写 WAL 文件)或OPEN_DATASYNC(以open()选项O_DSYNC写 WAL 文件)。并非所有平台上这些选择都可用。这个选项只能在服务器启动时或在postgresql.conf文件中设置。
3.4.6. 短选项 #
为方便起见,许多参数还有单字母的选项开关。它们在表 3.2中描述。
表 3.2. 短选项对照
| 短选项 | 等价形式 |
|---|---|
-B | shared_buffers = |
-d | server_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] | show_statement_stats = on |
-S [a]
| sort_mem = |
-tpa, -tpl, -te[a] | show_parser_stats=on, show_planner_stats=on, show_executor_stats=on |
[a] 由于历史原因,这些选项必须通过 postmaster 的
$
或者从客户端一侧通过 | |