18.11. 客户端连接缺省

18.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)、 私有的针对每个用户的模式、以及两者的组合。 其它效果可以通过全局或者针对每个用户修改搜索路径设置获取。

搜索路径当前值可以用SQL函数current_schemas(参阅第 9.25 节) 检查。它和检查search_path的值不太一样,因为current_schemas 显示的是在search_path里出现的项如何被处理。

有关模式处理的更多信息,参阅第 5.7 节

default_tablespace (string)

这个变量声明当CREATE命令没有明确声明表空间时, 所创建对象(表和索引等)的缺省表空间。

值要么是一个表空间的名字,要么是一个表明使用当前数据库缺省表空间的空字符串。 如果这个数值和任意现存表空间的名字都不匹配, 那么PostgreSQL将自动使用当前数据库的缺省表空间。 如果声明非缺省表空间,用户必须有CREATE权限,或者创建尝试将失败。

这个变量不用于临时表;对他们来说, temp_tablespaces提供谘询。

这个变量在创建数据库时也没有使用。默认情况下,新的数据库继承了从 模板数据库复制的表空间设置。

关于表空间的更多信息,请参阅第 21.6 节

temp_tablespaces (string)

CREATE命令不明确指定一个表空间时, 这个变量指定要在其中创建临时对象的表空间(临时表和临时表的索引)。 出于此目的的临时文件,比如排序大型数据集,也在这些表空间中创建。

该值是表空间名称的列表。当列表中有一个以上名称时, PostgreSQL每次临时对象被创建时选择一个列表中的随机数; 除了在一个事务中之外,先后创建临时 对象放置在列表连续的表空间中。 如果列表中选定的元素是一个空字符串, PostgreSQL会自动使用当前数据库的缺省表空间。

temp_tablespaces交互设置时,指定 不存在的表空间是一个错误,为 不具有CREATE权限的用户声明一个表空间。但是, 当使用事先设定的值时,则忽略不存在的表空间, 因为对于缺少CREATE权限的用户是一个表空间。 特别是,该规则适用于使用postgresql.conf设置的值时。

默认值是一个空字符串,这会导致所有临时对象在当前数据库缺省表空间被创建。

参阅default_tablespace

check_function_bodies (boolean)

这个参数通常是on。设置为off表示在CREATE FUNCTION之间关闭函数体字符串的合法性检查。 禁用合法性检查避免了验证进程的副作用,并且避免了问题的误报,比如前向引用。 在加载函数之前代表其他用户设置该参数为offpg_dump会自动这样做。

default_transaction_isolation (enum)

每个SQL事务都有一个隔离级别,可以是"读未提交""读已提交""可重复读"或者是"可串性化"。 这个参数控制每个新事务的缺省隔离级别。缺省是"读已提交"

参考第 13 章SET TRANSACTION获取更多信息。

default_transaction_read_only (boolean)

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

参考SET TRANSACTION获取更多信息。

default_transaction_deferrable (boolean)

当在可串行化隔离级别下运行时, 延迟的只读SQL事务允许继续进行之前可能会延迟。 然而,一旦开始执行不会产生任何开销要求,以确保串行化; 所以串行化代码没有理由迫使它终止,因为并发更新, 这使这些选项适合长时间运行只读事务。

此参数控制每个新事务缺省延迟状态。 它目前对读写事务或那些比可串行化低的隔离级别下的操作没有影响。 缺省是off

参阅SET TRANSACTION获取更多详细信息。

session_replication_role (enum)

控制当前会话复制相关的触发器和规则。设置此变量需要 超级用户权限,并导致丢弃任何以前缓存查询规划。 可能的值是origin (缺省),replicalocal。 参阅ALTER TABLE获取更多信息。

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, 因为它影响所有的会话。

vacuum_freeze_table_age (integer)

如果该表pg_class.relfrozenxid 字段已达到此设置中指定的时间,VACUUM执行全表扫描。 默认值是1.5亿个事务。虽然用户可以从零到二亿设置此值。 VACUUM会默默的限制autovacuum_freeze_max_age的95%的有效值, 从而使定期手动的VACUUM在自动清理该表之前有运行机会。 详细信息请见第 23.1.5 节

vacuum_freeze_min_age (integer)

指定VACUUM在扫描一个表时用于判断是否用冻结行版本(在同一个事务中)。 缺省值为50百万。虽然用户可以指定一个 0-1000000000之间的值, 但是VACUUM将会悄无声息的将有效值限制在autovacuum_freeze_max_age的一半之内。 更多信息参见第 23.1.5 节

vacuum_multixact_freeze_table_age (integer)

