支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

9.28. 系统管理函数 #

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

9.28.1. 配置设置函数 #

表 9.93 显示了可用于查询和更改运行时配置参数的函数。

表 9.93. 配置设置函数

函数

描述

示例

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

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

current_setting('datestyle')ISO, MDY

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

将参数 setting_name 设置为 new_value,并返回该值。如果 is_localtrue,则新值仅在当前事务期间适用。如果您希望新值在当前会话的其余部分适用,请使用 false 代替。此函数对应于 SQL 命令 SET

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


9.28.2. 服务器信号函数 #

表 9.94 中显示的函数向其他服务器进程发送控制信号。默认情况下,只有超级用户才能使用这些函数,但可以使用 GRANT 将访问权限授予其他人,但有明确的例外。

如果信号发送成功,则每个函数都返回 true,如果发送信号失败,则返回 false

表 9.94. 服务器信号函数

函数

描述

pg_cancel_backend ( pid integer ) → boolean

取消后端进程具有指定进程 ID 的会话的当前查询。如果调用角色是被取消后台的角色成员,或者调用角色具有 pg_signal_backend 的权限,则也允许此操作,但是只有超级用户才能取消超级用户后台。

pg_log_backend_memory_contexts ( pid integer ) → boolean

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

pg_reload_conf () → boolean

导致 PostgreSQL 服务器的所有进程重新加载其配置文件。(这是通过向 postmaster 进程发送 SIGHUP 信号启动的,postmaster 进程又向其每个子进程发送 SIGHUP。)您可以使用 pg_file_settingspg_hba_file_rulespg_ident_file_mappings 视图来检查配置文件是否存在错误,然后再重新加载。

pg_rotate_logfile () → boolean

通知日志文件管理器立即切换到新的输出文件。只有在内置日志收集器运行时此功能才有效,因为否则就没有日志文件管理器子进程。

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

终止后端进程具有指定进程 ID 的会话。如果调用角色是被终止后台的角色成员,或者调用角色具有 pg_signal_backend 的权限,则也允许此操作,但是只有超级用户才能终止超级用户后台。

如果未指定 timeout 或为零,则此函数返回 true,表示仅成功发送信号,而不管进程是否实际终止。如果指定了 timeout(以毫秒为单位)且大于零,则该函数会等待直到进程实际终止或直到经过给定时间。如果进程终止,则该函数返回 true。超时时,会发出警告并返回 false


pg_cancel_backendpg_terminate_backend 向由进程 ID 标识的后端进程发送信号(分别为 SIGINTSIGTERM)。活动后端的进程 ID 可以从 pg_stat_activity 视图的 pid 列中找到,或者通过列出服务器上的 postgres 进程(在 Unix 上使用 ps 或在 Windows 上使用 任务管理器)来找到。活动后端的角色可以从 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: 0; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used
LOG:  level: 1; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used
LOG:  level: 1; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used
LOG:  level: 1; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used
LOG:  level: 1; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used
LOG:  level: 1; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used
LOG:  level: 1; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used
LOG:  level: 1; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used
...
LOG:  level: 1; 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. 备份控制函数 #

表 9.95 中所示的函数有助于进行在线备份。这些函数在恢复期间不能执行(pg_backup_startpg_backup_stoppg_wal_lsn_diff 除外)。

有关这些函数的正确使用方法的详细信息,请参阅第 25.3 节

表 9.95. 备份控制函数

函数

描述

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 的可选参数。如果为 false,则该函数将在备份完成后立即返回,而无需等待 WAL 归档。此行为仅在使用独立监视 WAL 归档的备份软件时才有用。否则,可能缺少使备份保持一致所需的 WAL,从而使备份无用。默认情况下或当此参数为 true 时,如果启用了归档,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表 9.95 中所示的某些函数一起使用,以获取复制滞后。


