19.11. 客户端连接默认值

19.11.1. 语句行为
19.11.2. 区域和格式化
19.11.3. 共享库预载入
19.11.4. 其他默认值

19.11.1. 语句行为

search_path (string)

这个变量指定当一个对象(表、数据类型、函数等)被用一个无模式限定的简单名称引用时,用于进行搜索该对象的模式顺序。当在不同模式中有同名对象时,将使用第一个在搜索路径中被找到的对象。一个不属于搜索路径中任何一个模式的对象只能通过用限定名(带点号)指定包含它的模式来引用。

search_path的值必需是一个逗号分隔的模式名列表。任何不是一个已有模式的名称,或者是一个用户不具有USAGE权限的模式,将被安静地忽略。

如果列表项之一是特殊名$user,则具有SESSION_USER返回的名字的模式将取代它(如果有这样一个模式并且该用户有该模式的USAGE权限;如果没有,$user会被忽略)。

系统目录模式pg_catalog总是被搜索,不管它是否在搜索路径中被提及。如果它在路径中被提及,那么它将被按照路径指定的顺序搜索。如果pg_catalog不在路径中,则它将在任何路径项之前被搜索。

同样,当前会话的临时表模式pg_temp_nnn也总是被搜索(如果存在)。它可以在路径中通过使用别名pg_temp显式列出。如果在路径中没有列出,那么会首先对它进行搜索(甚至是在pg_catalog之前)。然而,临时模式只被用来搜索关系(表、视图、序列等)和数据类型名。它从不用于搜索函数或操作符名。

当对象创建时没有指定一个特定目标模式,它们将被放置在search_path中第一个合法模式中。如果搜索路径为空将报告一个错误。