如果表的pg_class.relminmxid 字段已经达到了该设置声明的寿命,则VACUUM执行一个全表扫描。 缺省是1.5亿multixact。尽管用户可以从0到2亿在任何位置设置该值, VACUUM将自动限制有效值为 autovacuum_multixact_freeze_max_age的95%, 所以在为该表加载一个反概括之前,有机会周期性的手动运行VACUUM。 更多信息请查看第 23.1.5.1 节

vacuum_multixact_freeze_min_age (integer)

声明VACUUM应该使用的中断寿命(以multixact计), 以决定在扫描一个表时是否用一个新的事务ID或multixact ID替换multixact ID。 缺省是5百万multixact。尽管用户可以从0到1百万在任何位置设置该值, VACUUM将自动限制有效值为 autovacuum_multixact_freeze_max_age的一半, 所以在强制自动清理之间没有不合理的短时间。请多信息请查看 第 23.1.5.1 节

bytea_output (enum)

设置bytea类型值的输出格式。 有效值为hex (缺省) 和escape (传统PostgreSQL 格式)。参见第 8.4 节获取更多信息。 不管这些设置,其中bytea类型总是接受这两种格式的输入。

xmlbinary (enum)

设置二进制值是如何在XML中进行编码的。 这适用于当bytea值通过xmlelement 或者xmlforest函数被转换为XML。 可能的值是base64hex, 这在XML模式标准中定义。默认值是base64。 关于XML相关的函数的进一步信息,请参阅第 9.14 节

这里的实际选择主要是口味问题, 只有在客户端应用程序中可能存在某些限制约束。 这两种方法都支持所有可能的值, 虽然十六进制编码将会比base64编码大一些。

xmloption (enum)

当XML和字符串值之间进行转换时,设置DOCUMENTCONTENT是否是隐含的。 参见第 8.13 节获取更多详细信息。有效 值DOCUMENTCONTENT。缺省是 CONTENT

按照SQL标准,设置这个选项的命令是:

SET XML OPTION { DOCUMENT | CONTENT };

这种语法在PostgreSQL中是可用的。

18.11.2. 区域和格式化

DateStyle (string)

设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。 由于历史原因,这个变量包含两个独立的部分:输出格式声明(ISO, Postgres, SQL或者German)、 输入输出的年/月/日顺序(DMY, MDY或者YMD)。 这两个可以独立设置或者一起设置。 关键字EuroEuropean 等价于DMY; 关键字US, NonEuroNonEuropean等价于MDY。 参阅第 8.5 节获取更多信息。内置缺省是ISO, MDY, 但是initdb将在初始化配置文件时根据lc_time选择一个合适的默认设置。

IntervalStyle (enum)

设置区间值的显示格式。 sql_standard将产生输出匹配SQL标准时间间隔。 postgres的值(默认值)会产生输出匹配PostgreSQL8.4之前的版本。 当DateStyle参数设置为ISO时。 postgres_verbose将产生输出匹配PostgreSQL8.4之前的版本。 当DateStyle参数被设置成非-ISO输出时。 iso_8601将产生输出匹配4.4.3.2节中ISO 8601定义的时间间隔格式。

IntervalStyle参数也会影响不明确的间隔输入的说明。 参阅第 8.5.4 节获取更多详细信息。

TimeZone (string)

设置用于显示和解析时间戳的时区。内置缺省值GMT, 但是,这通常被postgresql.conf改写;initdb 将安装设置对应它的系统环境。 意味着使用系统环境声明的时区。 参阅第 8.5.3 节获取更多信息。

timezone_abbreviations (string)

设置服务器接受日期时间输入中使用的时区缩写集合。缺省值'Default', 在全世界大多数地方都能工作的很好。 另外的可用值还有'Australia''India'等其它值。 参见第 B.3 节以获取更多信息。

extra_float_digits (integer)

这个参数为浮点数值调整显示的数据位数,浮点类型包括float4, float8以及几何数据类型。 参数值加在标准的数据位数上(FLT_DIG或者DBL_DIG中合适的)。 数值可以设置为最高3, 以包括部分关键的数据位;这个功能对转储那些需要精确恢复的浮点数据特别有用。 或者你也可以把它设置位负数以消除不需要的数据位。 参阅第 8.1.3 节

client_encoding (string)

设置客户端编码(字符集)。缺省使用数据库编码。 字符集通过第 22.3.1 节里描述的 PostgreSQL服务器支持。

lc_messages (string)

设置信息显示的语言。可接受的值是系统相关的; 参阅第 22.1 节获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

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

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

