9.26. 系统管理功能

275 阅读30分钟

9.26. 系统管理功能

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

9.26.1. 配置设置函数

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

表 9.77.配置设置函数

名字返回类型描述
current_setting(setting_name [, missing_ok ])text获取设置的当前值
set_config(setting_name, new_value, is_local)text设置参数并返回新值

该函数生成设置*setting_name*的当前值。它对应于 SQL 命令 。举个例子:current_setting``SHOW

SELECT current_setting('datestyle');

 current_setting
-----------------
 ISO, MDY
(1 row)

如果没有名为 setting_name 的设置,则引发错误,除非提供了 *missing_ok*并且为 。current_setting``true

set_config将参数*setting_name设置为 new_value。如果is_local*为 ,则新值将仅适用于当前事务。如果希望新值应用于当前会话,请改用。该函数对应于 SQL 命令 。举个例子:true``false``SET

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

 set_config
------------
 off
(1 row)

9.26.2. 服务器信令函数

表 9.78 中所示的功能将控制信号发送到其他服务器进程。默认情况下,这些功能的使用仅限于超级用户,但可以使用 向其他人授予访问权限,但请注意的例外情况除外。GRANT

表 9.78.服务器信令功能

名字返回类型描述
pg_cancel_backend(pid int)boolean取消后端的当前查询。如果调用角色是后端被取消或调用角色已被授予的角色的成员,则也允许这样做,但是只有超级用户可以取消超级用户后端。pg_signal_backend
pg_reload_conf()boolean导致服务器进程重新加载其配置文件
pg_rotate_logfile()boolean轮换服务器的日志文件
pg_terminate_backend(pid int)boolean终止后端。如果调用角色是后端正在终止或调用角色已被授予的角色的成员,则也允许这样做,但是只有超级用户可以终止超级用户后端。pg_signal_backend

如果成功,则返回这些函数中的每一个。true``false

pg_cancel_backend并将信号(分别为SIGINT或SIGTERM)发送到由进程ID标识的后端进程。活动后端的进程 ID 可以从视图的列中找到,也可以通过列出服务器上的进程(在 Unix 上使用 ps 或在 Windows 上使用任务管理器)找到。可以从视图的列中找到活动后端的角色。pg_terminate_backend``pid``pg_stat_activity``postgres``usename``pg_stat_activity

pg_reload_conf向服务器发送 SIGHUP 信号,导致所有服务器进程重新加载配置文件。

pg_rotate_logfile向日志文件管理器发出信号,使其立即切换到新的输出文件。这仅在内置日志收集器运行时有效,因为否则没有日志文件管理器子进程。

9.26.3. 备份控制功能

表 9.79 中所示的功能有助于进行在线备份。这些函数在恢复期间无法执行(非独占、非独占、 和 除外)。pg_start_backup``pg_stop_backup``pg_is_in_backup``pg_backup_start_time``pg_wal_lsn_diff

表 9.79.备份控制功能

名字返回类型描述
pg_create_restore_point(name text)pg_lsn创建用于执行还原的命名点(默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该函数)
pg_current_wal_flush_lsn()pg_lsn获取当前预写日志刷新位置
pg_current_wal_insert_lsn()pg_lsn获取当前预写日志插入位置
pg_current_wal_lsn()pg_lsn获取当前预写日志写入位置
pg_start_backup(label text [, fast boolean [, exclusive boolean ]])pg_lsn准备执行在线备份(默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该功能)
pg_stop_backup()pg_lsn完成独占在线备份(默认仅限超级用户,但可以授予其他用户 EXECUTE 来运行该功能)
pg_stop_backup(exclusive boolean [, wait_for_archive boolean ])setof record完成独占或非独占在线备份(默认仅限超级用户,但可以授予其他用户 EXECUTE 运行该功能的权限)
pg_is_in_backup()bool如果联机独占备份仍在进行中,则为 True。
pg_backup_start_time()timestamp with time zone获取正在进行的在线独占备份的开始时间。
pg_switch_wal()pg_lsn强制切换到新的预写日志文件(默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该函数)
pg_walfile_name(lsn pg_lsn)text将预写日志位置转换为文件名
pg_walfile_name_offset(lsn pg_lsn)text,integer将预写日志位置转换为文件名和文件中的小数字节偏移量
pg_wal_lsn_diff(lsn pg_lsn, lsn pg_lsn)numeric计算两个预写日志位置之间的差异

