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

9.28. 系统管理与维护函数 #

9.28.1. 配置设置函数
9.28.2. 服务器信号函数
9.28.3. 备份控制函数
9.28.4. 恢复控制函数
9.28.5. 快照同步函数
9.28.6. 复制管理函数
9.28.7. 数据库对象管理函数
9.28.8. 索引维护函数
9.28.9. 通用文件访问函数
9.28.10. 咨询锁函数

本节描述的函数用于控制和监控一个 PostgreSQL 安装。

9.28.1. 配置设置函数 #

Table 9.95 展示了可用于查询和更改运行时配置参数的函数。

Table 9.95. 配置设置函数

函数

说明

示例

current_setting ( setting_name text [, missing_ok boolean ] ) → text

返回设置 setting_name 的当前值。 如果没有这样的设置, 除非提供了 missing_ok 并且它为 true (在那种情况下返回 NULL), 否则 current_setting 会抛出一个错误。 这个函数对应于 SQL 命令 SHOW。

current_setting('datestyle') → ISO, MDY

set_config ( setting_name text, new_value text, is_local boolean ) → text

把参数 setting_name 设置为 new_value, 并返回那个值。 如果 is_local 为 true, 那么新值只会在当前事务期间应用。 如果你希望新值在当前会话的剩余时间内都适用, 请改用 false。 这个函数对应于 SQL 命令 SET。

set_config 接受 new_value 的 NULL 值, 但由于设置不能为空, 它会被解释为把该设置重置为其默认值的请求。

set_config('log_statement_stats', 'off', false) → off


9.28.2. 服务器信号函数 #

Table 9.96 中展示的函数向其他服务器进程发送控制信号。 默认情况下这些函数的使用被限制为超级用户, 但可以用 GRANT 把访问权授予其他人, 已注明例外的除外。

如果信号被成功发送, 这些函数中的每一个都返回 true; 如果发送信号失败, 则返回 false。

Table 9.96. 服务器信号函数

函数

说明

pg_cancel_backend ( pid integer ) → boolean

取消其后端进程具有指定进程 ID 的会话的当前查询。 如果调用角色是被取消后端所属角色的成员, 或者调用角色具有 pg_signal_backend 的特权, 那么这也是被允许的; 不过, 只有超级用户才能取消超级用户的后端。 作为一个例外, 具有 pg_signal_autovacuum_worker 特权的角色被允许取消自动清理工作进程, 否则这些进程会被视为超级用户后端。

pg_log_backend_memory_contexts ( pid integer ) → boolean

请求记录具有指定进程 ID 的后端的内存上下文。 这个函数可以把请求发送给除 logger 之外的后端和辅助进程。 这些内存上下文将以 LOG 消息级别被记录。 它们会根据所设置的日志配置 (更多信息请参见 Section 19.8) 出现在服务器日志中, 但无论 client_min_messages 如何, 它们都不会被发送给客户端。

pg_reload_conf () → boolean

让 PostgreSQL 服务器的所有进程重新加载它们的配置文件。 (这是通过向 postmaster 进程发送一个 SIGHUP 信号来发起的, 它随后会向它的每个子进程发送 SIGHUP。) 在重新加载之前, 你可以使用 pg_file_settings、 pg_hba_file_rules 和 pg_ident_file_mappings 视图来检查配置文件中可能的错误。

pg_rotate_logfile () → boolean

向日志文件管理器发信号, 让它立即切换到一个新的输出文件。 这只在内建的日志收集器运行时才有效, 因为否则不存在日志文件管理器子进程。

pg_terminate_backend ( pid integer, timeout bigint DEFAULT 0 ) → boolean

终止其后端进程具有指定进程 ID 的会话。 如果调用角色是被终止后端所属角色的成员, 或者调用角色具有 pg_signal_backend 的特权, 那么这也是被允许的; 不过, 只有超级用户才能终止超级用户的后端。 作为一个例外, 具有 pg_signal_autovacuum_worker 特权的角色被允许终止自动清理工作进程, 否则这些进程会被视为超级用户后端。

如果没有指定 timeout 或者它为零, 那么无论该进程是否真的被终止, 这个函数都会返回 true, 它只表明信号被成功发送。 如果指定了 timeout (以毫秒为单位) 并且它大于零, 那么该函数会等待该进程实际被终止, 或者等到给定的时间过去。 如果该进程被终止, 函数返回 true。 超时时, 会发出一个警告并返回 false。


pg_cancel_backend 和 pg_terminate_backend 向由进程 ID 标识的后端进程发送信号 (分别为 SIGINT 或 SIGTERM)。 一个活动后端的进程 ID 可以从 pg_stat_activity 视图的 pid 列中找到, 或者通过在服务器上列出 postgres 进程来找到 (在 Unix 上使用 ps, 在 Windows 上使用 Task Manager)。 一个活动后端的角色可以从 pg_stat_activity 视图的 usename 列中找到。

pg_log_backend_memory_contexts 可用于记录一个后端进程的内存上下文。 例如:

postgres=# SELECT pg_log_backend_memory_contexts(pg_backend_pid());
 pg_log_backend_memory_contexts
--------------------------------
 t
(1 row)

每个内存上下文会记录一条消息。 例如:

LOG:  logging memory contexts of PID 10377
STATEMENT:  SELECT pg_log_backend_memory_contexts(pg_backend_pid());
LOG:  level: 1; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used
LOG:  level: 2; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used
LOG:  level: 2; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used
LOG:  level: 2; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used
LOG:  level: 2; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used
LOG:  level: 2; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used
LOG:  level: 2; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used
LOG:  level: 2; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used
...
LOG:  level: 2; ErrorContext: 8192 total in 1 blocks; 7928 free (3 chunks); 264 used
LOG:  Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 used

如果在同一个父上下文之下的子上下文多于 100 个, 那么前 100 个子上下文会被记录, 外加其余上下文的一个摘要。 注意, 频繁调用这个函数可能产生显著的开销, 因为它可能生成大量的日志消息。

9.28.3. 备份控制函数 #

Table 9.97 中展示的函数协助进行联机备份。 这些函数不能在恢复期间执行 (pg_backup_start、 pg_backup_stop 和 pg_wal_lsn_diff 除外)。