pg_current_wal_lsn 以与上述函数相同的格式显示当前的预写式日志写入位置。类似地,pg_current_wal_insert_lsn 显示当前的预写式日志插入位置,而 pg_current_wal_flush_lsn 显示当前的预写式日志刷新位置。插入位置是任何时刻预写式日志的 逻辑 结尾,而写入位置是从服务器的内部缓冲区实际写出的内容的结尾,刷新位置是已知写入持久存储的最后一个位置。写入位置是可以从服务器外部检查的内容的结尾,如果您有兴趣归档部分完成的预写式日志文件,则通常是您想要的。插入和刷新位置主要用于服务器调试目的。这些都是只读操作,不需要超级用户权限。

您可以使用 pg_walfile_name_offsetpg_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 对于计算LSN从文件偏移量和 WAL 文件名中,例如:

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. 恢复控制函数 #

表 9.96 中所示的函数提供有关备用服务器当前状态的信息。这些函数可以在恢复期间和正常运行中执行。

表 9.96. 恢复信息函数

函数

描述

pg_is_in_recovery () → boolean

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

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 指示它是内置资源管理器还是扩展加载的自定义资源管理器。


表 9.97 中所示的函数控制恢复的进度。这些函数只能在恢复期间执行。

表 9.97. 恢复控制函数

函数

描述

pg_is_wal_replay_paused () → boolean

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

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_pausepg_wal_replay_resume。如果在恢复暂停时触发升级,则暂停状态将结束并且升级将继续。

如果禁用流复制,则暂停状态可能会无限期地持续下去,而不会出现问题。如果流复制正在进行中,则将继续接收 WAL 记录,这将最终填满可用的磁盘空间,具体取决于暂停的持续时间、WAL 生成速率和可用的磁盘空间。

9.28.5. 快照同步函数 #

PostgreSQL 允许数据库会话同步其快照。快照 确定使用该快照的事务可以看到哪些数据。当两个或多个会话需要查看数据库中的相同内容时,需要同步快照。如果两个会话只是独立启动其事务,则总是有可能在两个 START TRANSACTION 命令的执行之间提交某些第三个事务,因此一个会话看到该事务的效果,而另一个会话看不到。

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

快照使用 表 9.98 中显示的 pg_export_snapshot 函数导出,并使用 SET TRANSACTION 命令导入。

表 9.98. 快照同步函数

函数

描述

pg_export_snapshot () → text

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

如果需要,一个事务可以导出多个快照。请注意,这样做仅在 READ COMMITTED 事务中才有用,因为在 REPEATABLE READ 和更高的隔离级别中,事务在其整个生命周期中都使用相同的快照。一旦事务导出了任何快照,就无法使用 PREPARE TRANSACTION 进行准备。

pg_log_standby_snapshot () → pg_lsn

获取正在运行的事务的快照并将其写入 WAL,而无需等待后台写入程序或检查点程序记录。这对于备用服务器上的逻辑解码非常有用,因为逻辑槽的创建必须等到在备用服务器上重放该记录后才能进行。


9.28.6. 复制管理函数 #

表 9.99 中所示的函数用于控制复制功能并与之交互。有关底层功能的信息,请参阅 第 26.2.5 节第 26.2.6 节第 48 章。默认情况下,仅超级用户允许使用复制源的函数,但可以通过使用 GRANT 命令允许其他用户使用。复制槽的函数的使用仅限于超级用户和具有 REPLICATION 特权的用户。

这些函数中的许多函数在复制协议中具有等效的命令;请参阅 第 53.4 节

第 9.28.3 节第 9.28.4 节第 9.28.5 节中描述的函数也与复制相关。

表 9.99. 复制管理函数

函数