pg_start_backup接受任意用户定义的备份标签。(通常,这是存储备份转储文件的名称。在独占模式下使用时,该函数会将备份标签文件 () 写入数据库集群的数据目录,如果目录中有任何链接,则将表空间映射文件 () 写入数据库集群的数据目录,执行检查点,然后以文本形式返回备份的起始预写日志位置。用户可以忽略此结果值,但会提供该值以防有用。在非独占模式下使用时,这些文件的内容由函数返回,并应由调用方写入备份。backup_label``pg_tblspc/``tablespace_map``pg_stop_backup

postgres=# select pg_start_backup('label_goes_here');
 pg_start_backup
-----------------
 0/D4445B8
(1 row)

有一个可选的第二个参数类型。如果为 ,则指定尽快执行。这会强制立即设置检查点,这将导致 I/O 操作激增,从而减慢任何并发执行的查询。boolean``true``pg_start_backup

在独占备份中,删除标签文件,如果存在,则删除由 创建的文件。在非独占备份中,和的内容在函数的结果中返回,并且应写入备份中的文件(而不是数据目录中)。有一个可选的第二个参数类型。如果为 false,则备份完成后将立即返回,而无需等待 WAL 存档。此行为仅对独立监视 WAL 存档的备份软件有用。否则,使备份保持一致所需的 WAL 可能会丢失并使备份无用。当此参数设置为 true 时,将在启用存档时等待 WAL 存档;在待机状态下,这意味着它只会在 .如果主服务器上的写入活动较低,则在主服务器上运行以触发即时分段切换可能很有用。pg_stop_backup``tablespace_map``pg_start_backup``backup_label``tablespace_map``boolean``pg_stop_backup``pg_stop_backup``archive_mode = always``pg_switch_wal

在主服务器上执行时,该函数还会在预写日志存档区域中创建备份历史记录文件。历史记录文件包括给定的标签,备份的开始和结束预写日志位置,以及备份的开始和结束时间。返回值是备份的结束预写日志位置(同样可以忽略)。记录结束位置后,当前预写日志插入点将自动前进到下一个预写日志文件,以便可以立即存档结束预写日志文件以完成备份。pg_start_backup

pg_switch_wal移动到下一个预写日志文件,允许存档当前文件(假设您使用的是连续存档)。返回值是刚刚完成的预写日志文件中的结束预写日志位置 + 1。如果自上次预写日志切换以来没有预写日志活动,则不执行任何操作,并返回当前正在使用的预写日志文件的起始位置。pg_switch_wal

pg_create_restore_point创建可用作恢复目标的命名预写日志记录,并返回相应的预写日志位置。然后,可以将给定名称与 recovery_target_name 一起使用,以指定恢复将持续到的点。避免创建多个具有相同名称的还原点,因为恢复将在名称与恢复目标匹配的第一个还原点处停止。

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

您可以使用 从上述任何函数的结果中提取相应的预写日志文件名和字节偏移量。例如:pg_walfile_name_offset

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

同样,仅提取预写日志文件名。当给定的预写日志位置正好位于预写日志文件边界时,这两个函数都会返回前面的预写日志文件的名称。这通常是管理预写日志归档行为所需的行为,因为前面的文件是当前需要归档的最后一个文件。pg_walfile_name

pg_wal_lsn_diff计算两个预写日志位置之间的字节差异。它可以与表 9.79 中所示的某些函数一起使用,以获得复制滞后。pg_stat_replication

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

9.26.4. 恢复控制功能

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

表 9.80.恢复信息功能

名字返回类型描述
pg_is_in_recovery()bool如果恢复仍在进行中,则为 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。

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

表 9.81.恢复控制功能

名字返回类型描述
pg_is_wal_replay_paused()bool如果恢复已暂停,则为 True。
pg_wal_replay_pause()void立即暂停恢复(默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该功能)。
pg_wal_replay_resume()void如果恢复已暂停,则重新启动恢复(默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该功能)。

暂停恢复时,不会应用进一步的数据库更改。如果处于热备用状态,则所有新查询都将看到数据库的相同一致快照,并且在恢复恢复之前不会生成进一步的查询冲突。

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

9.26.5. 快照同步函数

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

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

快照随函数一起导出,如表 9.82 所示,并使用 SET TRANSACTION 命令导入。pg_export_snapshot

表 9.82.快照同步功能

名字返回类型描述
pg_export_snapshot()text保存当前快照并返回其标识符

该函数保存当前快照并返回标识快照的字符串。此字符串必须传递(在数据库外部)到要导入快照的客户端。快照仅在导出快照的事务结束之前可用于导入。如果需要,事务可以导出多个快照。请注意,这样做仅在事务中有用,因为在隔离级别和更高的隔离级别中,事务在其整个生存期内使用相同的快照。一旦事务导出了任何快照,就无法使用 PREPARE TRANSACTION 进行准备。pg_export_snapshot``text``READ COMMITTED``REPEATABLE READ

有关如何使用导出的快照的详细信息,请参阅设置事务

9.26.6. 复制函数

表 9.83 中所示的功能用于控制和与复制功能交互。有关基础功能的信息,请参见第 26.2.5 节、第 26.2.6 和第 50 章。复制源函数的使用仅限于超级用户。复制槽的功能使用仅限于超级用户和具有权限的用户。REPLICATION

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

第 9.26.3 节、第 9.26.4 节和第 9.26.5 中描述的功能也与复制相关。

表 9.83.复制 SQL 函数

功能返回类型描述
pg_create_physical_replication_slot(slot_name name [, immediately_reserve boolean, temporary boolean])(slot_name , LSNname pg_lsn)创建名为 slot_name 的新物理复制槽。可选的第二个参数 when 指定立即保留此复制槽的 LSN;否则,LSN 将在从流式复制客户端的首次连接时保留。只有使用流复制协议才能从物理插槽流式传输更改 — 请参见第 53.4 节。可选的第三个参数 temporary 设置为 true 时,指定插槽不应永久存储到磁盘,并且仅供当前会话使用。临时插槽也会在出现任何错误时释放。此函数对应于复制协议命令 。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])(slot_name , LSNname pg_lsn)使用输出插件插件创建名为 slot_name 的新逻辑(解码)复制*``槽。* 可选的第三个参数 temporary 设置为 true 时,指定插槽不应永久存储到磁盘,并且仅供当前会话使用。临时插槽也会在出现任何错误时释放。调用此函数与复制协议命令具有相同的效果。CREATE_REPLICATION_SLOT ... LOGICAL
pg_logical_slot_get_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[])(LSN , XID , datapg_lsn``xid text)返回槽*slot_name中的更改,从上次使用更改的点开始。如果upto_lsnupto_nchanges为 NULL,则逻辑解码将持续到 WAL 结束。如果upto_lsn为非 NULL,则解码将仅包括在指定 LSN 之前提交的那些事务。如果upto_nchanges*为非 NULL,则当解码生成的行数超过指定值时,解码将停止。但请注意,返回的实际行数可能更大,因为只有在添加解码每个新事务提交时生成的行后才会检查此限制。
pg_logical_slot_peek_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[])(LSN , XID , datapg_lsn``xid text)行为与函数类似,只是不消耗更改;也就是说,它们将在以后的呼叫中再次返回。pg_logical_slot_get_changes()
pg_logical_slot_get_binary_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[])(LSN , XID , datapg_lsn``xid bytea)行为与函数类似,只是更改返回为 .pg_logical_slot_get_changes()``bytea
pg_logical_slot_peek_binary_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[])(LSN , XID , datapg_lsn``xid bytea)行为与函数类似,只是更改返回为 并且不消耗更改;也就是说,它们将在以后的呼叫中再次返回。pg_logical_slot_get_changes()``bytea
pg_replication_slot_advance(slot_name name, upto_lsn pg_lsn)(slot_name , end_lsnname pg_lsnbool推进名为 slot_name 的复制槽的当前确认位置。插槽不会向后移动,也不会移动到当前插入位置之外。返回插槽的名称及其前进到的实际位置。如果有任何推进,更新的插槽的信息将在后续检查站写出。如果发生崩溃,插槽可能会返回到较早的位置。
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()bool是否已在当前会话中配置复制源?
pg_replication_origin_session_progress(flush bool)pg_lsn返回当前会话中配置的复制源的重播位置。参数 flush 确定是否保证相应的本地事务已刷新到磁盘。
pg_replication_origin_xact_setup(origin_lsn pg_lsn, origin_timestamp timestamptz)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 bool)pg_lsn返回给定复制源的重播位置。参数 flush 确定是否保证相应的本地事务已刷新到磁盘。
pg_logical_emit_message(transactional bool, prefix text, content text)pg_lsn发出文本逻辑解码消息。这可用于通过 WAL 将通用消息传递给逻辑解码插件。参数 transactional 指定消息是否应是当前事务的一部分,或者是否应在逻辑解码读取记录后立即写入并解码。前缀是逻辑解码插件使用的文本*前缀,用于轻松识别它们感兴趣的消息。内容*是消息的文本。
pg_logical_emit_message(transactional bool, prefix text, content bytea)pg_lsn发出二进制逻辑解码消息。这可用于通过 WAL 将通用消息传递给逻辑解码插件。参数 transactional 指定消息是否应是当前事务的一部分,或者是否应在逻辑解码读取记录后立即写入并解码。前缀是逻辑解码插件使用的文本*前缀,用于轻松识别它们感兴趣的消息。内容*是消息的二进制内容。