关于这些函数的正确使用的细节, 请参见 Section 25.3。

Table 9.97. 备份控制函数

函数

说明

pg_create_restore_point ( name text ) → pg_lsn

在预写日志中创建一个命名的标记记录, 它以后可以用作一个恢复目标, 并返回相应的预写日志位置。 然后可以把给定的名字与 recovery_target_name 一起使用, 来指定恢复要前进到的那一点。 应避免创建多个同名的恢复点, 因为恢复会在第一个名字与恢复目标相匹配的恢复点处停止。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_current_wal_flush_lsn () → pg_lsn

返回当前的预写日志刷写位置 (见下文说明)。

pg_current_wal_insert_lsn () → pg_lsn

返回当前的预写日志插入位置 (见下文说明)。

pg_current_wal_lsn () → pg_lsn

返回当前的预写日志写位置 (见下文说明)。

pg_backup_start ( label text [, fast boolean ] ) → pg_lsn

让服务器准备好开始一次联机备份。 唯一必需的参数是用于该备份的一个任意的用户定义标签。 (通常这会是备份转储文件将被存储时使用的名字。) 如果可选的第二个参数被给为 true, 它规定尽可能快地执行 pg_backup_start。 这会强制一次立即检查点, 它将导致 I/O 操作的骤增, 从而拖慢任何并发执行的查询。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_backup_stop ( [wait_for_archive boolean ] ) → record ( lsn pg_lsn, labelfile text, spcmapfile text )

结束一次联机备份的执行。 备份标签文件和表空间映射文件的期望内容会作为函数结果的一部分返回, 并且必须被写到备份区域中的文件里。 这些文件绝不能被写到活动的数据目录中 (那样做会导致 PostgreSQL 在崩溃的情况下无法重启)。

这里有一个 boolean 类型的可选参数。 如果为假, 该函数会在备份完成后立即返回, 而不等待 WAL 被归档。 这种行为只对独立监控 WAL 归档的备份软件有用。 否则, 使备份达到一致所需的 WAL 可能会缺失, 从而使备份变得无用。 默认情况下, 或者当这个参数为真时, 在归档被启用的情况下 pg_backup_stop 会等待 WAL 被归档。 (在一台备用服务器上, 这意味着只有当 archive_mode = always 时它才会等待。 如果主服务器上的写活动很低, 那么在主服务器上运行 pg_switch_wal 以触发一次立即的段切换可能有用。)

当在主服务器上执行时, 这个函数还会在预写日志归档区域中创建一个备份历史文件。 历史文件包括给 pg_backup_start 的标签、 该备份的起始和结束预写日志位置, 以及备份的起始和结束时间。 在记录了结束位置之后, 当前的预写日志插入点会被自动推进到下一个预写日志文件, 以便结束的预写日志文件可以被立即归档, 从而完成备份。

该函数的结果是一条单一的记录。 lsn 列保存该备份的结束预写日志位置 (它同样可以被忽略)。 第二列返回备份标签文件的内容, 第三列返回表空间映射文件的内容。 这些必须作为备份的一部分存储, 并且是恢复过程所需的组成部分。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_switch_wal () → pg_lsn

强制服务器切换到一个新的预写日志文件, 这样当前的文件就可以被归档 (假设你正在使用连续归档)。 结果是刚完成的预写日志文件内的结束预写日志位置加 1。 如果自上次预写日志切换以来没有任何预写日志活动, pg_switch_wal 不会做任何事情, 并且返回当前正在使用的预写日志文件的开始位置。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_walfile_name ( lsn pg_lsn ) → text

把一个预写日志位置转换为容纳该位置的 WAL 文件的名字。

pg_walfile_name_offset ( lsn pg_lsn ) → record ( file_name text, file_offset integer )

把一个预写日志位置转换为 WAL 文件名以及该文件内的字节偏移。

pg_split_walfile_name ( file_name text ) → record ( segment_number numeric, timeline_id bigint )

从一个 WAL 文件名中提取序列号和时间线 ID。

pg_wal_lsn_diff ( lsn1 pg_lsn, lsn2 pg_lsn ) → numeric

计算两个预写日志位置之间以字节计的差 (lsn1 - lsn2)。 这可以与 pg_stat_replication 或 Table 9.97 中展示的某些函数一起使用, 来获取复制延迟。


pg_current_wal_lsn 以上述函数所用的相同格式显示当前的预写日志写位置。 类似地, pg_current_wal_insert_lsn 显示当前的预写日志插入位置, 而 pg_current_wal_flush_lsn 显示当前的预写日志刷写位置。 插入位置是任意时刻预写日志的 “逻辑”结尾, 而写位置是实际上已从服务器内部缓冲区写出的内容的结尾, 刷写位置则是已知已被写到持久存储的最后一个位置。 写位置是可以从服务器外部检查的内容的结尾, 如果你关心归档未完整写完的预写日志文件, 它通常就是你想要的。 插入和刷写位置被提供出来主要是为了服务器调试的目的。 这些都是只读操作, 不需要超级用户权限。

你可以使用 pg_walfile_name_offset 从一个 pg_lsn 值中提取相应的预写日志文件名和字节偏移。 例如:

postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn);
        file_name         | file_offset
--------------------------+-------------
 00000001000000000000000D |     4039624
(1 row)

类似地, pg_walfile_name 只提取预写日志文件名。

pg_split_walfile_name 对于从一个文件偏移和 WAL 文件名计算一个 LSN 很有用, 例如:

postgres=# \set file_name '000000010000000100C000AB'
postgres=# \set offset 256
postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset AS lsn
  FROM pg_split_walfile_name(:'file_name') pd,
       pg_show_all_settings() ps
  WHERE ps.name = 'wal_segment_size';
      lsn
---------------
 C001/AB000100
(1 row)

9.28.4. 恢复控制函数 #

Table 9.98 中展示的函数提供关于一台备用服务器当前状态的信息。 这些函数既可以在恢复期间执行, 也可以在正常运行时执行。

Table 9.98. 恢复信息函数

函数

说明

pg_is_in_recovery () → boolean

如果恢复仍在进行中, 则返回真。

pg_last_wal_receive_lsn () → pg_lsn

