PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

9.27. 系统信息函数与操作符 #

9.27.1. 会话信息函数
9.27.2. 访问特权查询函数
9.27.3. 模式可见性查询函数
9.27.4. 系统目录信息函数
9.27.5. 对象信息与寻址函数
9.27.6. 注释信息函数
9.27.7. 数据有效性检查函数
9.27.8. 事务 ID 和快照信息函数
9.27.9. 已提交事务信息函数
9.27.10. 控制数据函数
9.27.11. 版本信息函数
9.27.12. WAL 汇总信息函数

本节描述的函数用于获取关于一个 PostgreSQL 安装的各种信息。

9.27.1. 会话信息函数 #

Table 9.71 展示了若干提取会话和系统信息的函数。

除了本节列出的函数之外, 还有许多与统计系统相关的函数也提供系统信息。 更多信息请参见 Section 27.2.26。

Table 9.71. 会话信息函数

函数

说明

current_catalog → name

current_database () → name

返回当前数据库的名字。 (在 SQL 标准中数据库被称为 “目录”, 因此 current_catalog 是该标准的拼写方式。)

current_query () → text

返回当前正在执行的查询的文本, 由客户端提交 (它可能包含多于一条语句)。

current_role → name

这等同于 current_user。

current_schema → name

current_schema () → name

返回搜索路径中排在最前的模式的名字 (如果搜索路径为空, 则返回一个空值)。 这就是在创建任何表或其他命名对象而没有指定目标模式时, 将会被使用的那个模式。

current_schemas ( include_implicit boolean ) → name[]

返回一个数组, 其中包含当前有效搜索路径中的全部模式的名字, 按它们的优先顺序排列。 (当前 search_path 设置中不对应于现有可搜索模式的项会被省略。) 如果布尔参数为 true, 那么像 pg_catalog 这样被隐式搜索的系统模式也会被包括在结果中。

current_user → name

返回当前执行上下文的用户名。

inet_client_addr () → inet

返回当前客户端的 IP 地址, 如果当前连接是通过 Unix 域套接字建立的, 则返回 NULL。

inet_client_port () → integer

返回当前客户端的 IP 端口号, 如果当前连接是通过 Unix 域套接字建立的, 则返回 NULL。

inet_server_addr () → inet

返回服务器接受当前连接时所用的 IP 地址, 如果当前连接是通过 Unix 域套接字建立的, 则返回 NULL。

inet_server_port () → integer

返回服务器接受当前连接时所用的 IP 端口号, 如果当前连接是通过 Unix 域套接字建立的, 则返回 NULL。

pg_backend_pid () → integer

返回附加到当前会话的服务器进程的进程 ID。

pg_blocking_pids ( integer ) → integer[]

返回一个数组, 其中包含正在阻塞具有指定进程 ID 的服务器进程获取锁的那些会话的进程 ID, 如果没有这样的服务器进程, 或者它没有被阻塞, 则返回一个空数组。

如果一个服务器进程持有一个与被阻塞进程的锁请求相冲突的锁 (硬阻塞), 或者它正在等待一个与被阻塞进程的锁请求相冲突、 并且在等待队列中位于其之前的锁 (软阻塞), 那么它就阻塞另一个服务器进程。 在使用并行查询时, 结果总是列出客户端可见的进程 ID (即 pg_backend_pid 的结果), 即使实际的锁是由一个子工作进程持有或等待的。 因此, 结果中可能出现重复的 PID。 另外请注意, 当一个已准备事务持有一个冲突的锁时, 它会以零进程 ID 表示。

频繁调用这个函数可能对数据库性能产生一些影响, 因为它需要在短时间内独占访问锁管理器的共享状态。

pg_conf_load_time () → timestamp with time zone

返回服务器配置文件最后一次被加载的时间。 如果当前会话在那时还活着, 那么这将是该会话自身重新读取配置文件的时间 (因此读取在不同会话中会略有不同)。 否则, 它是 postmaster 进程重新读取配置文件的时间。

pg_current_logfile ( [ text ] ) → text

返回日志收集器当前正在使用的日志文件的路径名。 路径中包括 log_directory 目录和单独的日志文件名。 如果日志收集器被禁用, 结果为 NULL。 当存在多个不同格式的日志文件时, 不带参数的 pg_current_logfile 返回按顺序列表 stderr、 csvlog、 jsonlog 中第一个被找到的格式的文件的路径。 如果没有日志文件具有任何这些格式, 则返回 NULL。 要请求关于某个特定日志文件格式的信息, 请提供 csvlog、 jsonlog 或 stderr 作为可选参数的值。 如果所请求的日志格式没有在 log_destination 中配置, 结果为 NULL。 结果反映 current_logfiles 文件的内容。

默认情况下, 这个函数被限制为超级用户以及具有 pg_monitor 角色特权的角色, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_get_loaded_modules () → setof record ( module_name text, version text, file_name text )

返回被加载到当前服务器会话中的可加载模块的列表。 除非模块作者使用 PG_MODULE_MAGIC_EXT 宏为它们提供了值, 否则 module_name 和 version 字段为 NULL。 file_name 字段给出该模块 (共享库) 的文件名。

pg_my_temp_schema () → oid

返回当前会话的临时模式的 OID, 如果它没有临时模式 (因为它尚未创建任何临时表), 则返回零。

pg_is_other_temp_schema ( oid ) → boolean

如果给定的 OID 是另一个会话的临时模式的 OID, 则返回真。 (例如, 在目录显示中排除其他会话的临时表时, 这可能有用。)

pg_jit_available () → boolean

如果一个 JIT 编译器扩展可用 (参见 Chapter 30) 并且 jit 配置参数被设置为 on, 则返回真。

pg_numa_available () → boolean

如果服务器编译时带有 NUMA 支持, 则返回真。

pg_listening_channels () → setof text

返回当前会话正在监听的异步通知通道的名字集合。

pg_notification_queue_usage () → double precision

返回异步通知队列最大尺寸中当前被等待处理的通知所占用的比例 (0–1)。 更多信息请参见 LISTEN 和 NOTIFY。

pg_postmaster_start_time () → timestamp with time zone

返回服务器启动的时间。

pg_safe_snapshot_blocking_pids ( integer ) → integer[]

返回一个数组, 其中包含正在阻塞具有指定进程 ID 的服务器进程获取一个安全快照的那些会话的进程 ID, 如果没有这样的服务器进程, 或者它没有被阻塞, 则返回一个空数组。

一个运行 SERIALIZABLE 事务的会话会阻塞一个 SERIALIZABLE READ ONLY DEFERRABLE 事务获取快照, 直到后者确定可以安全地避免获取任何谓词锁。 关于可序列化和可延迟事务的更多信息, 请参见 Section 13.2.3。