lc_monetary (string)

为格式化金额数量设置区域。比如用于to_char函数族。可接受的值是系统相关的; 参阅第 22.1 节获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

lc_numeric (string)

设置用于格式化数字的区域,比如用于to_char函数族。可接受的值是系统相关的; 参阅第 22.1 节获取更多信息。如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

lc_time (string)

设置用于格式化日期和时间值的区域。比如to_char函数族, 可接受的值是系统相关的;参阅第 22.1 节获取更多信息。 如果这个变量设置为空字符串(缺省值), 那么其值将以一种系统相关的方式从服务器的执行环境中继承。

default_text_search_config (string)

选择文本搜索函数使用的那些变量的文本搜索配置没有声明配置的明确参数。 参见第 12 章获取进一步信息。 内置缺省值是pg_catalog.simple, 如果配置匹配可以被识别的区域,则initdb将初始化该设置的配置文件, 它对应于已选择的lc_ctype区域。

18.11.3. 共享库的预加载

有几个设置可以用于预加载共享库到服务器中,以便加载额外的功能或达到性能效益。 例如 ,'$libdir/mylib'设置会导致mylib.so (或在一些平台上是mylib.sl)从安装的标准库路径中预加载。 这些设置之间的不同在于它们何时产生影响和修改它们所需的权限。

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

对于每个参数,如果多于一个库被加载,就用逗号分隔它们。 所有库的名字都被转换成小写,除非用双引号引用了它们。

只有明确打算用于PostgreSQL的共享库可以用这种方式加载。 每个PostgreSQL支持的库都有一个"魔法块"被选作保障兼容性。 因为这个原因,非PostgreSQL的库不能用这种方式加载。 可以使用操作系统工具比如LD_PRELOAD预加载。

通常,查阅特定模块的文档获取加载该模块的推荐方式。

local_preload_libraries (string)

这个变量声明一个或多个在连接开始被预加载的共享库。 这个参数在特定会话开始之后不能被修改。如果没有找到指定的库, 那么该连接尝试将会失败。

任何用户都可以设置这个选项。 因此只能加载安装的标准库目录下plugins子目录中的库文件, 数据库管理员有责任确保该目录中的库都是"安全的"local_preload_libraries中的项可以明确指定该目录, 例如$libdir/plugins/mylib;也可以仅指定库的名字— 例如mylib等价于$libdir/plugins/mylib

除非一个模块是特别设计来通过非超级用户以这种方式使用, 否则这通常不是要使用的正确设置。 查阅session_preload_libraries

session_preload_libraries (string)

这个变量声明在连接开始时预加载的一个或几个共享库。 只用超级用户可以修改这个设置。该参数值仅在连接启动时起作用。 随后的修改没有什么影响。如果没有找到指定的库,那么连接尝试将会失败。

这个特性的目的是允许调试或性能测试库被加载到指定的会话, 而不用给出明确的LOAD命令。例如,通过使用 ALTER ROLE SET设置这个参数,可以为给出用户名下的所有会话启用 auto_explain。另外,可以不用重启服务器就改变这个参数 (但是修改仅在新会话启动后起作用),所以可以很方便的添加新的模块, 尽管它们应该应用到所有会话。

不像shared_preload_libraries, 在会话开始而不是它第一次使用时加载一个库并没有太大的性能优势。 不过,在使用了连接池时,还是有一些优势的。

shared_preload_libraries (string)

这个变量指定在服务器启动时要预加载的一个或多个共享库。用逗号隔开。 这个参数只能在服务器启动时设置。如果没有找到指定的库, 那么服务器启动将会失败。

一些库需要执行仅能在服务器启动时放置的某些操作,比如分配共享内存, 预定轻量级锁或启动后端进程。这些库必须通过这个参数在服务器启动时加载。 参阅每个库的文档获取详细信息。

也可以预加载其他的库。通过预加载一个库,节省了该库第一次使用时的启动时间。 不过,每个新服务器进程的启动时间可能会稍微增加,即使是进程从未使用该库。 所以仅建议将要用于多数会话的库使用该参数。另外,修改该参数需要重启服务器, 所以说这不是用于短期调试任务的正确设置。 取而代之的是使用session_preload_libraries

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

18.11.4. 其他缺省

dynamic_library_path (string)

如果需要打开一个可以动态装载的模块并且在CREATE FUNCTION或者 LOAD命令里面声明的名字没有目录部分(也就是说名字里不包含斜杠), 那么系统将搜索这个目录以查找声明的文件。

用于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索引扫描返回的集合尺寸软上限。更多信息参见第 58.5 节