返回流复制已经接收并同步到磁盘的最后一个预写日志位置。 在流复制进行期间它会单调增加。 如果恢复已经完成, 那么它会保持静止在恢复期间接收并同步到磁盘的最后一条 WAL 记录的位置。 如果流复制被禁用, 或者它尚未开始, 该函数返回 NULL。

pg_last_wal_replay_lsn () → pg_lsn

返回恢复期间已被重放的最后一个预写日志位置。 如果恢复仍在进行中, 它会单调增加。 如果恢复已经完成, 那么它会保持静止在恢复期间被应用的最后一条 WAL 记录的位置。 当服务器在没有恢复的情况下正常启动时, 该函数返回 NULL。

pg_last_xact_replay_timestamp () → timestamp with time zone

返回恢复期间被重放的最后一个事务的时间戳。 这是该事务的提交或中止 WAL 记录在主服务器上被生成的时间。 如果恢复期间没有重放过任何事务, 该函数返回 NULL。 否则, 如果恢复仍在进行中, 它会单调增加。 如果恢复已经完成, 那么它会保持静止在恢复期间被应用的最后一个事务的时间。 当服务器在没有恢复的情况下正常启动时, 该函数返回 NULL。

pg_get_wal_resource_managers () → setof record ( rm_id integer, rm_name text, rm_builtin boolean )

返回系统中当前已加载的 WAL 资源管理器。 rm_builtin 列指示它是一个内置的资源管理器, 还是一个由扩展加载的自定义资源管理器。


Table 9.99 中展示的函数控制恢复的进展。 这些函数只能在恢复期间执行。

Table 9.99. 恢复控制函数

函数

说明

pg_is_wal_replay_paused () → boolean

如果已请求暂停恢复, 则返回真。

pg_get_wal_replay_pause_state () → text

返回恢复的暂停状态。 如果没有请求暂停, 返回值为 not paused; 如果已请求暂停但恢复尚未被暂停, 返回值为 pause requested; 如果恢复确实被暂停了, 返回值为 paused。

pg_promote ( wait boolean DEFAULT true, wait_seconds integer DEFAULT 60 ) → boolean

把一台备用服务器提升为主服务器状态。 当 wait 被设置为 true (默认值)时, 该函数会等待提升完成, 或者等待 wait_seconds 秒过去, 然后在提升成功时返回 true, 否则返回 false。 如果 wait 被设置为 false, 那么该函数会在向 postmaster 发送一个 SIGUSR1 信号来触发提升之后立即返回 true。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_wal_replay_pause () → void

请求暂停恢复。 一个请求并不意味着恢复会立即停止。 如果你想得到恢复确实被暂停的保证, 你需要检查 pg_get_wal_replay_pause_state() 返回的恢复暂停状态。 注意, pg_is_wal_replay_paused() 返回的是是否提出了请求。 在恢复被暂停期间, 不会再应用任何进一步的数据库更改。 如果热备用处于活动状态, 那么所有新查询都会看到数据库的同一个一致快照, 并且在恢复被恢复之前不会再产生任何查询冲突。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_wal_replay_resume () → void

如果恢复之前被暂停, 则重启恢复。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。


在提升正在进行期间, 不能执行 pg_wal_replay_pause 和 pg_wal_replay_resume。 如果在恢复被暂停时触发了提升, 那么暂停状态会结束, 提升会继续。

如果流复制被禁用, 那么暂停状态可能会无限期地持续下去而没有任何问题。 如果流复制正在进行, 那么 WAL 记录会继续被接收, 这最终会填满可用的磁盘空间, 具体取决于暂停的持续时间、 WAL 生成的速率以及可用的磁盘空间。

9.28.5. 快照同步函数 #

PostgreSQL 允许数据库会话同步它们的快照。 一个 快照 决定使用它的那个事务能够看到哪些数据。 当两个或更多会话需要看到数据库中相同的内容时, 同步快照是必要的。 如果两个会话只是独立地开始它们的事务, 那么总是存在这样的可能性: 在两条 START TRANSACTION 命令的执行之间, 某个第三方事务提交了, 这样一个会话看到了那个事务的效果, 而另一个没有。

为了解决这个问题, PostgreSQL 允许一个事务 导出它正在使用的快照。 只要导出事务保持打开, 其他事务就可以 导入它的快照, 从而确保它们看到的数据库视图与第一个事务看到的完全相同。 但要注意, 这些事务中的任何一个所做的任何数据库更改, 对其他事务来说仍然不可见, 就像未提交事务所做的更改通常不可见一样。 因此, 这些事务就预先存在的数据而言是同步的, 但对它们自己所做的更改则照常行动。

快照用 Table 9.100 中展示的 pg_export_snapshot 函数导出, 并用 SET TRANSACTION 命令导入。

Table 9.100. 快照同步函数

函数

说明

pg_export_snapshot () → text

保存该事务当前的快照, 并返回一个标识该快照的 text 字符串。 这个字符串必须 (在数据库之外) 传递给想要导入该快照的客户端。 快照仅在导出它的事务结束之前可供导入。

如果需要, 一个事务可以导出多于一个的快照。 注意, 这样做只在 READ COMMITTED 事务中有用, 因为在 REPEATABLE READ 以及更高的隔离级别中, 事务在其整个生命周期内都使用同一个快照。 一旦一个事务导出了任何快照, 它就不能再用 PREPARE TRANSACTION 来准备。

pg_log_standby_snapshot () → pg_lsn

对正在运行的事务获取一个快照并把写到 WAL 中, 而不必等待 bgwriter 或 checkpointer 记录一个。 这对于备用服务器上的逻辑解码很有用, 因为逻辑槽的创建必须等到这样一条记录在备用服务器上被重放。


9.28.6. 复制管理函数 #

Table 9.101 中展示的函数用于控制复制特性以及与之交互。 有关底层特性的信息, 请参见 Section 26.2.5、 Section 26.2.6 和 Chapter 48。 用于复制起源的函数默认只允许超级用户使用, 但可以通过 GRANT 命令允许其他用户使用。 用于复制槽的函数被限制为超级用户以及拥有 REPLICATION 特权的用户。

这些函数中的许多在复制协议中都有等效的命令; 参见 Section 54.4。

Section 9.28.3、 Section 9.28.4 和 Section 9.28.5 中描述的函数同样与复制相关。

Table 9.101. 复制管理函数