频繁调用这个函数可能对数据库性能产生一些影响, 因为它需要在短时间内访问谓词锁管理器的共享状态。

pg_trigger_depth () → integer

返回 PostgreSQL 触发器的当前嵌套层级 (如果不是从触发器内部直接或间接调用的, 则为 0)。

session_user → name

返回会话用户的名字。

system_user → text

返回用户在被赋予数据库角色之前的身份验证周期内出示的身份验证方法和身份 (如果有)。 它表示为 auth_method:identity, 如果用户没有被身份验证 (例如使用了 Trust 身份验证), 则为 NULL。

user → name

这等同于 current_user。


Note

current_catalog、 current_role、 current_schema、 current_user、 session_user 和 user 在 SQL 中具有特殊的语法地位: 它们必须不带尾随的圆括号调用。 在 PostgreSQL 中, 圆括号可以选择性地与 current_schema 一起使用, 但与其他函数不行。

session_user 通常是发起当前数据库连接的用户; 但超级用户可以用 SET SESSION AUTHORIZATION 更改这个设置。 current_user 是适用于权限检查的用户标识符。 通常它等于会话用户, 但可以用 SET ROLE 更改。 在执行带有 SECURITY DEFINER 属性的函数期间, 它同样会发生变化。 用 Unix 的行话来说, 会话用户是 “真实用户”, 而当前用户是 “有效用户”。 current_role 和 user 是 current_user 的同义词。 (SQL 标准在 current_role 和 current_user 之间做了区分, 但 PostgreSQL 没有, 因为它把用户和角色统一为单一类型的实体。)

9.27.2. 访问特权查询函数 #

Table 9.72 列出了允许以编程方式查询对象访问特权的函数。 (关于特权的更多信息请参见 Section 5.8。) 在这些函数中, 被查询特权的用户可以通过名字或 OID (pg_authid.oid) 指定, 或者如果名字被给为 public, 则检查 PUBLIC 伪角色的特权。 此外, user 参数可以被完全省略, 在这种情况下假定使用的是 current_user。 被查询的对象同样可以按名字或 OID 指定。 当按名字指定时, 如果相关, 可以包括一个模式名。 所关心的访问特权由一个文本字符串指定, 它必须对对象的类型求值为一个适当的特权关键字 (例如 SELECT)。 可以选择性地在特权类型上添加 WITH GRANT OPTION, 来测试该特权是否以授予选项的形式持有。 此外, 可以列出用逗号分隔的多种特权类型, 在这种情况下, 只要持有所列特权中的任何一种, 结果就为真。 (特权字符串的大小写不敏感, 并且在特权名字之间允许有额外的空白, 但在特权名字之内不允许。) 一些例子:

SELECT has_table_privilege('myschema.mytable', 'select');
SELECT has_table_privilege('joe', 'mytable', 'INSERT, SELECT WITH GRANT OPTION');

Table 9.72. 访问特权查询函数

函数

说明

has_any_column_privilege ( [ user name or oid, ] table text or oid, privilege text ) → boolean

用户是否拥有对表中任何一列的特权? 如果对整张表持有该特权, 或者至少有一列存在该特权的列级授予, 则此操作成功。 允许的特权类型是 SELECT、 INSERT、 UPDATE 和 REFERENCES。

has_column_privilege ( [ user name or oid, ] table text or oid, column text or smallint, privilege text ) → boolean

用户是否拥有对指定的表列的特权? 如果对整张表持有该特权, 或者该列存在该特权的列级授予, 则此操作成功。 该列可以按名字或属性编号 (pg_attribute.attnum) 指定。 允许的特权类型是 SELECT、 INSERT、 UPDATE 和 REFERENCES。

has_database_privilege ( [ user name or oid, ] database text or oid, privilege text ) → boolean

用户是否拥有对数据库的特权? 允许的特权类型是 CREATE、 CONNECT、 TEMPORARY 和 TEMP (它与 TEMPORARY 等价)。

has_foreign_data_wrapper_privilege ( [ user name or oid, ] fdw text or oid, privilege text ) → boolean

用户是否拥有对外部数据封装器的特权? 唯一允许的特权类型是 USAGE。

has_function_privilege ( [ user name or oid, ] function text or oid, privilege text ) → boolean

用户是否拥有对函数的特权? 唯一允许的特权类型是 EXECUTE。

当按名字而非 OID 指定函数时, 允许的输入与 regprocedure 数据类型的相同 (参见 Section 8.19)。 一个例子是:

SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute');

has_language_privilege ( [ user name or oid, ] language text or oid, privilege text ) → boolean

用户是否拥有对语言的特权? 唯一允许的特权类型是 USAGE。

has_largeobject_privilege ( [ user name or oid, ] largeobject oid, privilege text ) → boolean

用户是否拥有对大对象的特权? 允许的特权类型是 SELECT 和 UPDATE。

has_parameter_privilege ( [ user name or oid, ] parameter text, privilege text ) → boolean

用户是否拥有对配置参数的特权? 参数名不区分大小写。 允许的特权类型是 SET 和 ALTER SYSTEM。

has_schema_privilege ( [ user name or oid, ] schema text or oid, privilege text ) → boolean

用户是否拥有对模式的特权? 允许的特权类型是 CREATE 和 USAGE。

has_sequence_privilege ( [ user name or oid, ] sequence text or oid, privilege text ) → boolean

用户是否拥有对序列的特权? 允许的特权类型是 USAGE、 SELECT 和 UPDATE。

has_server_privilege ( [ user name or oid, ] server text or oid, privilege text ) → boolean

用户是否拥有对外部服务器的特权? 唯一允许的特权类型是 USAGE。

has_table_privilege ( [ user name or oid, ] table text or oid, privilege text ) → boolean

用户是否拥有对表的特权? 允许的特权类型是 SELECT、 INSERT、 UPDATE、 DELETE、 TRUNCATE、 REFERENCES、 TRIGGER 和 MAINTAIN。

has_tablespace_privilege ( [ user name or oid, ] tablespace text or oid, privilege text ) → boolean

用户是否拥有对表空间的特权? 唯一允许的特权类型是 CREATE。

has_type_privilege ( [ user name or oid, ] type text or oid, privilege text ) → boolean

用户是否拥有对数据类型的特权? 唯一允许的特权类型是 USAGE。 当按名字而非 OID 指定类型时, 允许的输入与 regtype 数据类型的相同 (参见 Section 8.19)。

pg_has_role ( [ user name or oid, ] role text or oid, privilege text ) → boolean

