本节描述的函数用于控制和监控 PostgreSQL 安装。
表 9.93 显示了用来查询和修改运行时配置参数的函数。
表 9.93. 配置设置函数
函数
描述
示例
|
current_setting ( setting_name 文本 [, missing_ok 布尔值 ] ) → 文本
返回设置 setting_name 的当前值。如果不存在此类设置,current_setting 将抛出一个错误,除非提供了 missing_ok 且其为 true (在这种情况下,将返回 NULL)。此函数对应于SQL命令 SHOW。
current_setting('datestyle') → ISO, MDY
|
set_config ( setting_name 文本 , new_value 文本 , is_local 布尔值 ) → 文本
将参数 setting_name 设置为 new_value ,并返回该值。如果 is_local 为 true ,则新值只在当前事务中生效。如果您希望新值在当前会话的剩余时间内生效,请改用 false 。此函数对应于 SQL 命令 SET。
set_config('log_statement_stats', 'off', false) → off
|
表 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 服务器的所有进程重新加载其配置文件。(这通过向后备进程发送 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 的权限,则这种情况也会被许可,但只有超级用户才能终止超级用户后台。
如果未指定 超时 或为零,无论进程是否实际终止,此功能都返回 true ,仅表示发送信号已成功。如果指定了 超时 (以毫秒为单位)且大于零,此功能会一直等到进程实际终止或给定时间过去。如果进程已终止,此功能将返回 true 。超时后,会发出警告并返回 false 。
|
pg_cancel_backend
和 pg_terminate_backend
分别向由进程 ID 标识的后端进程发送信号 (SIGINT 或 SIGTERM)。可以在 pg_stat_activity
视图的 pid
列中找到活动后端的进程 ID,也可以通过列出服务器上的 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.95 中显示的功能有助于进行在线备份。这些功能不可在恢复期间执行(pg_backup_start
、pg_backup_stop
和 pg_wal_lsn_diff
除外)。
有关正确使用这些功能的详情,请参见 第 25.3 节。
表 9.95. 备份控制功能
函数
描述
|
pg_create_restore_point ( 名称 文本 ) → pg_lsn
在预先提交日志中创建命名的标记录,稍后可将此记录用作恢复目标,并返回相应的预先提交日志位置。然后,可在 recovery_target_name 中使用给定的名称指定将进行恢复的点。避免使用相同的名称创建多个恢复点,因为恢复将在名称与恢复目标匹配的第一个点停止。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
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 操作激增,并减慢任何同时执行的查询。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
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 列保存备份的结束预写式日志位置(它可以再次被忽略)。第二列返回备份标签文件的内容,第三列返回表空间映射文件的内容。这些必须作为备份的一部分存储,并作为恢复过程的一部分需要。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
pg_switch_wal () → pg_lsn
强制服务器切换到新的预写式日志文件,这允许存档当前文件(假设您正在使用连续存档)。结果是刚完成的预写式日志文件中的结束预写式日志位置加 1。如果自上次预写式日志切换后没有任何预写式日志活动,pg_switch_wal 将不执行任何操作,并返回当前正在使用的预写式日志文件的开始位置。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
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_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.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
返回恢复暂停状态。如果未请求暂停,则返回值为 未暂停 ;如果请求暂停但恢复尚未暂停,则返回值为 已请求暂停 ;如果恢复实际上已暂停,则返回值为 已暂停 。
|
pg_promote ( wait 布尔值 默认值 true , wait_seconds 整数 默认值 60 ) → 布尔值
将备用服务器提升至主服务器状态。将 wait 设置为 true (默认值)时,该函数会一直等到提升完成或过去 wait_seconds 秒,并在提升成功时返回 true ,否则返回 false 。如果将 wait 设置为 false ,该函数会在向 Postmaster 发送 SIGUSR1 信号以触发提升后立即返回 true 。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
pg_wal_replay_pause () → void
请求暂停恢复。请求并不表示恢复会立即停止。如果您想确保恢复实际上已暂停,需要检查 pg_get_wal_replay_pause_state() 返回的恢复暂停状态。请注意,pg_is_wal_replay_paused() 返回的是请求是否已发出。在恢复暂停期间,不会应用任何进一步的数据库更改。如果热备用处于活动状态,则所有新查询都将看到数据库的相同一致性快照,并且在恢复继续之前不会生成任何进一步的查询冲突。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
pg_wal_replay_resume () → void
如果恢复已暂停,则重新启动恢复。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
在提升正在进行期间无法执行 pg_wal_replay_pause
和 pg_wal_replay_resume
。如果在恢复暂停期间触发提升,则暂停状态结束且提升继续。
如果已禁用流复制,则暂停状态可能会无限期继续,且没有任何问题。如果流复制正在进行中,则会继续接收 WAL 记录,这最终将填满可用磁盘空间,具体取决于暂停持续时间、WAL 生成速率和可用磁盘空间。
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,而无需等待 bgwriter 或检查点程序记录一个事务。这对于备用机上的逻辑解码非常有用,因为逻辑槽的创建必须等到此类记录在备用机上重播之后。
|
表 9.99 中显示的函数 表 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 的物理复制槽。已复制的物理槽开始从源槽预留相同LSNWAL。 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 都是可选的;如果忽略它们,则会使用源槽的值。
|
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。
|
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
将逻辑故障转移复制插槽从主服务器同步到备用服务器。此功能只能在备用服务器上执行。如果存在临时同步插槽,则不能将其用于逻辑解码,并且必须在提升之后将其删除。请参阅 47.2.3 节 了解详细信息。请注意,如果启用了 sync_replication_slots 并且 slotsync 工作器已在运行以执行插槽同步,则不能执行此功能。
|
在 表 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_id TOASTed 值。如果该值未-TOAST磁盘上编辑的或不编辑的。有关更多信息,请参阅第 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
计算由指定关系的一个 ““fork”” 使用的磁盘空间。(请注意,出于大多数目的,使用更高级别的函数pg_total_relation_size 或pg_table_size 会更方便,它将计算所有 fork 的大小总和。)此函数带有一个参数时,它将返回该关系的主要数据 fork 的大小。您可以提供第二个参数来指定要检查的 fork
-
main 返回关系的主要数据 fork 的大小。
-
fsm 返回与该关系关联的空闲空间映射的大小(请参阅第 65.3 节)。
-
vm 返回与该关系关联的可视性映射的大小(请参阅第 65.4 节)。
-
init 返回与该关系关联的初始 fork(如果存在)的大小。
|
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
将按字节的常规大小转换为人类更易理解的带有大小单位的格式(如适当的字节、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.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 索引的“pending”列表,将其中的条目批量移动到 GIN 主数据结构中。返回从 pending 列表中删除的页数。如果参数是禁用fastupdate 选项的 GIN 索引构建的,则不会发生清理,结果为零,因为该索引没有 pending 列表。有关 pending 列表的详细信息,请参见第 64.4.4.1 节;有关 fastupdate 选项的详细信息,请参见第 64.4.5 节。
|
表 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_ok 为 true 时,包含这些文件可能会很有用,因为它可以用于区分空目录和不存在的目录。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
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 个字节(如果先到达文件末尾,则返回的字节数少于 length)。如果 offset 为负值,则它是相对于文件末尾的字节数。如果忽略 offset 和 length ,则会返回整个文件。从文件中读取的字节在数据库的编码中被解释为字符串;如果它们在该编码中无效,则会引发错误。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
pg_read_binary_file ( filename text [, offset bigint , length bigint ] [, missing_ok boolean ] ) → bytea
返回文件全部或部分内容。此函数与 pg_read_file 相同,不同的是它可以读取任意二进制数据,将结果返回为 bytea (而不是 text );因此,不会执行任何编码检查。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
将此函数与 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)和指示它是否为目录的标记的记录。
默认情况下,此功能仅限超级用户使用,但可以授予其他用户执行权限以运行此功能。
|
9.28.10. Advisory Lock Functions #
在 表 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 整型 ,key2 整型 ) → 布尔
在可用时获取一个共享的会话级别的咨询锁。这会立即获取锁并返回 true ,或在无法立即获取锁时返回 false 而无需等待。
|
pg_try_advisory_xact_lock ( key 大整型 ) → 布尔
pg_try_advisory_xact_lock ( key1 整型 ,key2 整型 ) → 布尔
在可用时获取一个独占的事务级别的咨询锁。这会立即获取锁并返回 true ,或在无法立即获取锁时返回 false 而无需等待。
|
pg_try_advisory_xact_lock_shared ( key 大整型 ) → 布尔
pg_try_advisory_xact_lock_shared ( key1 整型 ,key2 整型 ) → 布尔
在可用时获取一个共享的事务级别的咨询锁。这会立即获取锁并返回 true ,或在无法立即获取锁时返回 false 而无需等待。
|