函数

说明

pg_create_physical_replication_slot ( slot_name name [, immediately_reserve boolean, temporary boolean ] ) → record ( slot_name name, lsn pg_lsn )

创建一个名为 slot_name 的新的物理复制槽。 可选的第二个参数在为 true 时, 规定立即为这条复制槽保留 LSN; 否则 LSN 会在来自流复制客户端的第一次连接时保留。 从一个物理槽流式传输变更, 只有使用流复制协议才有可能 — 参见 Section 54.4。 可选的第三个参数 temporary 在被设置为真时, 规定该槽不应被永久地存储到磁盘上, 并且只预期被当前会话使用。 临时槽在任何错误发生时也会被释放。 这个函数对应于复制协议命令 CREATE_REPLICATION_SLOT ... PHYSICAL。

pg_drop_replication_slot ( slot_name name ) → void

删除名为 slot_name 的物理或逻辑复制槽。 与复制协议命令 DROP_REPLICATION_SLOT 相同。

pg_create_logical_replication_slot ( slot_name name, plugin name [, temporary boolean, twophase boolean, failover boolean ] ) → record ( slot_name name, lsn pg_lsn )

使用输出插件 plugin 创建一个名为 slot_name 的新的逻辑 (解码) 复制槽。 可选的第三个参数 temporary 在被设置为真时, 规定该槽不应被永久地存储到磁盘上, 并且只预期被当前会话使用。 临时槽在任何错误发生时也会被释放。 可选的第四个参数 twophase 在被设置为真时, 规定为这个槽启用了对已准备事务的解码。 可选的第五个参数 failover 在被设置为真时, 规定该槽被启用以便被同步到备用服务器, 这样在故障转移之后逻辑复制就可以被恢复。 对这个函数的一次调用与复制协议命令 CREATE_REPLICATION_SLOT ... LOGICAL 具有相同的效果。

pg_copy_physical_replication_slot ( src_slot_name name, dst_slot_name name [, temporary boolean ] ) → record ( slot_name name, lsn pg_lsn )

把一个名为 src_slot_name 的现有物理复制槽, 复制到一个名为 dst_slot_name 的物理复制槽。 被复制的物理槽从与源槽相同的 LSN 开始保留 WAL。 temporary 是可选的。 如果省略了 temporary, 则使用与源槽相同的值。 不允许复制一个已失效的槽。

pg_copy_logical_replication_slot ( src_slot_name name, dst_slot_name name [, temporary boolean [, plugin name ]] ) → record ( slot_name name, lsn pg_lsn )

把一个名为 src_slot_name 的现有逻辑复制槽, 复制到一个名为 dst_slot_name 的逻辑复制槽, 并可选择性地更改输出插件和持久性。 被复制的逻辑槽从与源逻辑槽相同的 LSN 开始。 temporary 和 plugin 都是可选的; 如果它们被省略, 则使用源槽的值。 源逻辑槽的 failover 选项不会被复制, 并且默认被设置为 false。 这样做是为了避免在故障转移到正在同步该槽的备用服务器之后, 无法继续逻辑复制的风险。 不允许复制一个已失效的槽。

pg_logical_slot_get_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data text )

返回槽 slot_name 中的变更, 从上次消费变更的那一点开始。 如果 upto_lsn 和 upto_nchanges 都为 NULL, 那么逻辑解码将持续到 WAL 的末尾。 如果 upto_lsn 非 NULL, 那么解码将只包括在指定的 LSN 之前提交的那些事务。 如果 upto_nchanges 非 NULL, 那么当解码产生的行数超过指定的值时, 解码会停止。 不过要注意, 实际返回的行数可能更多, 因为这个限制只在添加了解码每个新事务提交时产生的行之后才会被检查。 如果指定的槽是一个逻辑故障转移槽, 那么该函数会等到 synchronized_standby_slots 中指定的所有物理槽都确认收到了 WAL 之后再返回。

pg_logical_slot_peek_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data text )

行为与 pg_logical_slot_get_changes() 函数完全一样, 只是变更不会被消费; 也就是说, 它们会在未来的调用中再次被返回。

pg_logical_slot_get_binary_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data bytea )

行为与 pg_logical_slot_get_changes() 函数完全一样, 只是变更以 bytea 的形式返回。

pg_logical_slot_peek_binary_changes ( slot_name name, upto_lsn pg_lsn, upto_nchanges integer, VARIADIC options text[] ) → setof record ( lsn pg_lsn, xid xid, data bytea )

行为与 pg_logical_slot_peek_changes() 函数完全一样, 只是变更以 bytea 的形式返回。

pg_replication_slot_advance ( slot_name name, upto_lsn pg_lsn ) → record ( slot_name name, end_lsn pg_lsn )

推进名为 slot_name 的复制槽的当前已确认位置。 该槽不会被向后移动, 也不会被移动到超过当前的插入位置。 返回该槽的名字以及它实际被推进到的位置。 如果做了任何推进, 更新后的槽位置信息会在下一次检查点时写出。 因此在崩溃的情况下, 该槽可能退回到一个较早的位置。 如果指定的槽是一个逻辑故障转移槽, 那么该函数会等到 synchronized_standby_slots 中指定的所有物理槽都确认收到了 WAL 之后再返回。

pg_replication_origin_create ( node_name text ) → oid

用给定的外部名字创建一个复制起源, 并返回分配给它的内部 ID。 该名字的长度不得超过 512 字节。

pg_replication_origin_drop ( node_name text ) → void

删除一个先前创建的复制起源, 包括任何关联的重放进度。

pg_replication_origin_oid ( node_name text ) → oid

按名字查找一个复制起源, 并返回内部 ID。 如果没有找到这样的复制起源, 则返回 NULL。

pg_replication_origin_session_setup ( node_name text ) → void

把当前会话标记为正在从给定的起源重放, 以允许跟踪重放进度。 只有在当前没有选中任何起源时才能使用。 使用 pg_replication_origin_session_reset 来撤销。

pg_replication_origin_session_reset () → void

取消 pg_replication_origin_session_setup() 的效果。

pg_replication_origin_session_is_setup () → boolean

如果当前会话中已经选中了一个复制起源, 则返回真。

pg_replication_origin_session_progress ( flush boolean ) → pg_lsn