用户是否拥有对角色的特权? 允许的特权类型是 MEMBER、 USAGE 和 SET。 MEMBER 表示该角色的直接或间接成员关系, 而不考虑可能被授予哪些具体的特权。 USAGE 表示该角色的特权是否无需执行 SET ROLE 即可立即可用, 而 SET 表示是否可以通过 SET ROLE 命令切换到该角色。 可以向这些特权类型中的任何一个添加 WITH ADMIN OPTION 或 WITH GRANT OPTION, 来测试是否持有 ADMIN 特权 (所有六种拼写测试的都是同一件事)。 这个函数不允许把 user 设置为 public 的特殊情况, 因为 PUBLIC 伪角色永远不可能是真实角色的成员。

row_security_active ( table text or oid ) → boolean

在当前用户和当前环境的上下文中, 指定的表是否激活了行级安全?


Table 9.73 展示了 aclitem 类型可用的操作符, 该类型是访问特权的目录表示。 有关如何读取访问特权值的信息, 请参见 Section 5.8。

Table 9.73. aclitem 操作符

操作符

说明

示例

aclitem = aclitem → boolean

两个 aclitem 是否相等? (注意, aclitem 类型缺少常规的比较操作符集合; 它只有相等比较。 反过来, aclitem 数组也只能比较相等。)

'calvin=r*w/hobbes'::aclitem = 'calvin=r*w*/hobbes'::aclitem → f

aclitem[] @> aclitem → boolean

数组是否包含指定的特权? (如果存在一个与该 aclitem 的被授予者和授予者相匹配、 并且至少具有指定特权集合的数组条目, 则为真。)

'{calvin=r*w/hobbes,hobbes=r*w*/postgres}'::aclitem[] @> 'calvin=r*/hobbes'::aclitem → t


Table 9.74 展示了一些管理 aclitem 类型的额外函数。

Table 9.74. aclitem 函数

函数

说明

acldefault ( type "char", ownerId oid ) → aclitem[]

构造一个 aclitem 数组, 其中保存属于 OID 为 ownerId 的角色的、 类型为 type 的对象的默认访问特权。 它表示当对象的 ACL 条目为空时将被假定的访问特权。 (默认访问特权在 Section 5.8 中描述。) type 参数必须是以下之一: 'c' 对应 COLUMN, 'r' 对应 TABLE 和表状对象, 's' 对应 SEQUENCE, 'd' 对应 DATABASE, 'f' 对应 FUNCTION 或 PROCEDURE, 'l' 对应 LANGUAGE, 'L' 对应 LARGE OBJECT, 'n' 对应 SCHEMA, 'p' 对应 PARAMETER, 't' 对应 TABLESPACE, 'F' 对应 FOREIGN DATA WRAPPER, 'S' 对应 FOREIGN SERVER, 或 'T' 对应 TYPE 或 DOMAIN。

aclexplode ( aclitem[] ) → setof record ( grantor oid, grantee oid, privilege_type text, is_grantable boolean )

以一组行的形式返回 aclitem 数组。 如果被授予者是伪角色 PUBLIC, 则它在 grantee 列中用零表示。 每个被授予的特权都被表示为 SELECT、 INSERT 等 (完整列表请参见 Table 5.2)。 注意, 每个特权都被拆分为一个单独的行, 因此 privilege_type 列中只出现一个关键字。

makeaclitem ( grantee oid, grantor oid, privileges text, is_grantable boolean ) → aclitem

构造一个具有给定属性的 aclitem。 privileges 是一个以逗号分隔的特权名列表, 例如 SELECT、 INSERT 等, 所有这些都会在结果中被设置。 (特权字符串的大小写不敏感, 并且在特权名字之间允许有额外的空白, 但在特权名字之内不允许。)


9.27.3. 模式可见性查询函数 #

Table 9.75 展示了用于判断某个对象在当前模式搜索路径中是否 可见的函数。 例如, 如果一张表所属于的模式在搜索路径中, 并且搜索路径中没有更早出现同名的表, 则称该表可见。 这等同于说该表可以被不带显式模式限定的名字引用。 因此, 要列出所有可见表的名字:

SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);

对于函数和操作符, 如果路径中没有更早出现同名 且参数数据类型相同的对象, 则搜索路径中的对象被称为可见。 对于操作符类和操作符族, 名字以及关联的索引访问方法都会被考虑。

Table 9.75. 模式可见性查询函数

函数

说明

pg_collation_is_visible ( collation oid ) → boolean

排序规则在搜索路径中是否可见?

pg_conversion_is_visible ( conversion oid ) → boolean

转换在搜索路径中是否可见?

pg_function_is_visible ( function oid ) → boolean

函数在搜索路径中是否可见? (这对过程和聚集同样有效。)

pg_opclass_is_visible ( opclass oid ) → boolean

操作符类在搜索路径中是否可见?

pg_operator_is_visible ( operator oid ) → boolean

操作符在搜索路径中是否可见?

pg_opfamily_is_visible ( opclass oid ) → boolean

操作符族在搜索路径中是否可见?

pg_statistics_obj_is_visible ( stat oid ) → boolean

统计对象在搜索路径中是否可见?

pg_table_is_visible ( table oid ) → boolean

表在搜索路径中是否可见? (这对所有类型的关系都有效, 包括视图、 物化视图、 索引、 序列和外部表。)

pg_ts_config_is_visible ( config oid ) → boolean

文本检索配置在搜索路径中是否可见?

pg_ts_dict_is_visible ( dict oid ) → boolean

文本检索词典在搜索路径中是否可见?

pg_ts_parser_is_visible ( parser oid ) → boolean

文本检索解析器在搜索路径中是否可见?

pg_ts_template_is_visible ( template oid ) → boolean

文本检索模板在搜索路径中是否可见?

pg_type_is_visible ( type oid ) → boolean

类型 (或域) 在搜索路径中是否可见?


所有这些函数都要求用对象 OID 来标识要检查的对象。 如果你想按名字测试一个对象, 那么使用 OID 别名类型 (regclass、 regtype、 regprocedure、 regoperator、 regconfig 或 regdictionary) 会很方便, 例如:

SELECT pg_type_is_visible('myschema.widget'::regtype);

注意, 以这种方式测试一个不带模式限定的类型名没有太大意义 — 如果这个名字能被识别, 那它必然是可见的。

9.27.4. 系统目录信息函数 #

Table 9.76 列出了从系统目录中提取信息的函数。

Table 9.76. 系统目录信息函数

函数

说明

format_type ( type oid, typemod integer ) → text

