19.11. Client 端连接默认设置

19 .11.1. Statements 行为

  • client_min_messages ( enum )
    • 控制将哪些message levels发送到 Client 端。有效值为DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1LOGNOTICEWARNINGERROR。每个级别都包括其后的所有级别。级别越高,发送的消息越少。默认值为NOTICE。请注意,LOG的排名与log_min_messages中的排名不同。

INFO级消息总是发送给 Client 端。

  • search_path ( string )
    • 此变量指定当通过简单名称(未指定架构)引用对象(表,数据类型,函数等)时搜索架构的 Sequences。当在不同模式中存在名称相同的对象时,将使用在搜索路径中最先找到的对象。只能通过使用限定名称(点号)指定其包含的架构来引用不在搜索路径中任何架构中的对象。

search_path的值必须是模式名称的逗号分隔列表。任何不是现有模式或用户没有USAGE许可权的模式的名称都将被静默忽略。

如果列表项之一是特殊名称$user,那么将替换具有CURRENT_USER返回的名称的模式(如果存在这样的模式,并且用户对其具有USAGE许可)。 (如果不是,则$user被忽略.)

无论是否在路径中提及,始终都会搜索系统目录架构pg_catalog。如果在路径中提到它,则将以指定的 Sequences 搜索它。如果pg_catalog不在路径中,则将搜索任何路径项之前对其进行搜索。

同样,如果存在,则始终搜索当前会话的临时表架构pg_temp_nnn。可以使用别名pg_temp 在路径中明确列出它。如果未在路径中列出它,那么将首先搜索它(甚至在pg_catalog之前)。但是,仅在临时模式中搜索关系(表,视图,序列等)和数据类型名称。永远不会搜索函数或运算符名称。

如果在未指定特定目标架构的情况下创建对象,则会将它们放置在search_path中命名的第一个有效架构中。如果搜索路径为空,则会报告错误。

此参数的默认值为"$user", public。此设置支持共享使用数据库(没有用户拥有私有模式,并且所有用户共享使用__),私有每用户模式以及这些的组合。通过更改全局或每个用户的默认搜索路径设置,可以获得其他效果。

有关架构处理的更多信息,请参见Section 5.8。特别是,仅当数据库具有单个用户或几个相互信任的用户时,默认配置才适用。

可以通过 SQL 函数current_schemas(请参阅Section 9.25)检查搜索路径的当前有效值。这与检查search_path的值并不完全相同,因为current_schemas显示了如何解析search_path中出现的项目。

  • row_security ( boolean )
    • 该变量控制是否代替应用行安全策略而引发错误。设置为on时,策略将正常应用。设置为off时,查询将失败,否则将应用至少一种策略。默认值为on。更改为off,其中有限的行可见性可能导致错误的结果;例如,pg_dump 默认进行更改。此变量对绕过每行安全策略的角色,具有BYPASSRLS属性的机智,超级用户和角色没有影响。

有关行安全策略的更多信息,请参见CREATE POLICY

  • default_tablespace ( string )
    • CREATE命令未明确指定表空间时,此变量指定在其中创建对象(表和索引)的默认表空间。

该值可以是表空间的名称,也可以是使用当前数据库的默认表空间指定的空字符串。如果该值与任何现有表空间的名称都不匹配,则 PostgreSQL 将自动使用当前数据库的默认表空间。如果指定了非默认表空间,则用户必须具有CREATE特权,否则创建尝试将失败。

该变量不用于临时表。对于他们,则改为咨询temp_tablespaces

创建数据库时也不使用此变量。默认情况下,新数据库从其复制的模板数据库继承其表空间设置。

有关表空间的更多信息,请参见Section 22.6

  • temp_tablespaces ( string )
    • 此变量指定当CREATE命令未显式指定表空间时在其中创建临时对象(临时表和临时表上的索引)的表空间。在这些表空间中还创建了用于排序大型数据集等目的的临时文件。

该值是表空间名称的列表。如果列表中有多个名称,则每次创建临时对象时,PostgreSQL 都会从列表中选择一个随机成员。除了在事务中,将连续创建的临时对象放置在列表中的连续表空间中。如果列表中选定的元素为空字符串,则 PostgreSQL 将自动使用当前数据库的默认表空间代替。