返回当前会话中选中的复制起源的重放位置。 参数 flush 决定相应的本地事务是否保证已被刷到磁盘。

pg_replication_origin_xact_setup ( origin_lsn pg_lsn, origin_timestamp timestamp with time zone ) → void

把当前事务标记为正在重放一个在给定的 LSN 和时间戳提交的事务。 只有当已经使用 pg_replication_origin_session_setup 选中了一个复制起源时才能调用。

pg_replication_origin_xact_reset () → void

取消 pg_replication_origin_xact_setup() 的效果。

pg_replication_origin_advance ( node_name text, lsn pg_lsn ) → void

把给定节点的复制进度设置为给定的位置。 这主要用于设置初始位置, 或者在配置更改之类的情况之后设置一个新位置。 注意, 不加考虑地使用这个函数可能导致被不一致地复制的数据。

pg_replication_origin_progress ( node_name text, flush boolean ) → pg_lsn

返回给定复制起源的重放位置。 参数 flush 决定相应的本地事务是否保证已被刷到磁盘。

pg_logical_emit_message ( transactional boolean, prefix text, content text [, flush boolean DEFAULT false] ) → pg_lsn

pg_logical_emit_message ( transactional boolean, prefix text, content bytea [, flush boolean DEFAULT false] ) → pg_lsn

发出一条逻辑解码消息。 这可以用于通过 WAL 向逻辑解码插件传递通用消息。 transactional 参数规定该消息应当是当前事务的一部分, 还是应当立即写出并在逻辑解码器读取该记录时尽快被解码。 prefix 参数是一个文本前缀, 逻辑解码插件可以用它方便地识别对它们有趣的消息。 content 参数是消息的内容, 以文本或二进制形式给出。 flush 参数 (默认被设置为 false) 控制该消息是立即被刷到 WAL 还是不刷。 flush 对 transactional 没有效果, 因为该消息的 WAL 记录会与它的事务一起被刷出。

pg_sync_replication_slots () → void

把逻辑故障转移复制槽从主服务器同步到备用服务器。 这个函数只能在备用服务器上执行。 临时同步槽 (如果有的话) 不能用于逻辑解码, 并且必须在提升之后被删除。 细节请参见 Section 47.2.3。 注意, 这个函数主要用于测试和调试目的, 应当谨慎使用。 此外, 如果 sync_replication_slots 被启用, 并且 slotsync 工作进程已经在运行以执行槽的同步, 那么这个函数就不能被执行。

Caution

如果在执行该函数之后, 备用服务器上的 hot_standby_feedback 被禁用, 或者 primary_slot_name 中配置的物理槽被移除, 那么同步槽所必需的行可能会被主服务器上的 VACUUM 进程移除, 从而导致同步槽被置为失效。


9.28.7. 数据库对象管理函数 #

Table 9.102 中展示的函数计算数据库对象的磁盘空间使用量, 或者协助呈现或理解使用结果。 bigint 结果以字节计量。 如果传给这些函数之一的 OID 并不表示一个现有的对象, 则返回 NULL。

Table 9.102. 数据库对象尺寸函数

函数

说明

pg_column_size ( "any" ) → integer

显示用于存储任意单个数据值的字节数。 如果直接应用到一个表列值上, 这会反映已执行的任何压缩。

pg_column_compression ( "any" ) → text

显示被用来压缩一个单独变长值的压缩算法。 如果该值没有被压缩, 则返回 NULL。

pg_column_toast_chunk_id ( "any" ) → oid

显示一个磁盘上的 TOASTed 值的 chunk_id。 如果该值没有被 TOASTed 或者不在磁盘上, 则返回 NULL。 有关 TOAST 的更多信息, 请参见 Section 66.2。

pg_database_size ( name ) → bigint

pg_database_size ( oid ) → bigint

计算具有指定名字或 OID 的数据库所使用的总磁盘空间。 要使用这个函数, 你必须在指定的数据库上拥有 CONNECT 特权 (它默认被授予), 或者拥有 pg_read_all_stats 角色的特权。

pg_indexes_size ( regclass ) → bigint

计算附加到指定表的索引所使用的总磁盘空间。

pg_relation_size ( relation regclass [, fork text ] ) → bigint

计算指定关系的一个 “分支”所使用的磁盘空间。 (注意, 对于大多数用途, 使用更高层的函数 pg_total_relation_size 或 pg_table_size 更方便, 它们会对所有分支的尺寸求和。) 带一个参数时, 它返回该关系的主数据分支的尺寸。 可以提供第二个参数来指定要检查哪个分支:

  • main 返回该关系的主数据分支的尺寸。

  • fsm 返回与该关系关联的空闲空间映射的尺寸 (参见 Section 66.3)。

  • vm 返回与该关系关联的可见性映射的尺寸 (参见 Section 66.4)。

  • init 返回与该关系关联的初始化分支的尺寸 (如果有)。

pg_size_bytes ( text ) → bigint

把以人类可读格式 (由 pg_size_pretty 返回) 表示的尺寸转换为字节。 有效的单位是 bytes、 B、 kB、 MB、 GB、 TB 和 PB。

pg_size_pretty ( bigint ) → text

pg_size_pretty ( numeric ) → text

把以字节计的尺寸转换为更容易为人类阅读的、 带尺寸单位的格式 (视情况为 bytes、kB、 MB、GB、TB 或 PB)。 注意, 这些单位是 2 的幂而非 10 的幂, 因此 1kB 是 1024 字节, 1MB 是 10242 = 1048576 字节, 依此类推。

pg_table_size ( regclass ) → bigint

计算指定的表所使用的磁盘空间, 不包括索引 (但包括它的 TOAST 表(如果有)、 空闲空间映射和可见性映射)。

pg_tablespace_size ( name ) → bigint

pg_tablespace_size ( oid ) → bigint

计算具有指定名字或 OID 的表空间中所使用的总磁盘空间。 要使用这个函数, 你必须在指定的表空间上拥有 CREATE 特权, 或者拥有 pg_read_all_stats 角色的特权, 除非它是当前数据库的默认表空间。

pg_total_relation_size ( regclass ) → bigint

计算指定的表所使用的总磁盘空间, 包括全部索引和 TOAST 数据。 结果等同于 pg_table_size + pg_indexes_size。