返回一个由其类型 OID 和可能的类型修饰符所标识的数据类型的 SQL 名字。 如果不知道具体的修饰符, 请为类型修饰符传入 NULL。

pg_basetype ( regtype ) → regtype

返回一个由其类型 OID 标识的域的基本类型的 OID。 如果参数是一个非域类型的 OID, 则原样返回该参数。 如果参数不是一个有效的类型 OID, 则返回 NULL。 如果存在一条域依赖链, 它会递归直到找到基本类型。

假设 CREATE DOMAIN mytext AS text:

pg_basetype('mytext'::regtype) → text

pg_char_to_encoding ( encoding name ) → integer

把所提供的编码名转换为表示某些系统目录表中使用的内部标识符的 整数。 如果提供了一个未知的编码名, 则返回 -1。

pg_encoding_to_char ( encoding integer ) → name

把某些系统目录表中用作编码内部标识符的整数, 转换为一个人类可读的字符串。 如果提供了一个无效的编码编号, 则返回一个空字符串。

pg_get_catalog_foreign_keys () → setof record ( fktable regclass, fkcols text[], pktable regclass, pkcols text[], is_array boolean, is_opt boolean )

返回一组记录, 描述 PostgreSQL 系统目录中存在的外键关系。 fktable 列包含引用目录的名字, fkcols 列包含引用列的名字。 类似地, pktable 列包含被引用目录的名字, pkcols 列包含被引用列的名字。 如果 is_array 为真, 那么最后一个引用列是一个数组, 它的每个元素都应当匹配被引用目录中的某个条目。 如果 is_opt 为真, 那么引用列被允许包含零, 而非一个有效的引用。

pg_get_constraintdef ( constraint oid [, pretty boolean ] ) → text

重构一个约束的创建命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_expr ( expr pg_node_tree, relation oid [, pretty boolean ] ) → text

反编译存储在系统目录中的表达式的内部形式, 例如一列的默认值。 如果该表达式可能包含变量, 请把它们所引用的关系的 OID 作为第二个参数指定; 如果预期没有变量, 传零就足够了。

pg_get_functiondef ( func oid ) → text

重构一个函数或过程的创建命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。) 结果是一条完整的 CREATE OR REPLACE FUNCTION 或 CREATE OR REPLACE PROCEDURE 语句。

pg_get_function_arguments ( func oid ) → text

重构一个函数或过程的参数列表, 其形式是它在 CREATE FUNCTION 中应当出现的形式 (包括默认值)。

pg_get_function_identity_arguments ( func oid ) → text

重构标识一个函数或过程所必需的参数列表, 其形式是它在诸如 ALTER FUNCTION 之类的命令中应当出现的形式。 这种形式省略默认值。

pg_get_function_result ( func oid ) → text

重构一个函数的 RETURNS 子句, 其形式是它应当在 CREATE FUNCTION 中出现的形式。 对于过程返回 NULL。

pg_get_indexdef ( index oid [, column integer, pretty boolean ] ) → text

重构一个索引的创建命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。) 如果提供了 column 并且它不为零, 则只重构该列的定义。

pg_get_keywords () → setof record ( word text, catcode "char", barelabel boolean, catdesc text, baredesc text )

返回一组记录, 描述服务器识别的 SQL 关键字。 word 列包含关键字。 catcode 列包含一个类别码: U 表示一个非保留关键字, C 表示一个可以成为列名的关键字, T 表示一个可以成为类型或函数名的关键字, 或 R 表示一个完全保留的关键字。 barelabel 列包含 true, 如果该关键字可以在 SELECT 列表中用作一个 “裸的”列标签; 如果它只能用在 AS 之后, 则包含 false。 catdesc 列包含一个可能被本地化的字符串, 描述该关键字的类别。 baredesc 列包含一个可能被本地化的字符串, 描述该关键字的列标签状态。

pg_get_partition_constraintdef ( table oid ) → text

重构一个分区约束的定义。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_partkeydef ( table oid ) → text

重构一个分区表的分区键的定义, 其形式是它应当在 CREATE TABLE 的 PARTITION BY 子句中具有的形式。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_ruledef ( rule oid [, pretty boolean ] ) → text

重构一个规则的创建命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_serial_sequence ( table text, column text ) → text

返回与一列相关联的序列的名字, 如果没有序列与该列相关联, 则返回 NULL。 如果该列是一个标识列, 那么关联的序列就是为该列内部创建的那个序列。 对于使用 serial 类型 (serial、 smallserial、 bigserial) 之一创建的列, 它是为该 serial 列定义创建的序列。 在后一种情况下, 这种关联可以用 ALTER SEQUENCE OWNED BY 修改或移除。 (这个函数或许本应被叫做 pg_get_owned_sequence; 它当前的名字反映了这样一个事实: 它在历史上一直被用于 serial 类型的列。) 第一个参数是一个带有可选模式的表名, 第二个参数是一个列名。 由于第一个参数可能同时包含模式和表名, 它会按照常规的 SQL 规则解析, 也就是说默认会被转为小写。 第二个参数只是一个列名, 会被按字面对待, 因此它的大小写会被保留。 结果会被适当地格式化, 以便传递给序列函数 (参见 Section 9.17)。

一个典型的用途是读取一个标识列或 serial 列的序列的当前值, 例如:

SELECT currval(pg_get_serial_sequence('sometable', 'id'));

pg_get_statisticsobjdef ( statobj oid ) → text

重构一个扩展统计对象的创建命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_triggerdef ( trigger oid [, pretty boolean ] ) → text

重构一个触发器的创建命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_userbyid ( role oid ) → name

在给定其 OID 的情况下返回角色的名字。

pg_get_viewdef ( view oid [, pretty boolean ] ) → text

重构一个视图或物化视图的底层 SELECT 命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。)

pg_get_viewdef ( view oid, wrap_column integer ) → text

重构一个视图或物化视图的底层 SELECT 命令。 (这是一个反编译的重构结果, 而非该命令的原始文本。) 在这个形式的函数中, 总是启用美化打印, 并且长行会被折行, 以尝试让它们保持在指定的列数以内。

pg_get_viewdef ( view text [, pretty boolean ] ) → text

重构一个视图或物化视图的底层 SELECT 命令, 从该视图的文本名字而非它的 OID 入手。 (这已被弃用; 请改用 OID 变体。)

pg_index_column_has_property ( index regclass, column integer, property text ) → boolean

测试一个索引列是否具有命名的属性。 常见的索引列属性列在 Table 9.77 中。 (注意, 扩展访问方法可以为它们的索引定义额外的属性名。) 如果属性名未知, 或者不适用于特定的对象, 或者 OID 或列编号未能标识一个有效的对象, 则返回 NULL。