9.26.7. 数据库对象管理函数

表 9.84 中所示的函数计算数据库对象的磁盘空间使用情况。

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

名字返回类型描述
pg_column_size(any)int用于存储特定值的字节数(可能已压缩)
pg_database_size(oid)bigint具有指定 OID 的数据库使用的磁盘空间
pg_database_size(name)bigint具有指定名称的数据库使用的磁盘空间
pg_indexes_size(regclass)bigint附加到指定表的索引使用的总磁盘空间
pg_relation_size(relation regclass, fork text)bigint指定表或索引的指定分叉(、、或)使用的磁盘空间'main'``'fsm'``'vm'``'init'
pg_relation_size(relation regclass)bigint的简写pg_relation_size(..., 'main')
pg_size_bytes(text)bigint将大小单位转换为字节的人类可读格式的大小
pg_size_pretty(bigint)text将表示为 64 位整数的大小(以字节为单位)转换为具有大小单位的人类可读格式
pg_size_pretty(numeric)text将以字节为单位的大小转换为具有大小单位的人类可读格式
pg_table_size(regclass)bigint指定表使用的磁盘空间,不包括索引(但包括 TOAST、可用空间映射和可见性映射)
pg_tablespace_size(oid)bigint具有指定 OID 的表空间使用的磁盘空间
pg_tablespace_size(name)bigint具有指定名称的表空间使用的磁盘空间
pg_total_relation_size(regclass)bigint指定表使用的总磁盘空间,包括所有索引和 TOAST 数据