上面对表或索引进行操作的函数接受一个 regclass 参数, 它就是 pg_class 系统目录中该表或索引的 OID。 不过你不必手工查找这个 OID, 因为 regclass 数据类型的输入转换器会替你完成这项工作。 细节请参见 Section 8.19。

Table 9.103 中展示的函数协助识别与数据库对象相关联的具体磁盘文件。

Table 9.103. 数据库对象定位函数

函数

说明

pg_relation_filenode ( relation regclass ) → oid

返回当前被分配给指定关系的 “文件节点”编号。 文件节点是用于该关系的文件名的基组件 (更多信息请参见 Section 66.1)。 对大多数关系而言, 结果与 pg_class.relfilenode 相同, 但对于某些系统目录, relfilenode 为零, 此时必须使用这个函数来获得正确的值。 如果传入一个没有存储的关系 (例如一个视图), 该函数返回 NULL。

pg_relation_filepath ( relation regclass ) → text

返回该关系的完整文件路径名 (相对于数据库集群的数据目录 PGDATA)。

pg_filenode_relation ( tablespace oid, filenode oid ) → regclass

在给定表空间 OID 和存储它所用的文件节点的情况下, 返回一个关系的 OID。 这本质上就是 pg_relation_filepath 的逆映射。 对于数据库默认表空间中的关系, 表空间可以被指定为零。 如果当前数据库中没有关系与给定的值相关联, 或者处理的是一个临时关系, 则返回 NULL。


Table 9.104 列出用于管理排序规则的函数。

Table 9.104. 排序规则管理函数

函数

说明

pg_collation_actual_version ( oid ) → text

返回排序规则对象当前安装在操作系统中的实际版本。 如果它与 pg_collation.collversion 中的值不同, 那么依赖于该排序规则的对象可能需要被重建。 另请参见 ALTER COLLATION。

pg_database_collation_actual_version ( oid ) → text

返回数据库的排序规则当前安装在操作系统中的实际版本。 如果它与 pg_database.datcollversion 中的值不同, 那么依赖于该排序规则的对象可能需要被重建。 另请参见 ALTER DATABASE。

pg_import_system_collations ( schema regnamespace ) → integer

根据它在操作系统中找到的所有区域设置, 向系统目录 pg_collation 中添加排序规则。 这就是 initdb 所使用的; 更多细节请参见 Section 23.2.2。 如果后来向操作系统中安装了额外的区域设置, 可以再次运行这个函数, 来为新区域设置添加排序规则。 与 pg_collation 中现有条目相匹配的区域设置会被跳过。 (但基于操作系统中已不存在的区域设置的排序规则对象, 不会被这个函数移除。) schema 参数通常是 pg_catalog, 但这不是一项要求; 排序规则也可以被安装到某个其他模式中。 该函数返回它创建的新排序规则对象的数量。 这个函数的使用被限制为超级用户。


Table 9.105 列出用于操纵统计信息的函数。 这些函数不能在恢复期间执行。

Warning

这些统计信息操纵函数所做的更改, 很可能被 autovacuum (或手动的 VACUUM 或 ANALYZE) 覆盖, 因此应当被视为临时性的。

Table 9.105. 数据库对象统计信息操纵函数

函数

说明

pg_restore_relation_stats ( VARIADIC kwargs "any" ) → boolean

更新表级统计信息。 通常, 这些统计信息会被自动收集, 或作为 VACUUM 或 ANALYZE 的一部分被更新, 因此没有必要调用这个函数。 然而, 在一次恢复之后、 如果 ANALYZE 还没有运行, 为了让优化器能够选择更好的计划, 这个函数会很有用。

被跟踪的统计信息可能因版本而异, 因此参数以 argname 和 argvalue 对的形式传递, 格式如下:

SELECT pg_restore_relation_stats(
    'arg1name', 'arg1value'::arg1type,
    'arg2name', 'arg2value'::arg2type,
    'arg3name', 'arg3value'::arg3type);

例如, 要为表 mytable 设置 relpages 和 reltuples 的值:

SELECT pg_restore_relation_stats(
    'schemaname', 'myschema',
    'relname',    'mytable',
    'relpages',   173::integer,
    'reltuples',  10000::real);

参数 schemaname 和 relname 是必需的, 它们指定该表。 其他参数是与 pg_class 中的某些列相对应的统计信息的名字和值。 当前受支持的关系统计信息有: 值类型为 integer 的 relpages、 值类型为 real 的 reltuples、 值类型为 integer 的 relallvisible, 以及值类型为 integer 的 relallfrozen。

此外, 这个函数还接受类型为 integer 的参数名 version, 它规定统计信息源自的服务器版本。 这预期有助于从 PostgreSQL 的较旧版本移植统计信息。

次要错误会被报告为 WARNING 并被忽略, 其余的统计信息仍然会被恢复。 如果所有指定的统计信息都被成功恢复, 则返回 true, 否则返回 false。

调用者必须拥有该表上的 MAINTAIN 特权, 或者是该数据库的属主。

pg_clear_relation_stats ( schemaname text, relname text ) → void

为给定的关系清除表级统计信息, 就像该表是刚创建的一样。

调用者必须拥有该表上的 MAINTAIN 特权, 或者是该数据库的属主。

pg_restore_attribute_stats ( VARIADIC kwargs "any" ) → boolean

创建或更新列级统计信息。 通常, 这些统计信息会被自动收集, 或作为 VACUUM 或 ANALYZE 的一部分被更新, 因此没有必要调用这个函数。 然而, 在一次恢复之后、 如果 ANALYZE 还没有运行, 为了让优化器能够选择更好的计划, 这个函数会很有用。

被跟踪的统计信息可能因版本而异, 因此参数以 argname 和 argvalue 对的形式传递, 格式如下:

SELECT pg_restore_attribute_stats(
    'arg1name', 'arg1value'::arg1type,
    'arg2name', 'arg2value'::arg2type,
    'arg3name', 'arg3value'::arg3type);

例如, 要为表 mytable 的属性 col1 设置 avg_width 和 null_frac 的值:

SELECT pg_restore_attribute_stats(
    'schemaname', 'myschema',
    'relname',    'mytable',
    'attname',    'col1',
    'inherited',  false,
    'avg_width',  125::integer,
    'null_frac',  0.5::real);