pg_index_has_property ( index regclass, property text ) → boolean

测试一个索引是否具有命名的属性。 常见的索引属性列在 Table 9.78 中。 (注意, 扩展访问方法可以为它们的索引定义额外的属性名。) 如果属性名未知, 或者不适用于特定的对象, 或者 OID 未能标识一个有效的对象, 则返回 NULL。

pg_indexam_has_property ( am oid, property text ) → boolean

测试一个索引访问方法是否具有命名的属性。 访问方法属性列在 Table 9.79 中。 如果属性名未知, 或者不适用于特定的对象, 或者 OID 未能标识一个有效的对象, 则返回 NULL。

pg_options_to_table ( options_array text[] ) → setof record ( option_name text, option_value text )

返回由 pg_class.reloptions 或 pg_attribute.attoptions 中的一个值所表示的存储选项的集合。

pg_settings_get_flags ( guc text ) → text[]

返回一个由与给定 GUC 关联的标志组成的数组, 如果它不存在, 则返回 NULL。 如果该 GUC 存在但没有可显示的标志, 结果是一个空数组。 只有 Table 9.80 中列出的最有用的标志才会被暴露。

pg_tablespace_databases ( tablespace oid ) → setof oid

返回在指定的表空间中存储了对象的那些数据库的 OID 集合。 如果这个函数返回了任何行, 那么该表空间不是空的, 因而不能被删除。 要识别填充该表空间的具体对象, 你将需要连接到由 pg_tablespace_databases 标识的数据库, 并查询它们的 pg_class 目录。

pg_tablespace_location ( tablespace oid ) → text

返回该表空间所在的文件系统路径。

pg_typeof ( "any" ) → regtype

返回传递给它的值的数据类型的 OID。 这对于排查故障或动态构造 SQL 查询可能很有帮助。 该函数被声明为返回 regtype, 它是一种 OID 别名类型 (参见 Section 8.19); 这意味着它就比较目的而言与一个 OID 相同, 但显示为类型名。

pg_typeof(33) → integer

COLLATION FOR ( "any" ) → text

返回传递给它的值的排序规则的名字。 必要时, 该值会被加引号并带上模式限定。 如果没有为参数表达式推导出排序规则, 则返回 NULL。 如果参数不是可排序的数据类型, 则会抛出一个错误。

collation for ('foo'::text) → "default"

collation for ('foo' COLLATE "de_DE") → "de_DE"

to_regclass ( text ) → regclass

把一个文本关系名转换为它的 OID。 把该字符串转换为 regclass 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 这个函数会返回 NULL 而不是抛出一个错误。

to_regcollation ( text ) → regcollation

把一个文本排序规则名转换为它的 OID。 把该字符串转换为 regcollation 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 这个函数会返回 NULL 而不是抛出一个错误。

to_regnamespace ( text ) → regnamespace

把一个文本模式名转换为它的 OID。 把该字符串转换为 regnamespace 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 这个函数会返回 NULL 而不是抛出一个错误。

to_regoper ( text ) → regoper

把一个文本操作符名转换为它的 OID。 把该字符串转换为 regoper 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 或者该名字有歧义, 这个函数会返回 NULL 而不是抛出一个错误。

to_regoperator ( text ) → regoperator

把一个文本操作符名 (带参数类型) 转换为它的 OID。 把该字符串转换为 regoperator 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 这个函数会返回 NULL 而不是抛出一个错误。

to_regproc ( text ) → regproc

把一个文本函数或过程名转换为它的 OID。 把该字符串转换为 regproc 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 或者该名字有歧义, 这个函数会返回 NULL 而不是抛出一个错误。

to_regprocedure ( text ) → regprocedure

把一个文本函数或过程名 (带参数类型) 转换为它的 OID。 把该字符串转换为 regprocedure 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 这个函数会返回 NULL 而不是抛出一个错误。

to_regrole ( text ) → regrole

把一个文本角色名转换为它的 OID。 把该字符串转换为 regrole 类型可以得到类似的结果 (参见 Section 8.19); 不过, 如果找不到该名字, 这个函数会返回 NULL 而不是抛出一个错误。

to_regtype ( text ) → regtype

解析一个文本字符串, 从中提取一个可能的类型名, 并把该名字转换为一个类型 OID。 字符串中的语法错误会导致错误; 但如果该字符串是一个语法上有效、 只是在目录中碰巧找不到的类型名, 结果为 NULL。 把该字符串转换为 regtype 类型可以得到类似的结果 (参见 Section 8.19), 区别在于那样做会对找不到的名字抛出错误。

to_regtypemod ( text ) → integer

解析一个文本字符串, 从中提取一个可能的类型名, 并转换它的类型修饰符 (如果有)。 字符串中的语法错误会导致错误; 但如果该字符串是一个语法上有效、 只是在目录中碰巧找不到的类型名, 结果为 NULL。 如果没有类型修饰符, 结果为 -1。

to_regtypemod 可以与 to_regtype 结合, 为 format_type 产生适当的输入, 从而允许把一个表示类型名的字符串规范化。

format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)')) → character varying(32)


重构 (反编译) 数据库对象的大多数函数都有一个可选的 pretty 标志, 如果它为 true, 会使结果被 “美化打印”。 美化打印会抑制不必要的圆括号, 并添加空白以提高可读性。 美化打印的格式更可读, 但默认的格式更可能被未来版本的 PostgreSQL 以相同的方式解释; 因此应避免将美化打印的输出用于转储目的。 为 pretty 参数传递 false 会产生与省略该参数相同的结果。

Table 9.77. 索引列属性

名称说明
asc该列在前向扫描上是否按升序排序?
desc该列在前向扫描上是否按降序排序?
nulls_first该列在前向扫描上是否把空值排在最前?
nulls_last该列在前向扫描上是否把空值排在最后?
orderable该列是否拥有任何已定义的排序顺序?
distance_orderable 能否通过一个“距离”操作符对该列按序扫描,例如 ORDER BY col <-> constant?
returnable仅索引扫描能否返回该列的值?
search_array该列是否原生支持 <> 搜索?
search_nulls该列是否支持 IS NULL 和 IS NOT NULL 搜索?

Table 9.78. 索引属性

名称说明
clusterable该索引能否用于 CLUSTER 命令?
index_scan该索引是否支持普通(非位图)扫描?
bitmap_scan该索引是否支持位图扫描?
backward_scan 能否在扫描中途改变扫描方向(以支持游标上的 FETCH BACKWARD 而无需物化)?

Table 9.79. 索引访问方法属性