交互式设置temp_tablespaces时,指定不存在的表空间是错误的,指定用户没有CREATE特权的表空间也是如此。但是,当使用先前设置的值时,不存在的表空间将被忽略,用户缺少CREATE特权的表空间也会被忽略。特别是,使用postgresql.conf中设置的值时,将应用此规则。

默认值为空字符串,这将导致在当前数据库的默认表空间中创建所有临时对象。

另请参见default_tablespace

  • check_function_bodies ( boolean )

    • 此参数通常是打开的。设置为off时,它将在CREATE FUNCTION期间禁用对函数主体字符串的验证。禁用验证可避免验证过程的副作用,并避免由于诸如前向引用之类的问题而导致误报。在代表其他用户加载函数之前,将此参数设置为off; pg_dump 会自动这样做。
  • default_transaction_isolation ( enum )

    • 每个 SQL 事务都有一个隔离级别,可以是“未提交读”,“已提交读”,“可重复读”或“可序列化”。此参数控制每个新事务的默认隔离级别。默认值为“读已提交”。

有关更多信息,请咨询Chapter 13SET TRANSACTION

  • default_transaction_read_only ( boolean )
    • 只读 SQL 事务不能更改非临时表。此参数控制每个新事务的默认只读状态。默认值为off(读/写)。

有关更多信息,请咨询SET TRANSACTION

  • default_transaction_deferrable ( boolean )
    • 当以serializable隔离级别运行时,可延迟的只读 SQL 事务可能会在允许 continue 进行之前被延迟。但是,一旦开始执行,就不会产生确保可序列化性所需的任何开销。因此,序列化代码将没有理由由于并发更新而使其中止,从而使该选项适用于长时间运行的只读事务。

此参数控制每个新事务的默认可延期状态。当前,它对读写事务或隔离级别低于serializable的事务没有影响。默认值为off

有关更多信息,请咨询SET TRANSACTION

  • session_replication_role ( enum )

    • 控制当前会话的与复制相关的触发器和规则的触发。设置此变量需要超级用户特权,并导致丢弃任何先前缓存的查询计划。可能的值为origin(默认值),replicalocal。有关更多信息,请参见ALTER TABLE
  • statement_timeout ( integer )

    • 从命令从 Client 端到达服务器的时间开始,中止所有花费超过指定毫秒数的语句。如果log_min_error_statement设置为ERROR或更低,则还将记录超时的语句。零值(默认值)将其关闭。

不建议在postgresql.conf中设置statement_timeout,因为这会影响所有会话。

  • lock_timeout ( integer )
    • 在尝试获取表,索引,行或其他数据库对象上的锁时,中止 await 时间超过指定毫秒数的所有语句。时间限制分别适用于每次锁定获取尝试。该限制既适用于显式锁定请求(例如LOCK TABLE或不具有NOWAITSELECT FOR UPDATE),也适用于隐式获取的锁定。零值(默认值)将其关闭。

statement_timeout不同,此超时只能在 await 锁时发生。请注意,如果statement_timeout不为零,则将lock_timeout设置为相同或更大的值是毫无意义的,因为语句超时总是会首先触发。如果log_min_error_statement设置为ERROR或更低,则将记录超时的语句。

不建议在postgresql.conf中设置lock_timeout,因为这会影响所有会话。

  • idle_in_transaction_session_timeout ( integer )
    • 用空闲时间超过指定持续时间(以毫秒为单位)的打开事务终止任何会话。这样可以释放该会话持有的所有锁,并重新使用连接插槽;它还允许清理仅对该事务可见的 Tuples。有关更多详细信息,请参见Section 24.1