描述

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立即保留;否则,将在来自流复制客户端的第一次连接时保留该
。只有使用流复制协议才能从物理槽流式传输更改 - 请参阅 第 53.4 节。可选的第三个参数 temporary(设置为 true 时)指定该槽不应永久存储到磁盘,而仅供当前会话使用。临时槽也会在发生任何错误时释放。此函数对应于复制协议命令 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,当设置为 true 时,指定该槽不应永久存储到磁盘,仅供当前会话使用。临时槽在发生任何错误时也会被释放。可选的第四个参数 twophase,当设置为 true 时,指定为此槽启用预备事务的解码。可选的第五个参数 failover,当设置为 true 时,指定此槽已启用同步到备用服务器,以便在故障转移后可以恢复逻辑复制。调用此函数的效果与复制协议命令 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位置开始。 temporaryplugin 都是可选的;如果省略,则使用源槽的值。

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_lsnupto_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。

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

如果当前会话中已选择复制源,则返回 true。

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

将主服务器的逻辑故障转移复制槽同步到备用服务器。 此函数只能在备用服务器上执行。 临时的同步槽(如果有)不能用于逻辑解码,并且必须在升级后删除。 有关详细信息,请参阅 第 47.2.3 节。 请注意,如果启用了 sync_replication_slots 并且 slotsync 工作进程已经在运行以执行槽的同步,则无法执行此函数。

警告

如果在执行该函数后,备用服务器上禁用了 hot_standby_feedback,或者删除了在 primary_slot_name 中配置的物理槽,则主服务器上的 VACUUM 进程可能会删除同步槽的必要行,导致同步槽失效。


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

表 9.100 中显示的函数计算数据库对象的磁盘空间使用情况,或协助显示或理解使用结果。 bigint 结果以字节为单位进行度量。 如果将不代表现有对象的 OID 传递给其中一个函数,则返回 NULL

表 9.100. 数据库对象大小函数

函数

描述

pg_column_size ( "any" ) → integer

显示用于存储任何单个数据值的字节数。 如果直接应用于表列值,则反映已完成的任何压缩。

pg_column_compression ( "any" ) → text

显示用于压缩单个可变长度值的压缩算法。 如果值未压缩,则返回 NULL

pg_column_toast_chunk_id ( "any" ) → oid

显示磁盘上的 chunk_idTOASTed 值。 如果该值未TOASTed 或不在磁盘上,则返回 NULL。有关更多信息,请参阅 第 65.2 节TOAST.

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_sizepg_table_size 更方便,它们会汇总所有分支的大小。)使用一个参数,它返回关系的主数据分支的大小。可以提供第二个参数来指定要检查的分支

  • main 返回关系的主数据分支的大小。

  • fsm 返回与该关系关联的空闲空间映射的大小(请参阅第 65.3 节)。

  • vm 返回与该关系关联的可见性映射的大小(请参阅第 65.4 节)。

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

pg_size_bytes ( text ) → bigint

将人类可读格式的大小(由 pg_size_pretty 返回)转换为字节。 有效单位为 bytesBkBMBGBTBPB

pg_size_pretty ( bigint ) → text

pg_size_pretty ( numeric ) → text