名称说明
can_order 该访问方法是否支持 CREATE INDEX 中的 ASC、DESC 及相关关键字?
can_unique该访问方法是否支持唯一索引?
can_multi_col该访问方法是否支持多列索引?
can_exclude该访问方法是否支持排除约束?
can_include 该访问方法是否支持 CREATE INDEX 的 INCLUDE 子句?

Table 9.80. GUC 标志

标志 说明
EXPLAIN 带有此标志的参数会包含在 EXPLAIN (SETTINGS) 命令中。
NO_SHOW_ALL 带有此标志的参数不会出现在 SHOW ALL 命令中。
NO_RESET 带有此标志的参数不支持 RESET 命令。
NO_RESET_ALL 带有此标志的参数不会出现在 RESET ALL 命令中。
NOT_IN_SAMPLE 带有此标志的参数默认不会包含在 postgresql.conf 中。
RUNTIME_COMPUTED带有此标志的参数是在运行时计算的。

9.27.5. 对象信息与寻址函数 #

Table 9.81 列出了与数据库对象标识和寻址相关的函数。

Table 9.81. 对象信息与寻址函数

函数

说明

pg_get_acl ( classid oid, objid oid, objsubid integer ) → aclitem[]

返回一个数据库对象的 ACL, 对象由目录 OID、 对象 OID 和子对象 ID 指定。 对于未定义的对象, 这个函数返回 NULL 值。

pg_describe_object ( classid oid, objid oid, objsubid integer ) → text

返回一个由目录 OID、 对象 OID 和子对象 ID (例如表中的一个列编号; 当指整个对象时子对象 ID 为零) 标识的数据库对象的文本描述。 这个描述预期是人类可读的, 并且根据服务器的配置可能会被翻译。 这对于确定 pg_depend 目录中引用的对象的身份特别有用。 对于未定义的对象, 这个函数返回 NULL 值。

pg_identify_object ( classid oid, objid oid, objsubid integer ) → record ( type text, schema text, name text, identity text )

返回一行, 其中包含足以唯一标识由目录 OID、 对象 OID 和子对象 ID 指定的数据库对象的信息。 这些信息预期是机器可读的, 并且永远不会被翻译。 type 标识数据库对象的类型; schema 是该对象所属模式的名字, 对于不属于模式的对象类型则为 NULL; name 是该对象的名字, 如果名字 (以及相关的模式名) 足以唯一标识该对象, 则在必要时加上引号, 否则为 NULL; identity 是完整的对象身份, 其精确格式取决于对象类型, 格式中的每个名字都会被加上模式限定并在必要时加引号。 未定义的对象用 NULL 值标识。

pg_identify_object_as_address ( classid oid, objid oid, objsubid integer ) → record ( type text, object_names text[], object_args text[] )

返回一行, 其中包含足以唯一标识由目录 OID、 对象 OID 和子对象 ID 指定的数据库对象的信息。 返回的信息独立于当前服务器, 也就是说, 它可以用来在另一台服务器上标识一个同名的对象。 type 标识数据库对象的类型; object_names 和 object_args 是文本数组, 它们一起构成对该对象的引用。 这三个值可以被传递给 pg_get_object_address 来获得该对象的内部地址。

pg_get_object_address ( type text, object_names text[], object_args text[] ) → record ( classid oid, objid oid, objsubid integer )

返回一行, 其中包含足以唯一标识由一个类型码以及对象名字和参数数组指定的 数据库对象的信息。 返回的值是那些会被用在诸如 pg_depend 之类的系统目录中的值; 它们可以被传递给其他系统函数, 例如 pg_describe_object 或 pg_identify_object。 classid 是包含该对象的系统目录的 OID; objid 是对象自身的 OID, 而 objsubid 是子对象 ID, 如果没有则为零。 这个函数是 pg_identify_object_as_address 的逆函数。 未定义的对象用 NULL 值标识。


pg_get_acl 对于在不查看具体目录的情况下检索和检查与数据库对象关联的特权 很有用。 例如, 要检索当前数据库中对象上所有已被授予的特权:

postgres=# SELECT
    (pg_identify_object(s.classid,s.objid,s.objsubid)).*,
    pg_catalog.pg_get_acl(s.classid,s.objid,s.objsubid) AS acl
FROM pg_catalog.pg_shdepend AS s
JOIN pg_catalog.pg_database AS d
    ON d.datname = current_database() AND
       d.oid = s.dbid
JOIN pg_catalog.pg_authid AS a
    ON a.oid = s.refobjid AND
       s.refclassid = 'pg_authid'::regclass
WHERE s.deptype = 'a';
-[ RECORD 1 ]-----------------------------------------
type     | table
schema   | public
name     | testtab
identity | public.testtab
acl      | {postgres=arwdDxtm/postgres,foo=r/postgres}

9.27.6. 注释信息函数 #

Table 9.82 中展示的函数提取先前用 COMMENT 命令存储的注释。 如果对指定的参数找不到注释, 则返回一个空值。

Table 9.82. 注释信息函数

函数

说明

col_description ( table oid, column integer ) → text

返回一个表列的注释, 该列由其表的 OID 和它的列编号指定。 (obj_description 不能用于表列, 因为列没有自己的 OID。)

obj_description ( object oid, catalog name ) → text

返回由其 OID 以及包含它的系统目录的名字指定的数据库对象的注释。 例如, obj_description(123456, 'pg_class') 会检索 OID 为 123456 的表的注释。

obj_description ( object oid ) → text

只由其 OID 指定的数据库对象的注释。 由于无法保证 OID 在不同系统目录之间是唯一的, 这一点已被 弃用; 因此可能返回错误的注释。

shobj_description ( object oid, catalog name ) → text

返回由其 OID 以及包含它的系统目录的名字指定的共享数据库对象的注释。 它与 obj_description 相同, 只是它被用于检索共享对象 (即数据库、角色和表空间) 上的注释。 某些系统目录对集群中的所有数据库是全局的, 而其中对象的描述也是全局存储的。


9.27.7. 数据有效性检查函数 #

Table 9.83 中展示的函数对于检查候选输入数据的有效性会有帮助。

Table 9.83. 数据有效性检查函数

函数

说明

示例

pg_input_is_valid ( string text, type text ) → boolean

测试给定的 string 是否是指定数据类型的有效输入, 返回真或假。

只有当该数据类型的输入函数已被更新为把无效输入报告为 “软”错误时, 这个函数才会按预期工作。 否则, 无效的输入会中止事务, 就像该字符串被直接转换为该类型一样。

pg_input_is_valid('42', 'integer') → t

pg_input_is_valid('42000000000', 'integer') → f

pg_input_is_valid('1234.567', 'numeric(7,4)') → f