这个参数的缺省值是"$user", public。这种设置支持一个数据库(其中没有用户拥有私有模式,并且所有人共享使用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期间对函数体字符串的验证。禁用验证避免了验证处理的副作用并且避免了如向前引用导致的伪肯定。在代表其他用户载入函数之前设置这个参数为offpg_dump会自动这样做。

default_transaction_isolation (enum)

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

更多信息请参阅Chapter 13SET TRANSACTION

default_transaction_read_only (boolean)

一个只读的 SQL 事务不能修改非临时表。这个参数控制每个新事务的默认只读状态 。默认是off(读/写)。

更多信息请参考SET TRANSACTION

default_transaction_deferrable (boolean)

当运行在可序列化隔离级别时,一个可延迟只读 SQL 事务可以在它被允许继续之前延迟一段时间。但是,一旦它开始执行就不会产生任何用来保证可序列化性的负荷;因此序列化代码将没有任何理由因为并发更新而强制它中断,使得这个选项适合于长时间运行的只读事务。

这个参数控制每个新事务的默认可延迟状态。目前它对读写事务或者那些操作在低于可序列化隔离级别上的事务无效。默认值是off

详情请参阅SET TRANSACTION

session_replication_role (enum)

为当前会话控制复制相关的触发器和规则的触发。需要超级用户权限才能设置这个变量,并且会导致丢弃任何之前缓存下来的查询计划。可能的值有origin(默认)、replicalocal

这个设置的预期用途是由逻辑复制系统在应用所复制的更改时将它设置为replica。其效果将是触发器和规则(没有对其默认配置做修改)在复制机上将不会被触发。更多信息请参考ALTER TABLE的子句ENABLE TRIGGER以及ENABLE RULE

PostgreSQL在内部会把设置originlocal同样对待。第三方复制系统可能会把这两个值用于其内部目的,例如把local用来标出一个不应复制其更改的会话。

因为外键被实现为触发器,将这个参数设置为replica还会禁用所有的外键检查,如果使用不当可能会让数据处于一种不一致的状态。

statement_timeout (integer)

中止任何使用了超过指定毫秒数的语句,从命令到达服务器开始计时。如果log_min_error_statement被设置为ERROR或更低,语句如果超时也会被记录。一个零值(默认)将关闭这个参数。

我们不推荐在postgresql.conf中设置statement_timeout,因为它会影响所有会话。

lock_timeout (integer)

如果任何语句在试图获取表、索引、行或其他数据库对象上的锁时等到超过指定的毫秒数,该语句将被中止。该时间限制独立地应用于每一次锁获取尝试。该限制会应用到显式锁定请求(如LOCK TABLE或不带NOWAITSELECT FOR UPDATE)和隐式获得的锁。如果log_min_error_statement被设置为ERROR或更低,超时的语句会被记录。一个零值(默认)将关闭这个参数。

statement_timeout不同,这个超时只在等待锁时发生。注意如果statement_timeout为非零,设置lock_timeout为相同或更大的值没有意义,因为事务超时将总是第一个被触发。

我们不推荐在postgresql.conf中设置lock_timeout,因为它会影响所有会话。

idle_in_transaction_session_timeout (integer)

终止任何已经闲置超过这个参数所指定的时间(以毫秒计)的打开事务的会话。这使得该会话所持有的任何锁被释放,并且其所持有的连接槽可以被重用,它也允许只对这个事务可见的元组被清理。有关于此的详情请见Section 24.1

默认值 0 会禁用这个特性。

vacuum_freeze_table_age (integer)

当表的pg_class.relfrozenxid域达到该设置指定的年龄时,VACUUM会执行一次激进的扫描。激进的扫描与常规VACUUM的不同在于它会访问每一个可能包含未冻结 XID 或者 MXID 的页面,而不只是那些可能包含死亡元组的页面。默认值是 1.5 亿个事务。尽管用户可以把这个值设置为从 0 到 20 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。更多信息请见Section 24.1.5

vacuum_freeze_min_age (integer)

指定VACUUM在扫描表时用来决定是否冻结行版本的切断年龄(以事务计)。默认值是 5 千万个事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_freeze_max_age值的一半,这样在强制执行的自动清理之间不会有过短的时间间隔。更多信息请见Section 24.1.5

vacuum_multixact_freeze_table_age (integer)

如果表的pg_class.relminmxid域超过了这个设置指定的年龄,VACUUM会执行一次激进的扫描。激进的扫描与常规VACUUM的区别在于它会访问每一个可能包含未冻结 XID 或者 MXID 的页面,而不是只扫描那些可能包含死亡元组的页面。默认值是 1.5 亿个组合事务。尽管用户可以把这个值设置为从 0 到 20 亿,VACUUM会悄悄地将有效值设置为autovacuum_multixact_freeze_max_age值的95%,因此在表上启动一次反回卷自动清理之前有机会进行一次定期手动VACUUM。更多信息请见Section 24.1.5.1

vacuum_multixact_freeze_min_age (integer)

指定VACUUM在扫描表时用来决定是否把组合事务 ID 替换为一个更新的事务 ID 或组合事务 ID 的切断年龄(以组合事务计)。默认值是 5 千万个组合事务。尽管用户可以将这个值设置为从 0 到 10 亿,VACUUM会悄悄地将有效值设置为autovacuum_multixact_freeze_max_age值的一半,这样在强制执行的自动清理之间不会有过短的时间间隔。更多信息请见Section 24.1.5.1

vacuum_cleanup_index_scale_factor (floating point)

指定在以前的统计信息收集过程中计数到的堆元组总数的一个分数,插入不超过这一数量所代表的元组不会导致VACUUM清理阶段的索引扫描。这个设置当前仅适用于B-树索引。

如果没有元组从堆中删除,则当至少满足下列条件之一时,在VACUUM清理阶段仍会扫描B-树索引:索引统计信息过时或者索引中包含在清理时可回收的已删除页。如果新近插入的元组数占上次统计信息收集时检测到的堆元组总数的比例超过vacuum_cleanup_index_scale_factor,则认为索引信息已经过时。堆元组的总数被存放在索引的元页中。注意,直到VACUUM找不到死亡元组之前,元页中都不包括这个数据。因此只有在第二次以及之后的VACUUM周期检测不到死亡元组时,清理阶段的B-树索引扫描才能被跳过。

该值的取值范围可以是从010000000000。当vacuum_cleanup_index_scale_factor被设置为0时,在VACUUM清理期间不会跳过索引扫描。默认值是0.1

bytea_output (enum)

设置bytea类型值的输出格式。有效值是hex(默认)和 escape(传统的 PostgreSQL 格式)。详见Section 8.4。不管这个设置的值如何,bytea类型总是接受这两种格式的输入。

xmlbinary (enum)

设置二进制值如何被编码为 XML。例如,这适用于通过xmlelement函数或xmlforest函数将bytea值转换到 XML 值。可能的值有base64hex,它们都是用 XML 模式标准定义的。默认值是base64。更多关于 XML 相关函数的信息可参阅Section 9.14

这里的实际选择都是根据爱好做出的,只受客户端应用中可能存在的限制的约束。两种方法都支持所有可能的值,尽管十六进制编码将比 base64 编码更大。

xmloption (enum)

当在XML和字符串值之间进行转换时,无论设置DOCUMENT或 CONTENT都是隐式的。可参阅Section 8.13。 有效值是DOCUMENT和CONTENT。 缺省值是CONTENT。当在 XML 和字符串值之间进行转换时,设置DOCUMENTCONTENT都是隐式的。详见Section 8.13。有效值是DOCUMENTCONTENT。默认值是CONTENT

根据 SQL 标准,设置这个选项的命令是:

SET XML OPTION { DOCUMENT | CONTENT };

这种语法在 PostgreSQL 也可用。

gin_pending_list_limit (integer)

设置fastupdate被启用时可以使用的 GIN 待处理列表的最大尺寸。如果该列表增长到超过这个最大尺寸,会通过批量将其中的项移入主 GIN 数据结构来清理列表。默认值是四兆字节(4MB)。可以通过更改索引的存储参数来为个别 GIN 索引覆盖这个设置。更多信息请见Section 66.4.1Section 66.5

19.11.2. 区域和格式化

DateStyle (string)

设置日期和时间值的显示格式,以及解释有歧义的日期输入值的规则。由于历史原因, 这个变量包含两个独立的部分:输出格式声明(ISOPostgresSQLGerman)、 输入/输出的年/月/日顺序(DMYMDYYMD)。这些可以被独立设置或者一起设置。关键字EuroEuropeanDMY的同义词;关键字USNonEuroNonEuropeanMDY的同义词。详见Section 8.5。内建默认值是ISO, MDY,但是initdb将用对应于选中的lc_time区域行为的设置初始化配置文件。

IntervalStyle (enum)

设置间隔值的显示格式。值sql_standard将产生匹配 SQL 标准间隔文本的输出。当DateStyle参数被设置为ISO时,值postgres(默认)将产生匹配PostgreSQL发行 8.4 之前的输出。当DateStyle参数被设置为非ISO输出时,值postgres_verbose会产生匹配PostgreSQL发行 8.4 之前的输出。值iso_8601会产生匹配在 ISO 8601 的 4.4.3.2 节中定义的带标志符格式的时间间隔的输出。

IntervalStyle参数也可以影响对有歧义的间隔输入的解释。详见Section 8.5.4

TimeZone (string)

设置用于显示和解释时间戳的时区。内建默认值是GMT,但是它通常会在postgresql.conf中被覆盖;initdb将安装一个对应于其系统环境的设置。详见Section 8.5.3

timezone_abbreviations (string)

设置服务器接受的日期时间输入中使用的时区缩写集合。默认值为'Default', 这个集合在全世界大多数地方都能工作。也还有'Australia''India',以及可能为一种特定安装定义的其他集合。详见Section B.3

extra_float_digits (integer)

这个参数为浮点值调整显示的位数,包括float4float8以及几何数据类型。参数值被加在标准的位数(FLT_DIGDBL_DIG,视情况而定)上。该值最高可以被设置为 3 来包括部分有效位;这特别有助于转储需要被准确恢复的否点数据。或者它可以被设置为负值来消除不需要的位。另请参见Section 8.1.3

client_encoding (string)

设置客户端编码(字符集)。默认使用数据库编码。PostgreSQL服务器所支持的字符集在Section 23.3.1中描述。

lc_messages (string)

设置消息显示的语言。可接受的值是系统相关的;详见Section 23.1。如果这个变量被设置为空字符串(默认),那么该值将以一种系统相关的方式从服务器的执行环境中继承。

在一些系统上,这个区域分类并不存在。仍然可以设置这个变量,只是不会有任何效果。同样,所期望语言的翻译消息也可能不存在。在这种情况下,你将仍然继续看到英文消息。

只有超级用户可以改变这个设置。因为它同时影响发送到服务器日志和客户端的消息。一个不正确的值可能会降低服务器日志的可读性。

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)载入它。