必需的参数是 schemaname 和 relname (值为 text 类型), 它们指定该表; attname (值为 text 类型) 或 attnum (值为 smallint 类型) 二者之一, 它们指定该列; 以及 inherited, 它规定统计信息是否包括来自子表的值。 其他参数是与 pg_stats 中的列相对应的统计信息的名字和值。

此外, 这个函数还接受类型为 integer 的参数名 version, 它规定统计信息源自的服务器版本。 这预期有助于从 PostgreSQL 的较旧版本移植统计信息。

次要错误会被报告为 WARNING 并被忽略, 其余的统计信息仍然会被恢复。 如果所有指定的统计信息都被成功恢复, 则返回 true, 否则返回 false。

调用者必须拥有该表上的 MAINTAIN 特权, 或者是该数据库的属主。

pg_clear_attribute_stats ( schemaname text, relname text, attname text, inherited boolean ) → void

为给定的关系和属性清除列级统计信息, 就像该表是刚创建的一样。

调用者必须拥有该表上的 MAINTAIN 特权, 或者是该数据库的属主。


Table 9.106 列出提供关于分区表结构信息的函数。

Table 9.106. 分区信息函数

函数

说明

pg_partition_tree ( regclass ) → setof record ( relid regclass, parentrelid regclass, isleaf boolean, level integer )

列出给定的分区表或分区索引的分区树中的表或索引, 每个分区一行。 提供的信息包括该分区的 OID、 它的直接父级的 OID、 一个指示该分区是否为叶子节点的布尔值, 以及一个指示它在层级结构中的层级的整数。 输入表或索引的层级值为 0, 它的直接子分区为 1, 它们的分区为 2,依此类推。 如果该关系不存在, 或者不是一个分区或分区表, 则不返回任何行。

pg_partition_ancestors ( regclass ) → setof regclass

列出给定分区的祖先关系, 包括该关系自身。 如果该关系不存在, 或者不是一个分区或分区表, 则不返回任何行。

pg_partition_root ( regclass ) → regclass

返回给定关系所属的分区树的最顶层父级。 如果该关系不存在, 或者不是一个分区或分区表, 则返回 NULL。


例如, 要检查分区表 measurement 中所含数据的总尺寸, 可以使用下面的查询:

SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
  FROM pg_partition_tree('measurement');

9.28.8. 索引维护函数 #

Table 9.107 展示了可用于索引维护任务的函数。 (注意, 这些维护任务通常由自动清理自动完成; 只有在特殊情况下才需要使用这些函数。) 这些函数不能在恢复期间执行。 这些函数的使用被限制为超级用户和给定索引的属主。

Table 9.107. 索引维护函数

函数

说明

brin_summarize_new_values ( index regclass ) → integer

扫描指定的 BRIN 索引, 找出基础表中当前未被该索引汇总的页面范围; 对于任何这样的范围, 它会通过扫描那些表页面来创建一个新的汇总索引元组。 返回被插入该索引的新页面范围汇总的数量。

brin_summarize_range ( index regclass, blockNumber bigint ) → integer

汇总覆盖给定块的页面范围 (如果尚未汇总的话)。 这类似于 brin_summarize_new_values, 区别在于它只处理覆盖给定表块编号的页面范围。

brin_desummarize_range ( index regclass, blockNumber bigint ) → void

移除汇总覆盖给定表块的页面范围的 BRIN 索引元组 (如果存在的话)。

gin_clean_pending_list ( index regclass ) → bigint

通过把指定 GIN 索引的 “待处理”列表中的条目批量移入主 GIN 数据结构来清理它。 返回从待处理列表中移除的页面数量。 如果参数是一个在构建时禁用了 fastupdate 选项的 GIN 索引, 则不会发生清理, 并且结果为零, 因为该索引没有待处理列表。 关于待处理列表和 fastupdate 选项的细节, 请参见 Section 65.4.4.1 和 Section 65.4.5。


9.28.9. 通用文件访问函数 #

Table 9.108 中展示的函数提供对承载服务器的机器上的文件的原生访问。 只有数据库集群目录和 log_directory 之内的文件可以被访问, 除非用户是超级用户, 或者被授予了 pg_read_server_files 角色。 对集群目录中的文件使用相对路径, 对日志文件使用与 log_directory 配置设置相匹配的路径。

注意, 向用户授予 pg_read_file() 或相关函数的 EXECUTE 特权, 就赋予了他们读取数据库服务器进程能够读取的服务器上任何文件的能力; 这些函数绕过所有数据库内的特权检查。 这意味着, 例如, 一个拥有这类访问权的用户能够读取存储身份验证信息的 pg_authid 表的内容, 以及读取数据库中的任何表数据。 因此, 对这些函数授予访问权应当被仔细考虑。

在这些函数上授予特权时, 请注意, 展示可选参数的表条目大多被实现为具有不同参数列表的若干物理函数。 如果要使用其中某个函数, 必须分别对每个这样的函数授予特权。 psql 的 \df 命令可以用于检查实际的函数签名是什么。

这些函数中有一些接受一个可选的 missing_ok 参数, 它规定文件或目录不存在时的行为。 如果为 true, 该函数会酌情返回 NULL 或一个空结果集。 如果为 false, 则会抛出一个错误。 (除 “文件未找到”之外的失败条件在任何情况下都会被报告为错误。) 默认值为 false。

Table 9.108. 通用文件访问函数

函数

说明

pg_ls_dir ( dirname text [, missing_ok boolean, include_dot_dirs boolean ] ) → setof text

返回指定目录中所有文件 (以及目录和其他特殊文件) 的名字。 include_dot_dirs 参数指示是否要把 “.” 和 “..” 包括在结果集中; 默认是排除它们。 当 missing_ok 为 true 时, 把它们包括进来可能有用, 以区分一个空目录与一个不存在的目录。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_ls_logdir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器日志目录中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_waldir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器的预写日志 (WAL) 目录中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_logicalmapdir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器的 pg_logical/mappings 目录中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_logicalsnapdir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器的 pg_logical/snapshots 目录中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_replslotdir ( slot_name text ) → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器的 pg_replslot/slot_name 目录中每个普通文件的名字、 尺寸和最后修改时间 (mtime), 其中 slot_name 是作为函数输入提供的复制槽的名字。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_summariesdir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器的 WAL 汇总目录 (pg_wal/summaries) 中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_archive_statusdir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回服务器的 WAL 归档状态目录 (pg_wal/archive_status) 中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_ls_tmpdir ( [ tablespace oid ] ) → setof record ( name text, size bigint, modification timestamp with time zone )