默认值 0 禁用此功能。

  • vacuum_freeze_table_age ( integer )

    • 如果表的pg_class,则VACUUM执行主动扫描。 relfrozenxid字段已达到此设置指定的年龄。主动扫描与常规VACUUM的不同之处在于,它扫描可能包含未冻结的 XID 或 MXID 的每个页面,而不仅访问那些可能包含无效 Tuples 的页面。默认值为 1.5 亿笔 Transaction。尽管用户可以将此值设置为零到 20 亿之间的任意值,但是VACUUM会将有效值默默地限制为autovacuum_freeze_max_age的 95%,因此定期手册VACUUM可以在为该表启动反环绕式自动抽真空之前运行。有关更多信息,请参见Section 24.1.5
  • vacuum_freeze_min_age ( integer )

    • 指定VACUUM用来决定是否在扫描表时冻结行版本的截止年龄(在事务中)。默认值为 5000 万笔 Transaction。尽管用户可以将此值设置为零到十亿之间的任意值,但VACUUM会将有效值默默地限制为autovacuum_freeze_max_age的一半,因此强制自动真空之间的时间不会过短。有关更多信息,请参见Section 24.1.5
  • vacuum_multixact_freeze_table_age ( integer )

    • 如果表的pg_class,则VACUUM执行主动扫描。 relminmxid字段已达到此设置指定的年龄。主动扫描与常规VACUUM的不同之处在于,它扫描可能包含未冻结的 XID 或 MXID 的每个页面,而不仅访问那些可能包含无效 Tuples 的页面。默认值为 1.5 亿个 multixact。尽管用户可以将此值设置为从零到 20 亿之间的任何值,但是VACUUM会将有效值默默地限制为autovacuum_multixact_freeze_max_age的 95%,因此定期手册VACUUM可以在为该表启动反环绕之前运行。有关更多信息,请参见Section 24.1.5.1
  • vacuum_multixact_freeze_min_age ( integer )

    • 指定VACUUM用来决定在扫描表时是用较新的事务 ID 还是用多事务 ID 替换多事务 ID 的截止年龄(以多事务为单位)。默认值为 500 万个 multixact。尽管用户可以将此值设置为零到十亿之间的任何值,但VACUUM会无声地将有效值限制为autovacuum_multixact_freeze_max_age的一半,因此强制自动真空之间不会出现不合理的短时间。有关更多信息,请参见Section 24.1.5.1
  • bytea_output ( enum )

    • 设置类型为bytea的值的输出格式。有效值为hex(默认值)和escape(传统 PostgreSQL 格式)。有关更多信息,请参见Section 8.4。不管此设置如何,bytea类型始终在 Importing 时接受两种格式。
  • xmlbinary ( enum )

    • 设置二进制值在 XML 中的 encodings。例如,在通过函数xmlelementxmlforestbytea值转换为 XML 时,这种情况适用。可能的值为base64hex,它们都在 XML Schema 标准中定义。默认值为base64。有关 XML 相关功能的更多信息,请参见Section 9.14

此处的实际选择主要取决于口味,仅受 Client 端应用程序中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码将比 base64 编码大一些。

  • xmloption ( enum )
    • 设置在 XML 和字符串值之间转换时是DOCUMENT还是CONTENT是隐式的。有关此说明,请参见Section 8.13。有效值为DOCUMENTCONTENT。默认值为CONTENT

根据 SQL 标准,设置此选项的命令是

SET XML OPTION { DOCUMENT | CONTENT };

该语法在 PostgreSQL 中也可用。

  • gin_pending_list_limit ( integer )
    • 设置启用fastupdate时使用的 GIN 暂挂列表的最大大小。如果列表变得大于此最大大小,则通过将列表中的条目批量移动到主 GIN 数据结构中进行清理。缺省值为 4 兆字节(4MB)。通过更改索引存储参数,可以为单个 GIN 索引覆盖此设置。有关更多信息,请参见Section 64.4.1Section 64.5

19 .11.2. 语言环境和格式

  • DateStyle ( string )

    • 设置日期和时间值的显示格式,以及解释模棱两可的日期 Importing 值的规则。由于历史原因,此变量包含两个独立的组件:输出格式规范(ISOPostgresSQLGerman)和用于年/月/日排序的 Importing/输出规范(DMYMDYYMD)。这些可以分别设置或一起设置。关键字EuroEuropeanDMY的同义词;关键字USNonEuroNonEuropeanMDY的同义词。有关更多信息,请参见Section 8.5。内置的默认值为ISO, MDY,但是 initdb 将使用与所选lc_time语言环境的行为相对应的设置来初始化配置文件。
  • IntervalStyle ( enum )

    • 设置间隔值的显示格式。值sql_standard将产生匹配 SQL 标准间隔 Literals 的输出。当DateStyle参数设置为ISO时,值postgres(默认值)将产生与 8.4 之前的 PostgreSQL 版本匹配的输出。当DateStyle参数设置为非ISO输出时,值postgres_verbose将产生与 8.4 之前的 PostgreSQL 版本匹配的输出。值iso_8601将产生与在 ISO 8601 的 4.4.3.2 节中定义的时间间隔“带有指示符的格式”相匹配的输出。