将以字节为单位的大小转换为更易于人类阅读的格式,并带有大小单位(字节、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 数据类型的输入转换器会为您完成此工作。 有关详细信息,请参阅 第 8.19 节

表 9.101 中显示的函数有助于识别与数据库对象关联的特定磁盘文件。

表 9.101. 数据库对象位置函数

函数

描述

pg_relation_filenode ( relation regclass ) → oid

返回当前分配给指定关系的filenode编号。 filenode 是用于关系的 文件名的基本组件(有关更多信息,请参阅第 65.1 节)。 对于大多数关系,结果与 pg_class.relfilenode 相同,但对于某些系统目录,relfilenode 为零,必须使用此函数来获取正确的值。 如果传递一个没有存储的关系(例如视图),则该函数返回 NULL。

pg_relation_filepath ( relation regclass ) → text

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

pg_filenode_relation ( tablespace oid, filenode oid ) → regclass

返回在表空间 OID 和 filenode 下存储的关系的 OID。 这基本上是 pg_relation_filepath 的反向映射。 对于数据库默认表空间中的关系,表空间可以指定为零。 如果当前数据库中没有与给定值关联的关系,则返回 NULL


表 9.102 列出了用于管理排序规则的函数。

表 9.102. 排序规则管理函数

函数

描述

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 使用的;有关更多详细信息,请参见 第 23.2.2 节。如果在稍后将其他区域设置安装到操作系统中,则可以再次运行此函数以添加新区域设置的排序规则。将跳过与 pg_collation 中现有条目匹配的区域设置。(但是,此函数不会删除基于操作系统中不再存在的区域设置的排序规则对象。)schema 参数通常是 pg_catalog,但这不是必需的;排序规则也可以安装到其他模式中。该函数返回它创建的新排序规则对象的数量。此函数的使用仅限于超级用户。


表 9.103 列出了提供有关分区表结构的函数。

表 9.103. 分区信息函数

函数

描述

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. 索引维护函数 #

表 9.104 显示了可用于索引维护任务的函数。(请注意,这些维护任务通常由自动清理功能自动完成;仅在特殊情况下才需要使用这些函数。)这些函数不能在恢复期间执行。这些函数的使用仅限于超级用户和给定索引的所有者。

表 9.104. 索引维护函数

函数

描述

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 选项的详细信息,请参见 第 64.4.4.1 节第 64.4.5 节


9.28.9. 通用文件访问函数 #

表 9.105 中显示的函数提供了对托管服务器的计算机上的文件的本机访问权限。只能访问数据库群集目录和 log_directory 中的文件,除非用户是超级用户或被授予 pg_read_server_files 角色。对于群集目录中的文件,请使用相对路径;对于日志文件,请使用与 log_directory 配置设置匹配的路径。

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

在授予这些函数的权限时,请注意,显示可选参数的表条目大多以具有不同参数列表的多个物理函数的形式实现。如果要使用,则必须单独授予每个此类函数的权限。psql\df 命令可用于检查实际的函数签名是什么。

其中一些函数采用可选的 missing_ok 参数,该参数指定当文件或目录不存在时的行为。如果为 true,则该函数将返回 NULL 或适当的空结果集。如果为 false,则会引发错误。(除了 找不到文件 之外的失败情况在任何情况下都会报告为错误。)默认值为 false

表 9.105. 通用文件访问函数

函数

描述

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

返回指定目录中所有文件(以及目录和其他特殊文件)的名称。include_dot_dirs 参数指示是否将 ... 包含在结果集中;默认值是排除它们。当 missing_oktrue 时,包含它们可能很有用,以区分空目录和不存在的目录。

默认情况下,此函数仅限于超级用户使用,但可以授予其他用户 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_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 为负数,则它相对于文件末尾。如果省略 offsetlength,则返回整个文件。从文件中读取的字节被解释为数据库编码中的字符串;如果它们在该编码中无效,则会抛出错误。

默认情况下,此函数仅限于超级用户使用,但可以授予其他用户 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. 咨询锁函数 #

表 9.106 中显示的函数用于管理咨询锁。有关正确使用这些函数的详细信息,请参见第 13.3.5 节

所有这些函数都旨在用于锁定应用程序定义的资源,这些资源可以通过单个 64 位键值或两个 32 位键值来标识(请注意,这两个键空间不重叠)。如果另一个会话已在同一资源标识符上持有冲突的锁,则这些函数将等待直到资源可用,或者根据函数返回 false 结果。锁可以是共享锁或排它锁:共享锁不会与同一资源上的其他共享锁冲突,仅与排它锁冲突。锁可以在会话级别获取(因此它们会一直持有直到释放或会话结束),也可以在事务级别获取(因此它们会一直持有到当前事务结束;没有手动释放的规定)。多个会话级锁请求会堆叠,因此如果同一个资源标识符被锁定三次,则在会话结束之前必须有三个解锁请求来释放该资源。

表 9.106. 咨询锁函数

函数

描述

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 而不等待。


提交更正

如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。