pg_column_size显示用于存储任何单个数据值的空间。

pg_total_relation_size接受表或 Toast 表的 OID 或名称,并返回用于该表的总磁盘空间,包括所有关联的索引。此函数等效于 。pg_table_size``+``pg_indexes_size

pg_table_size接受表的 OID 或名称,并返回该表所需的磁盘空间(不包括索引)。(包括 TOAST 空间、自由空间地图和可见性地图。

pg_indexes_size接受表的 OID 或名称,并返回附加到该表的所有索引使用的总磁盘空间。

pg_database_size并接受数据库或表空间的 OID 或名称,并返回其中使用的总磁盘空间。要使用 ,您必须对指定的数据库具有权限(默认情况下授予),或者是该角色的成员。要使用 ,您必须对指定的表空间具有权限,或者是该角色的成员,除非它是当前数据库的默认表空间。pg_tablespace_size``pg_database_size``CONNECT``pg_read_all_stats``pg_tablespace_size``CREATE``pg_read_all_stats

pg_relation_size接受表、索引或 Toast 表的 OID 或名称,并返回该关系的一个分支的磁盘大小(以字节为单位)。(请注意,对于大多数目的,使用更高级别的函数或 更方便,它们将所有分叉的大小相加。使用一个参数,它返回关系的主数据分支的大小。可以提供第二个参数来指定要检查的分支:pg_total_relation_size``pg_table_size

  • 'main'返回关系的主数据分支的大小。
  • 'fsm'返回与关系关联的自由空间映射的大小(请参阅第 69.3 节)。
  • 'vm'返回与关系关联的可见性映射(请参阅第 69.4 节)的大小。
  • 'init'返回与关系关联的初始化分支的大小(如果有)。

pg_size_pretty可用于以人类可读的方式格式化其他函数之一的结果,根据需要使用字节、KB、MB、GB 或 TB。

pg_size_bytes可用于从人类可读格式的字符串中获取大小(以字节为单位)。输入可以具有字节单位 kB、MB、GB 或 TB,并且解析时不区分大小写。如果未指定单位,则假定为字节。

注意

函数使用的单位 kB、MB、GB 和 TB 使用 2 的幂而不是 10 的幂进行定义,因此 1kB 是 1024 字节,1MB 是 1024 字节pg_size_pretty``pg_size_bytes2= 1048576 字节,依此类推。

上述对表或索引进行操作的函数接受参数,该参数只是系统目录中表或索引的 OID。但是,您不必手动查找 OID,因为数据类型的输入转换器将为您完成工作。只需将表名括在单引号中,使其看起来像一个文字常量。为了与普通 SQL 名称的处理兼容,除非表名两边包含双引号,否则字符串将转换为小写。regclass``pg_class``regclass

如果不表示现有对象的 OID 作为参数传递给上述函数之一,则返回 NULL。

表 9.85 中所示的功能有助于识别与数据库对象关联的特定磁盘文件。

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

名字返回类型描述
pg_relation_filenode(relation regclass)oid指定关系的文件节点编号
pg_relation_filepath(relation regclass)text指定关系的文件路径名
pg_filenode_relation(tablespace oid, filenode oid)regclass查找与给定表空间和文件节点关联的关系

pg_relation_filenode接受表、索引、序列或 Toast 表的 OID 或名称,并返回当前分配给它的“filenode”编号。文件节点是用于关系的文件名的基本组件(有关更多信息,请参见第 69.1 节)。对于大多数表,结果与 . 相同,但对于某些系统目录为零,必须使用此函数来获取正确的值。如果传递了没有存储的关系(如视图),则该函数返回 NULL。pg_class``relfilenode``relfilenode

pg_relation_filepath与 类似,但它返回关系的整个文件路径名(相对于数据库集群的数据目录)。pg_relation_filenode``PGDATA

pg_filenode_relation是 的反面。给定一个“表空间”OID 和一个“文件节点”,它返回关联关系的 OID。对于数据库默认表空间中的表,可以将表空间指定为 0。pg_relation_filenode

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

表 9.86.排序规则管理功能

名字返回类型描述
pg_collation_actual_version(oid)text从操作系统返回排序规则的实际版本
pg_import_system_collations(schema regnamespace)integer导入操作系统排序规则

pg_collation_actual_version返回当前安装在操作系统中的排序规则对象的实际版本。如果此值与 中的值不同,则可能需要重新生成依赖于排序规则的对象。另请参阅更改排序规则pg_collation.collversion

pg_import_system_collations根据排序规则在操作系统中找到的所有区域设置将排序规则添加到系统目录中。这就是用途;有关更多详细信息,请参见第 23.2.2 节。如果以后在操作系统中安装了其他区域设置,则可以再次运行此函数以添加新区域设置的排序规则。将跳过与 中的现有条目匹配的区域设置。(但是,此函数不会删除基于操作系统中不再存在的区域设置的排序规则对象。*架构*参数通常为 ,但这不是必需的;排序规则也可以安装到其他一些架构中。该函数返回它创建的新排序规则对象的数量。此功能的使用仅限于超级用户。pg_collation``initdb``pg_collation``pg_catalog

9.26.8. 索引维护函数

表 9.87 显示了可用于索引维护任务的函数。恢复期间无法执行这些函数。这些函数的使用仅限于超级用户和给定索引的所有者。

表 9.87.索引维护函数

名字返回类型描述
brin_summarize_new_values(index regclass)integer汇总尚未汇总的页面范围
brin_summarize_range(index regclass, blockNumber bigint)integer汇总覆盖给定块的页面范围(如果尚未汇总)
brin_desummarize_range(index regclass, blockNumber bigint)integer取消汇总覆盖给定块的页面范围(如果已汇总)
gin_clean_pending_list(index regclass)bigint将 GIN 待处理列表条目移动到主索引结构中

brin_summarize_new_values接受 BRIN 索引的 OID 或名称,并检查索引以查找基表中当前未由索引汇总的页面范围;对于任何此类范围,它通过扫描表页来创建新的摘要索引元组。它返回插入到索引中的新页面范围摘要的数目。 执行相同的操作,只是它仅汇总了涵盖给定块号的范围。brin_summarize_range

gin_clean_pending_list接受 GIN 索引的 OID 或名称,并通过将其中的条目批量移动到主 GIN 数据结构来清理指定索引的挂起列表。它返回从挂起列表中删除的页数。请注意,如果参数是在禁用选项的情况下构建的 GIN 索引,则不会进行清理,返回值为 0,因为索引没有挂起列表。有关待处理列表和选项的详细信息,请参阅第 66.4.1 节和第 66.5 节fastupdate``fastupdate

9.26.9. 通用文件访问函数

表 9.88 中所示的函数提供对托管服务器的计算机上的文件的本机访问。只能访问数据库集群目录和 中的文件,除非向用户授予角色 。对群集目录中的文件使用相对路径,对日志文件的配置设置使用匹配的路径。log_directory``pg_read_server_files``log_directory

请注意,授予用户 的 EXECUTE 权限或相关函数,允许他们读取服务器上数据库可以读取的任何文件,并且这些读取会绕过所有数据库内权限检查。这意味着,除其他事项外,具有此访问权限的用户能够读取包含身份验证信息的表的内容,以及读取数据库中的任何文件。因此,应仔细考虑授予对这些函数的访问权限。pg_read_file()``pg_authid

表 9.88.通用文件访问函数

名字返回类型描述
pg_ls_dir(dirname text [, missing_ok boolean, include_dot_dirs boolean])setof text列出目录的内容。默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该函数。
pg_ls_logdir()setof record列出日志目录中文件的名称、大小和上次修改时间。访问权限授予角色成员,也可以授予其他非超级用户角色。pg_monitor
pg_ls_waldir()setof record列出 WAL 目录中文件的名称、大小和上次修改时间。访问权限授予角色成员,也可以授予其他非超级用户角色。pg_monitor
pg_read_file(filename text [, offset bigint, length bigint [, missing_ok boolean] ])text返回文本文件的内容。默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该函数。
pg_read_binary_file(filename text [, offset bigint, length bigint [, missing_ok boolean] ])bytea返回文件的内容。默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该函数。
pg_stat_file(filename text[, missing_ok boolean])record返回有关文件的信息。默认情况下仅限于超级用户,但可以授予其他用户 EXECUTE 以运行该函数。

其中一些函数采用可选的 missing_ok 参数,该参数指定文件或目录不存在时的行为。如果为 ,则该函数返回 NULL(返回空结果集的 除外)。如果 ,则会引发错误。缺省值为 。true``pg_ls_dir``false``false

pg_ls_dir返回指定目录中所有文件(以及目录和其他特殊文件)的名称。*include_dot_dirs*指示结果集中是否包含“.”和“..”。默认值是排除它们 (),但在 missing_ok 时包括它们很有用,以区分空目录和不存在的目录。false``true

pg_ls_logdir返回日志目录中每个文件的名称、大小和上次修改时间 (mTime)。默认情况下,只有超级用户和角色成员才能使用此函数。可以使用 向其他人授予访问权限。不显示以点开头的文件名、目录和其他特殊文件。pg_monitor``GRANT

pg_ls_waldir返回预写日志 (WAL) 目录中每个文件的名称、大小和上次修改时间 (mtime)。默认情况下,只有超级用户和角色成员才能使用此功能。可以使用 向其他人授予访问权限。不显示以点开头的文件名、目录和其他特殊文件。pg_monitor``GRANT

pg_read_file返回文本文件的一部分,从给定的*偏移量开始,返回最大长度的字节(如果首先到达文件末尾,则返回更少)。如果偏移量为负,则它相对于文件的末尾。如果省略偏移量和长度*,则返回整个文件。从文件中读取的字节在服务器编码中被解释为字符串;如果它们在该编码中无效,则会引发错误。

pg_read_binary_file与 类似,不同之处在于结果是一个值;因此,不执行编码检查。与该函数结合使用,此函数可用于读取指定编码的文件:pg_read_file``bytea``convert_from

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

pg_stat_file返回一条记录,其中包含文件大小、上次访问时间戳、上次修改时间戳、上次文件状态更改时间戳(仅限 Unix 平台)、文件创建时间戳(仅限 Windows)以及指示它是否为目录的 a。典型用法包括:boolean

SELECT * FROM pg_stat_file('filename');
SELECT (pg_stat_file('filename')).modification;

9.26.10. 咨询锁定功能

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

表 9.89.咨询锁定功能

名字返回类型描述
pg_advisory_lock(key bigint)void获取独占会话级别咨询锁
pg_advisory_lock(key1 int, key2 int)void获取独占会话级别咨询锁
pg_advisory_lock_shared(key bigint)void获取共享会话级别咨询锁
pg_advisory_lock_shared(key1 int, key2 int)void获取共享会话级别咨询锁
pg_advisory_unlock(key bigint)boolean释放独占会话级别咨询锁
pg_advisory_unlock(key1 int, key2 int)boolean释放独占会话级别咨询锁
pg_advisory_unlock_all()void释放当前会话持有的所有会话级别咨询锁
pg_advisory_unlock_shared(key bigint)boolean释放共享会话级别咨询锁
pg_advisory_unlock_shared(key1 int, key2 int)boolean释放共享会话级别咨询锁
pg_advisory_xact_lock(key bigint)void获取独享交易级咨询锁
pg_advisory_xact_lock(key1 int, key2 int)void获取独享交易级咨询锁
pg_advisory_xact_lock_shared(key bigint)void获取共享事务级别咨询锁
pg_advisory_xact_lock_shared(key1 int, key2 int)void获取共享事务级别咨询锁
pg_try_advisory_lock(key bigint)boolean获取独占会话级别咨询锁(如果可用)
pg_try_advisory_lock(key1 int, key2 int)boolean获取独占会话级别咨询锁(如果可用)
pg_try_advisory_lock_shared(key bigint)boolean获取共享会话级别咨询锁(如果可用)
pg_try_advisory_lock_shared(key1 int, key2 int)boolean获取共享会话级别咨询锁(如果可用)
pg_try_advisory_xact_lock(key bigint)boolean获取独占交易级别咨询锁(如果可用)
pg_try_advisory_xact_lock(key1 int, key2 int)boolean获取独占交易级别咨询锁(如果可用)
pg_try_advisory_xact_lock_shared(key bigint)boolean获取共享事务级别咨询锁(如果可用)
pg_try_advisory_xact_lock_shared(key1 int, key2 int)boolean获取共享事务级别咨询锁(如果可用)

pg_advisory_lock锁定应用程序定义的资源,该资源可以通过单个 64 位键值或两个 32 位键值标识(请注意,这两个键空间不重叠)。如果另一个会话已锁定同一资源标识符,则此函数将等待资源可用。锁是排他性的。多个锁定请求堆栈,因此,如果同一资源被锁定三次,则必须解锁三次才能释放供其他会话使用。

pg_advisory_lock_shared与 的工作方式相同,只是锁可以与请求共享锁的其他会话共享。只有潜在的专属储物柜被锁定。pg_advisory_lock

pg_try_advisory_lock与 类似,不同之处在于该函数不会等待锁变为可用。它要么立即获取锁并返回,要么在无法立即获取锁时返回。pg_advisory_lock``true``false

pg_try_advisory_lock_shared与 的工作方式相同,只是它尝试获取共享锁而不是独占锁。pg_try_advisory_lock

pg_advisory_unlock将释放以前获取的独占会话级别咨询锁。如果锁成功释放,它将返回。如果未持有锁,它将返回 ,此外,服务器将报告 SQL 警告。true``false

pg_advisory_unlock_shared与 的工作方式相同,只是它释放了共享会话级别的咨询锁。pg_advisory_unlock

pg_advisory_unlock_all将释放当前会话持有的所有会话级别咨询锁。(此函数在会话结束时隐式调用,即使客户端不正常断开连接也是如此。

pg_advisory_xact_lock与 相同,只是锁在当前事务结束时自动释放,并且不能显式释放。pg_advisory_lock

pg_advisory_xact_lock_shared与 相同,只是锁在当前事务结束时自动释放,并且不能显式释放。pg_advisory_lock_shared

pg_try_advisory_xact_lock与 相同,只是锁(如果已获取)将在当前事务结束时自动释放,并且无法显式释放。pg_try_advisory_lock

pg_try_advisory_xact_lock_shared与 相同,只是锁(如果已获取)将在当前事务结束时自动释放,并且无法显式释放。pg_try_advisory_lock_shared