IntervalStyle参数还会影响对模糊时间间隔 Importing 的解释。有关更多信息,请参见Section 8.5.4

  • TimeZone ( string )

    • 设置用于显示和解释时间戳的时区。内置默认值为GMT,但通常会在postgresql.conf中覆盖; initdb 将在其中安装与其系统环境相对应的设置。有关更多信息,请参见Section 8.5.3
  • timezone_abbreviations ( string )

    • 设置服务器接受日期时间 Importing 的时区缩写的集合。默认值为'Default',这是一个可以在世界大多数地方使用的集合;还有'Australia''India',并且可以为特定安装定义其他集合。有关更多信息,请参见Section B.4
  • extra_float_digits ( integer )

    • 此参数调整浮点值显示的位数,包括float4float8和几何数据类型。参数值将添加到标准位数(适当时为FLT_DIGDBL_DIG)。该值可以设置为 3,以包含部分有效的数字;这对于转储需要精确还原的浮点数据特别有用。或者可以将其设置为负以抑制不需要的数字。另请参见Section 8.1.3
  • client_encoding ( string )

    • 设置 Client 端编码(字符集)。默认为使用数据库编码。 Section 23.3.1中描述了 PostgreSQL 服务器支持的字符集。
  • lc_messages ( string )

    • 设置显示消息的语言。可接受的值取决于系统;有关更多信息,请参见Section 23.1。如果将此变量设置为空字符串(这是默认值),则该值将以与系统有关的方式从服务器的执行环境继承。

在某些系统上,此语言环境类别不存在。设置此变量仍将起作用,但不会生效。同样,有可能不存在所需语言的翻译消息。在这种情况下,您将 continue 看到英语消息。

只有超级用户才能更改此设置,因为它会影响发送到服务器日志和 Client 端的消息,并且不正确的值可能会掩盖服务器日志的可读性。

  • lc_monetary ( string )

    • 设置用于格式化货币金额的语言环境,例如使用to_char系列函数。可接受的值取决于系统;有关更多信息,请参见Section 23.1。如果将此变量设置为空字符串(这是默认值),则该值将以与系统有关的方式从服务器的执行环境继承。
  • lc_numeric ( string )

    • 设置用于格式化数字的语言环境,例如to_char系列函数。可接受的值取决于系统;有关更多信息,请参见Section 23.1。如果将此变量设置为空字符串(这是默认值),则该值将以与系统有关的方式从服务器的执行环境继承。
  • lc_time ( string )

    • 设置用于格式化日期和时间的语言环境,例如to_char系列函数。可接受的值取决于系统;有关更多信息,请参见Section 23.1。如果将此变量设置为空字符串(这是默认值),则该值将以与系统有关的方式从服务器的执行环境继承。
  • default_text_search_config ( string )

    • 选择文本搜索功能的那些文本搜索功能变体使用的文本搜索配置,这些变体没有指定配置的显式参数。有关更多信息,请参见Chapter 12。内置默认值是pg_catalog.simple,但是如果可以识别出与该语言环境匹配的配置,则 initdb 将使用与所选lc_ctype语言环境相对应的设置来初始化配置文件。

19 .11.3. 共享库预加载

有几种设置可用于将共享库预加载到服务器中,以便加载其他功能或获得性能优势。例如,设置'$libdir/mylib'将导致从安装的标准库目录中预加载mylib.so(在某些平台上为mylib.sl)。设置之间的区别在于它们生效的时间以及更改它们所需的特权。

可以通过这种方式预加载 PostgreSQL 过程语言库,通常使用语法'$libdir/plXXX',其中XXXpgsqlperltclpython

这样只能加载专门用于 PostgreSQL 的共享库。每个 PostgreSQL 支持的库都有一个“魔术块”,选中该魔术块可以保证兼容性。因此,无法以这种方式加载非 PostgreSQL 库。您可能可以使用诸如LD_PRELOAD之类的 os 工具。