pg_input_error_info ( string text, type text ) → record ( message text, detail text, hint text, sql_error_code text )

测试给定的 string 是否是指定数据类型的有效输入; 如果不是, 返回本会抛出的错误的细节。 如果输入是有效的, 结果为 NULL。 输入与 pg_input_is_valid 的相同。

只有当该数据类型的输入函数已被更新为把无效输入报告为 “软”错误时, 这个函数才会按预期工作。 否则, 无效的输入会中止事务, 就像该字符串被直接转换为该类型一样。

SELECT * FROM pg_input_error_info('42000000000', 'integer') →

                       message                        | detail | hint | sql_error_code
------------------------------------------------------+--------+------+----------------
 value "42000000000" is out of range for type integer |        |      | 22003


9.27.8. 事务 ID 和快照信息函数 #

Table 9.84 中展示的函数以可导出的形式提供服务器事务信息。 这些函数的主要用途是确定在两个快照之间提交了哪些事务。

Table 9.84. 事务 ID 和快照信息函数

函数

说明

age ( xid ) → integer

返回所提供的事务 ID 与当前事务计数器之间的事务数量。

mxid_age ( xid ) → integer

返回所提供的多事务 ID 与当前多事务计数器之间的多事务 ID 数量。

pg_current_xact_id () → xid8

返回当前事务的 ID。 如果当前事务还没有 ID (因为它尚未执行任何数据库更新), 它会分配一个新的; 细节请参见 Section 67.1。 如果在一个子事务中执行, 这会返回顶层事务 ID; 细节请参见 Section 67.3。

pg_current_xact_id_if_assigned () → xid8

返回当前事务的 ID, 如果尚未分配 ID 则返回 NULL。 (如果事务可能因此而是只读的, 最好使用这个变体, 以避免不必要地消耗一个 XID。) 如果在一个子事务中执行, 这会返回顶层事务 ID。

pg_xact_status ( xid8 ) → text

报告一个近期事务的提交状态。 只要该事务足够新、 系统仍保留着它的提交状态, 结果就是 in progress、 committed 或 aborted 之一。 如果它足够老, 以致于系统中没有对该事务的任何引用存活、 并且提交状态信息已被丢弃, 则结果为 NULL。 应用程序可能会使用这个函数, 例如, 在应用程序与数据库服务器在 COMMIT 进行期间断开连接之后, 判断它们的事务是提交了还是中止了。 注意, 已准备的事务被报告为 in progress; 如果应用程序需要确定一个事务 ID 是否属于一个已准备的事务, 它们必须检查 pg_prepared_xacts。

pg_current_snapshot () → pg_snapshot

返回一个当前的 快照, 即一个显示哪些事务 ID 现在处于进行中的数据结构。 快照中只包括顶层事务 ID; 不显示子事务 ID; 细节请参见 Section 67.3。

pg_snapshot_xip ( pg_snapshot ) → setof xid8

返回快照中包含的进行中事务 ID 的集合。

pg_snapshot_xmax ( pg_snapshot ) → xid8

返回快照的 xmax。

pg_snapshot_xmin ( pg_snapshot ) → xid8

返回快照的 xmin。

pg_visible_in_snapshot ( xid8, pg_snapshot ) → boolean

根据这个快照, 给定的事务 ID 是否 可见 (也就是说, 它是否在快照被获取之前完成)? 注意, 对于一个子事务 ID (subxid), 这个函数不会给出正确的答案; 细节请参见 Section 67.3。

pg_get_multixact_members ( multixid xid ) → setof record ( xid xid, mode text )

返回指定的多事务 ID 的每个成员的事务 ID 和锁模式。 锁模式 forupd、 fornokeyupd、 sh 和 keysh 分别对应于行级锁 FOR UPDATE、 FOR NO KEY UPDATE、 FOR SHARE 和 FOR KEY SHARE, 如 Section 13.3.2 中所述。 还有两个额外的模式是多事务特有的: nokeyupd, 被不修改键列的更新使用; 以及 upd, 被修改键列的更新或删除使用。


内部事务 ID 类型 xid 的宽度为 32 位, 每过 40 亿个事务就会回绕。 然而, Table 9.84 中展示的函数 (age、 mxid_age 和 pg_get_multixact_members 除外) 使用一种 64 位的 xid8 类型, 它在安装的生命周期内不会回绕, 并且在需要时可以通过转换转换为 xid; 细节请参见 Section 67.1。 数据类型 pg_snapshot 存储关于某个特定时刻事务 ID 可见性的信息。 它的组成部分在 Table 9.85 中描述。 pg_snapshot 的文本表示是 xmin:xmax:xip_list。 例如, 10:20:10,14,15 表示 xmin=10, xmax=20, xip_list=10, 14, 15。

Table 9.85. 快照组成

名称说明
xmin 仍然处于活动状态的最低事务 ID。所有小于 xmin 的事务 ID 要么已经提交且可见,要么已经回滚且失效。
xmax 最高已完成事务 ID 加一。在快照时刻,所有大于等于 xmax 的事务 ID 尚未完成,因此不可见。
xip_list 快照时刻正在进行中的事务。一个满足 xmin <= X < xmax 并且不在此列表中的事务 ID,在快照时刻已经完成,因此根据其提交状态要么可见要么失效。此列表不包括子事务(subxid)的事务 ID。

在 PostgreSQL 13 之前的发行版中没有 xid8 类型, 因此提供了使用 bigint 表示 64 位 XID 的这些函数的变体, 并配有相应不同的快照数据类型 txid_snapshot。 这些较老的函数的名字中带有 txid。 为了向后兼容它们仍然受支持, 但可能会在未来的发行版中被移除。 请参见 Table 9.86。

Table 9.86. 已废弃的事务 ID 和快照信息函数

函数

说明

txid_current () → bigint

参见 pg_current_xact_id()。

txid_current_if_assigned () → bigint

参见 pg_current_xact_id_if_assigned()。

txid_current_snapshot () → txid_snapshot

参见 pg_current_snapshot()。

txid_snapshot_xip ( txid_snapshot ) → setof bigint

参见 pg_snapshot_xip()。

txid_snapshot_xmax ( txid_snapshot ) → bigint

参见 pg_snapshot_xmax()。

txid_snapshot_xmin ( txid_snapshot ) → bigint

参见 pg_snapshot_xmin()。

txid_visible_in_snapshot ( bigint, txid_snapshot ) → boolean

参见 pg_visible_in_snapshot()。

txid_status ( bigint ) → text

参见 pg_xact_status()。


9.27.9. 已提交事务信息函数 #