返回指定的 tablespace 的临时文件目录中每个普通文件的名字、 尺寸和最后修改时间 (mtime)。 如果未提供 tablespace, 则检查 pg_default 表空间。 以点开头的文件名、 目录和其他特殊文件会被排除。

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

pg_read_file ( filename text [, offset bigint, length bigint ] [, missing_ok boolean ] ) → text

返回一个文本文件的全部或部分内容, 从给定的字节 offset 开始, 至多返回 length 字节 (如果先到达文件末尾则更少)。 如果 offset 为负, 它相对于文件的末尾。 如果省略了 offset 和 length, 则返回整个文件。 从文件中读出的字节会被解释为数据库编码中的一个字符串; 如果它们在该编码中无效, 则会抛出一个错误。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

pg_read_binary_file ( filename text [, offset bigint, length bigint ] [, missing_ok boolean ] ) → bytea

返回一个文件的全部或部分内容。 这个函数与 pg_read_file 相同, 只是它可以读取任意二进制数据, 并以 bytea 而非 text 返回结果; 因此不执行任何编码检查。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。

与 convert_from 函数相结合, 这个函数可以用于读取一个以指定编码编码的文本文件, 并把它转换为数据库的编码:

SELECT convert_from(pg_read_binary_file('file_in_utf8.txt'), 'UTF8');

pg_stat_file ( filename text [, missing_ok boolean ] ) → record ( size bigint, access timestamp with time zone, modification timestamp with time zone, change timestamp with time zone, creation timestamp with time zone, isdir boolean )

返回一条记录, 其中包含该文件的尺寸、 最后访问时间戳、 最后修改时间戳、 最后文件状态变化时间戳 (仅限 Unix 平台)、 文件创建时间戳 (仅限 Windows), 以及一个指示它是否为目录的标志。

默认情况下, 这个函数被限制为超级用户, 但可以把 EXECUTE 授予其他用户来运行该函数。


9.28.10. 咨询锁函数 #

Table 9.109 中展示的函数管理咨询锁。 关于这些函数的正确使用的细节, 请参见 Section 13.3.5。

所有这些函数都预期被用来锁定由应用定义的资源, 资源既可以用一个单一的 64 位键值标识, 也可以用两个 32 位键值标识 (注意这两个键空间并不重叠)。 如果另一个会话已经在同一个资源标识符上持有一个冲突的锁, 那么这些函数要么等到该资源变为可用, 要么返回一个 false 结果, 具体取决于函数。 锁可以是共享的或独占的: 共享锁不与同一资源上的其他共享锁冲突, 只与独占锁冲突。 锁可以在会话层级上获取 (这样它们会一直保持到被释放或会话结束), 或者在事务层级上获取 (这样它们会保持到当前事务结束; 没有提供手动释放)。 多个会话级锁请求会堆叠, 因此如果同一个资源标识符被锁了三次, 那么就必须有三次解锁请求, 才能在会话结束之前提前释放该资源。

Table 9.109. 咨询锁函数

函数

说明

pg_advisory_lock ( key bigint ) → void

pg_advisory_lock ( key1 integer, key2 integer ) → void

获取一个独占的会话级咨询锁, 必要时等待。

pg_advisory_lock_shared ( key bigint ) → void

pg_advisory_lock_shared ( key1 integer, key2 integer ) → void

获取一个共享的会话级咨询锁, 必要时等待。

pg_advisory_unlock ( key bigint ) → boolean

pg_advisory_unlock ( key1 integer, key2 integer ) → boolean

释放一个先前获取的独占的会话级咨询锁。 如果锁被成功释放, 返回 true。 如果没有持有该锁, 则返回 false, 此外服务器还会报告一个 SQL 警告。

pg_advisory_unlock_all () → void

释放当前会话持有的所有会话级咨询锁。 (即使客户端非正常断开连接, 这个函数也会在会话结束时被隐式调用。)

pg_advisory_unlock_shared ( key bigint ) → boolean

pg_advisory_unlock_shared ( key1 integer, key2 integer ) → boolean

释放一个先前获取的共享的会话级咨询锁。 如果锁被成功释放, 返回 true。 如果没有持有该锁, 则返回 false, 此外服务器还会报告一个 SQL 警告。

pg_advisory_xact_lock ( key bigint ) → void

pg_advisory_xact_lock ( key1 integer, key2 integer ) → void

获取一个独占的事务级咨询锁, 必要时等待。

pg_advisory_xact_lock_shared ( key bigint ) → void

pg_advisory_xact_lock_shared ( key1 integer, key2 integer ) → void

获取一个共享的事务级咨询锁, 必要时等待。

pg_try_advisory_lock ( key bigint ) → boolean

pg_try_advisory_lock ( key1 integer, key2 integer ) → boolean

如果可用, 获取一个独占的会话级咨询锁。 这要么会立即获得该锁并返回 true, 要么在无法立即获得该锁时不等待地返回 false。

pg_try_advisory_lock_shared ( key bigint ) → boolean

pg_try_advisory_lock_shared ( key1 integer, key2 integer ) → boolean

如果可用, 获取一个共享的会话级咨询锁。 这要么会立即获得该锁并返回 true, 要么在无法立即获得该锁时不等待地返回 false。

pg_try_advisory_xact_lock ( key bigint ) → boolean

pg_try_advisory_xact_lock ( key1 integer, key2 integer ) → boolean

如果可用, 获取一个独占的事务级咨询锁。 这要么会立即获得该锁并返回 true, 要么在无法立即获得该锁时不等待地返回 false。

pg_try_advisory_xact_lock_shared ( key bigint ) → boolean

pg_try_advisory_xact_lock_shared ( key1 integer, key2 integer ) → boolean

如果可用, 获取一个共享的事务级咨询锁。 这要么会立即获得该锁并返回 true, 要么在无法立即获得该锁时不等待地返回 false。