通常,请参阅特定模块的文档,以获取建议的模块加载方式。

  • local_preload_libraries ( string )
    • 此变量指定在连接开始时要预加载的一个或多个共享库。它包含以逗号分隔的库名称列表,其中每个名称的解释与LOAD命令相同。条目之间的空格将被忽略;如果您需要在库名中包含空格或逗号,请用双引号引起来。参数值仅在连接开始时生效。后续更改无效。如果找不到指定的库,则连接尝试将失败。

任何用户都可以设置此选项。因此,可以加载的库仅限于安装在标准库目录的plugins子目录中的库。 (确保仅在其中安装“安全”库是数据库 Management 员的责任.)local_preload_libraries中的条目可以显式指定此目录,例如$libdir/plugins/mylib,或仅指定库名-mylib$libdir/plugins/mylib具有相同的作用。

此功能的目的是允许非特权用户将调试或性能评估库加载到特定会话中,而无需显式的LOAD命令。为此,通常使用 Client 机上的PGOPTIONS环境变量或使用ALTER ROLE SET来设置此参数。

但是,除非非超级用户专门设计了一种以这种方式使用的模块,否则通常不是正确的设置。看session_preload_libraries

  • session_preload_libraries ( string )
    • 此变量指定在连接开始时要预加载的一个或多个共享库。它包含以逗号分隔的库名称列表,其中每个名称的解释与LOAD命令相同。条目之间的空格将被忽略;如果您需要在库名中包含空格或逗号,请用双引号引起来。参数值仅在连接开始时生效。后续更改无效。如果找不到指定的库,则连接尝试将失败。只有超级用户可以更改此设置。

此功能的目的是允许将调试或性能评估库加载到特定会话中,而无需给出明确的LOAD命令。例如,通过使用ALTER ROLE SET设置此参数,可以为给定用户名下的所有会话启用auto_explain。此外,可以在不重新启动服务器的情况下更改此参数(但是更改仅在启动新会话时才生效),因此,即使应将新模块应用于所有会话,也更容易以这种方式添加新模块。

shared_preload_libraries不同,在会话开始时(而不是在首次使用时)加载库没有太大的性能优势。但是,使用连接池时有一些优点。

  • shared_preload_libraries ( string )
    • 此变量指定在服务器启动时要预加载的一个或多个共享库。它包含以逗号分隔的库名称列表,其中每个名称的解释与LOAD命令相同。条目之间的空格将被忽略;如果您需要在库名中包含空格或逗号,请用双引号引起来。该参数只能在服务器启动时设置。如果找不到指定的库,则服务器将无法启动。

一些库需要执行某些只能在 postmaster 启动时执行的操作,例如分配共享内存,保留轻量级锁或启动后台工作程序。这些库必须通过此参数在服务器启动时加载。有关详细信息,请参见每个库的文档。

也可以预加载其他库。通过预加载共享库,可以避免首次使用该库时的库启动时间。但是,启动每个新服务器进程的时间可能会略有增加,即使该进程从不使用该库也是如此。因此,仅对于将在大多数会话中使用的库,建议使用此参数。同样,更改此参数需要重新启动服务器,因此,这不是用于短期调试任务的正确设置。改为使用session_preload_libraries

Note

在 Windows 主机上,在服务器启动时预加载库不会减少启动每个新服务器进程所需的时间;每个服务器进程将重新加载所有预加载库。但是,shared_preload_libraries在 Windows 主机上对于需要在 postmaster 启动时执行操作的库仍然有用。

19 .11.4. 其他默认值

  • dynamic_library_path ( string )
    • 如果需要打开可动态加载的模块并且CREATE FUNCTIONLOAD命令中指定的文件名没有目录组件(即,该名称不包含斜杠),则系统将在此路径中搜索所需文件。

dynamic_library_path的值必须是由冒号(或 Windows 上的分号)分隔的绝对目录路径的列表。如果列表元素以特殊字符串$libdir开头,则将已编译的 PostgreSQL 软件包库目录替换为$libdir;这是标准 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'。如果该值设置为空字符串,则自动路径搜索将关闭。

超级用户可以在运行时更改此参数,但是以这种方式进行的设置将一直保留到 Client 端连接结束,因此应保留此方法用于开发目的。推荐的设置此参数的方法是在postgresql.conf配置文件中。

  • gin_fuzzy_search_limit ( integer )
    • GIN 索引扫描返回的集合大小的软上限。有关更多信息,请参见Section 64.5