Table 9.87 中展示的函数提供关于过去事务何时被提交的信息。 只有当 track_commit_timestamp 配置选项被启用时, 它们才提供有用的数据, 并且只针对在它被启用之后提交的事务。 提交时间戳信息会在清理过程中被例行移除。

Table 9.87. 已提交事务信息函数

函数

说明

pg_xact_commit_timestamp ( xid ) → timestamp with time zone

返回一个事务的提交时间戳。

pg_xact_commit_timestamp_origin ( xid ) → record ( timestamp timestamp with time zone, roident oid)

返回一个事务的提交时间戳和复制起源。

pg_last_committed_xact () → record ( xid xid, timestamp timestamp with time zone, roident oid )

返回最近提交的事务的事务 ID、 提交时间戳和复制起源。


9.27.10. 控制数据函数 #

Table 9.88 中展示的函数打印在 initdb 期间初始化的信息, 例如目录版本。 它们还显示关于预写日志和检查点处理的信息。 这些信息是集群范围的, 而非特定于任何一个数据库。 这些函数从相同的来源提供与 pg_controldata 应用程序大致相同的信息。

Table 9.88. 控制数据函数

函数

说明

pg_control_checkpoint () → record

返回关于当前检查点状态的信息, 如 Table 9.89 所示。

pg_control_system () → record

返回关于当前控制文件状态的信息, 如 Table 9.90 所示。

pg_control_init () → record

返回关于集群初始化状态的信息, 如 Table 9.91 所示。

pg_control_recovery () → record

返回关于恢复状态的信息, 如 Table 9.92 所示。


Table 9.89. pg_control_checkpoint 的输出列

列名 类型
checkpoint_lsnpg_lsn
redo_lsnpg_lsn
redo_wal_filetext
timeline_idinteger
prev_timeline_idinteger
full_page_writesboolean
next_xidtext
next_oidoid
next_multixact_idxid
next_multi_offsetxid
oldest_xidxid
oldest_xid_dbidoid
oldest_active_xidxid
oldest_multi_xidxid
oldest_multi_dbidoid
oldest_commit_ts_xidxid
newest_commit_ts_xidxid
checkpoint_timetimestamp with time zone

Table 9.90. pg_control_system 的输出列

列名 类型
pg_control_versioninteger
catalog_version_nointeger
system_identifierbigint
pg_control_last_modifiedtimestamp with time zone

Table 9.91. pg_control_init 的输出列

列名 类型
max_data_alignmentinteger
database_block_sizeinteger
blocks_per_segmentinteger
wal_block_sizeinteger
bytes_per_wal_segmentinteger
max_identifier_lengthinteger
max_index_columnsinteger
max_toast_chunk_sizeinteger
large_object_chunk_sizeinteger
float8_pass_by_valueboolean
data_page_checksum_versioninteger
default_char_signednessboolean

Table 9.92. pg_control_recovery 的输出列

列名 类型
min_recovery_end_lsnpg_lsn
min_recovery_end_timelineinteger
backup_start_lsnpg_lsn
backup_end_lsnpg_lsn
end_of_backup_record_requiredboolean

9.27.11. 版本信息函数 #

Table 9.93 中展示的函数打印版本信息。

Table 9.93. 版本信息函数

函数

说明

version () → text

返回一个描述 PostgreSQL 服务器版本的字符串。 也可以从 server_version 获取这一信息, 而要获得机器可读的版本, 请使用 server_version_num。 软件开发者应当使用 server_version_num (自 8.2 起可用) 或 PQserverVersion, 而不是解析文本版本。

unicode_version () → text

返回一个表示 PostgreSQL 所使用的 Unicode 版本的字符串。

icu_unicode_version () → text

如果服务器构建时带有 ICU 支持, 则返回一个表示 ICU 所使用的 Unicode 版本的字符串; 否则返回 NULL


9.27.12. WAL 汇总信息函数 #

Table 9.94 中展示的函数打印关于 WAL 汇总状态的信息。 参见 summarize_wal。

Table 9.94. WAL 汇总信息函数

函数

说明

pg_available_wal_summaries () → setof record ( tli bigint, start_lsn pg_lsn, end_lsn pg_lsn )

返回关于数据目录中 pg_wal/summaries 之下存在的 WAL 汇总文件的信息。 每个 WAL 汇总文件会返回一行。 每个文件都在指定的 LSN 范围内、 针对指定的 TLI 汇总 WAL。 这个函数可能有助于判断服务器上是否已有足够多的 WAL 汇总, 以便基于一个已知起始 LSN 的先前备份来执行一次增量备份。

pg_wal_summary_contents ( tli bigint, start_lsn pg_lsn, end_lsn pg_lsn ) → setof record ( relfilenode oid, reltablespace oid, reldatabase oid, relforknumber smallint, relblocknumber bigint, is_limit_block boolean )

返回关于由 TLI 以及起始和结束 LSN 标识的单个 WAL 汇总文件内容的信息。 每个具有 is_limit_block 为假的行都表明, 由其余输出列标识的块在该文件所汇总的记录范围内, 至少被一条 WAL 记录修改过。 每个具有 is_limit_block 为真的行则表明, 要么 (a) 关系分支在相关的 WAL 记录范围内被截断到 relblocknumber 给出的长度, 要么 (b) 关系分支在相关的 WAL 记录范围内被创建或删除; 在这类情况下, relblocknumber 将为零。

pg_get_wal_summarizer_state () → record ( summarized_tli bigint, summarized_lsn pg_lsn, pending_lsn pg_lsn, summarizer_pid int )

返回关于 WAL 汇总器进展的信息。 如果 WAL 汇总器自实例启动以来从未运行过, 那么 summarized_tli 和 summarized_lsn 将分别是 0 和 0/0; 否则它们将是被写到磁盘上的最后一个 WAL 汇总文件的 TLI 和结束 LSN。 如果 WAL 汇总器当前正在运行, pending_lsn 将是它已消费的最后一条记录的结束 LSN, 它必须始终大于等于 summarized_lsn; 如果 WAL 汇总器没有在运行, 它将等于 summarized_lsn。 summarizer_pid 是 WAL 汇总器进程的 PID (如果它在运行), 否则为 NULL。

作为一个特殊的例外, 如果 WAL 汇总器在 wal_level=minimal 下生成的 WAL 上运行, 它会拒绝生成 WAL 汇总文件, 因为这样的汇总用作增量备份的基础是不安全的。 在这种情况下, 上述字段会继续推进, 就像正在生成汇总一样, 但什么也不会写到磁盘上。 一旦汇总器前进到在 wal_level 被设置为 replica 或更高时生成的 WAL, 它就会恢复向磁盘写汇总。