总之,请参考特定模块的文档来用推荐的方法载入它。

local_preload_libraries (string)

这个变量指定一个或者多个要在连接开始时预载入的共享库。它包含一个由逗号分隔的库名列表,其中每个名称都会按LOAD命令的方式解析。项之间的空格会被忽略,如果需要在库名中包含空格或者逗号,请把库名放在双引号内。这个参数 值只在连接开始时生效。后续的更改不会有任何效果。如果一个指定的 库没有找到,连接尝试将会失败。

任何用户都能设置这个选项。正因为如此,能被这样载入的库被严格限制为出现于安装的标准库 目录中plugins子目录下的共享库(保证只有安全的库被安装到 这里是数据库管理员的责任)。local_preload_libraries中的项可以显式 指定这个目录,例如$libdir/plugins/mylib,或者只是指定库的 名称 — mylib$libdir/plugins/mylib的效果是相同的。

这个特性的目的是允许非特权用户在特定的会话中载入正在调试的或者性能度量库, 而无需一个显式的LOAD命令。为了这个目的,通常通过使用客 户端的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 主机上,在服务器启动时预载入一个库并不会减少启动每个新服务器进程所需的 时间;每一个服务器进程将会重新载入预载入的库。不过,对于那些要在postmaster启动时 执行操作的库来说,Windows 主机上的 shared_preload_libraries任然有用。

jit_provider (string)

这个变量是要被使用的JIT提供者库的名称(见Section 32.4.2)。默认是llvmjit。这个参数只能在服务器启动时设置。

如果这个变量被设置为一个不存在的库,JIT将不可用,但是也不会发生错误。这种特性允许在主PostgreSQL包之外单独安装JIT支持。

19.11.4. 其他默认值

dynamic_library_path (string)

如果需要打开一个可以动态装载的模块并且在CREATE FUNCTIONLOAD命令中指定的文件名没有目录部分(即名字中不包含斜线),那么系统将搜索这个路径以查找所需的文件。

dynamic_library_path的值必须是一个冒号分隔(或者在 Windows 上以分号分隔)的绝对目录路径的列表。如果一个列表元素以特殊字符串开始,$libdir会被替换为PostgreSQL包中已编译好的库目录。这里是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'。如果该值被设置为一个空字符串,则关闭自动路径搜索。

这个参数可以在运行时由超级用户修改,但是这样修改的设置只能保持到这个客户端连接的结尾,因此这个方法应该保留给开发目的。 我们建议在postgresql.conf配置文件中设置这个参数。

gin_fuzzy_search_limit (integer)

GIN 索引返回的集合尺寸的软上限。详见Section 66.5