↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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
历史版本。 PostgreSQL 12 已结束支持。 2024-11-21. 请参阅 当前版本手册.

9.26. 系统管理函数 #

这一节描述的函数被用来控制和监视一个 PostgreSQL 安装。

9.26.1. 配置设定函数 #

表 9.82 展示了那些可以用于查询以及修改运行时配置参数的函数。

表 9.82. 配置设定函数

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

函数 current_setting 返回设置 setting_name 的当前值。它对应于 SQL 命令 SHOW。例如:

SELECT current_setting('datestyle');

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

如果不存在名为 setting_name 的设置,current_setting 会报错,除非提供了 missing_ok 且其值为 true。

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

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

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

9.26.2. 服务器信号函数 #

在表 9.83 中展示的函数向其它服务器进程发送控制信号。默认情况下这些函数只能被超级用户使用,但是如果需要,可以利用 GRANT 把访问权限授予给其他用户(注明的例外除外)。

表 9.83. 服务器信号函数

名称返回类型描述
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 和 pg_terminate_backend 向由进程 ID 标识的后端进程发送信号(分别是 SIGINT 或 SIGTERM)。一个活动后端的进程 ID 可以从 pg_stat_activity 视图的 pid 列中找到,或者通过在服务器上列出 postgres 进程(在 Unix 上使用 ps 或者在 Windows 上使用任务管理器)得到。一个活动后端的角色可以在 pg_stat_activity 视图的 usename 列中找到。

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

pg_rotate_logfile 向日志文件管理器发送信号,使其立即切换到新的输出文件。只有内置日志收集器正在运行时才有效,否则不存在日志文件管理器子进程。

9.26.3. 备份控制函数 #

表 9.84 中列出的函数有助于进行在线备份。这些函数不能在恢复期间执行(非排他模式的 pg_start_backup、非排他模式的 pg_stop_backup、pg_is_in_backup、pg_backup_start_time 和 pg_wal_lsn_diff 除外)。

表 9.84. 备份控制函数

名称返回类型描述
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如果在线排他备份仍在进行,则为真。
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)

还可以提供第二个可选参数,其类型为 boolean。如果该参数为 true,则尽快执行 pg_start_backup。这会强制立即执行检查点,使 I/O 操作量陡增,并降低并发执行的查询的速度。

在排他备份中,pg_stop_backup 删除标签文件,以及 pg_start_backup 创建的 tablespace_map 文件(如果存在)。在非排他备份中,backup_label 和 tablespace_map 的内容在函数结果中返回,应将它们写入备份中的文件,而不是数据目录中的文件。还有一个 boolean 类型的可选第二参数。如果为假,pg_stop_backup 会在备份完成后立即返回,不等待 WAL 归档。这种行为只适用于自行监控 WAL 归档的备份软件;否则,可能缺少使备份保持一致所需的 WAL,导致备份无法使用。如果该参数为真,且归档已启用,pg_stop_backup 会等待 WAL 归档;在备库上,这意味着只有 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 计算两个预写式日志位置之间的字节差。可以将它与 pg_stat_replication 或表 9.84 中的某些函数配合使用,以获取复制延迟。

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

9.26.4. 恢复控制函数 #

表 9.85 中展示的函数提供有关备库当前状态的信息。这些函数可以在恢复或普通运行过程中被执行。

表 9.85. 恢复信息函数

名称返回类型描述
pg_is_in_recovery() bool如果恢复仍在进行,则为真。
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.86 列出的函数用于控制恢复进度。这些函数只能在恢复期间执行。

表 9.86. 恢复控制函数

名称返回类型描述
pg_is_wal_replay_paused() bool如果恢复已暂停,则为真。
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立即暂停恢复(默认仅限超级用户,但可以向其他用户授予 EXECUTE 权限以运行此函数)。
pg_wal_replay_resume() void如果恢复已暂停,则重新开始恢复(默认仅限超级用户,但可以向其他用户授予 EXECUTE 权限以运行此函数)。

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

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

9.26.5. 快照同步函数 #

PostgreSQL 允许数据库会话同步它们的快照。一个快照决定对于正在使用该快照的事务哪些数据是可见的。当两个或者更多个会话需要看到数据库中的相同内容时,就需要同步快照。如果两个会话独立开始其事务,就总是有可能有某个第三事务在两个 START TRANSACTION 命令的执行之间提交,这样其中一个会话就可以看到该事务的效果而另一个则看不到。

为了解决这个问题,PostgreSQL 允许一个事务导出它正在使用的快照。只要导出快照的事务仍然保持打开,其他事务可以导入它的快照,并且因此可以保证它们可以看到和第一个事务看到的完全一样的数据库视图。但是注意这些事务中的任何一个对数据库所作的更改对其他事务仍然保持不可见,和未提交事务所作的修改一样。因此这些事务是针对以前存在的数据同步,而对由它们自己所作的更改则采取正常的动作。

如表 9.87 中所示,快照通过 pg_export_snapshot 函数导出,并且通过 SET TRANSACTION 命令导入。

表 9.87. 快照同步函数

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

函数 pg_export_snapshot 保存当前快照,并返回标识该快照的 text 字符串。必须在数据库之外将此字符串传递给要导入该快照的客户端。快照只能在导出它的事务结束之前导入。如有需要,一个事务可以导出多个快照。注意,这只对 READ COMMITTED 事务有用,因为在 REPEATABLE READ 及更高隔离级别中,事务在整个存续期间都使用同一个快照。事务一旦导出过快照,就不能再通过 PREPARE TRANSACTION 进行预备。

关于如何使用导出快照的详细说明,请参见 SET TRANSACTION。

9.26.6. 复制函数 #

表 9.88 中的函数用于控制复制功能并与之交互。相关功能的信息见第 26.2.5 节、第 26.2.6 节和第 49 章。复制源函数仅限超级用户使用。复制槽函数仅限超级用户和具有 REPLICATION 权限的用户使用。

很多这些函数在复制协议中都有等价的命令,见第 52.4 节。

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

表 9.88. 复制 SQL 函数

函数返回类型描述
pg_create_physical_replication_slot(slot_name name [, immediately_reserve boolean, temporary boolean]) (slot_name name, lsn pg_lsn) 创建名为 slot_name 的新物理复制槽。可选的第二个参数为 true 时,指定立即为此复制槽保留 LSN;否则在流复制客户端首次连接时保留 LSN。从物理槽流式传输更改只能使用流复制协议 — 参见第 52.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]) (slot_name name, lsn pg_lsn) 使用输出插件 plugin 创建名为 slot_name 的新逻辑(解码)复制槽。可选的第三个参数 temporary 为真时,指定该槽不永久存储到磁盘,且仅供当前会话使用。发生任何错误时,临时槽也会被释放。调用此函数与复制协议命令 CREATE_REPLICATION_SLOT ... LOGICAL 效果相同。
pg_copy_physical_replication_slot(src_slot_name name, dst_slot_name name [, temporary boolean]) (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]]) (slot_name name, lsn pg_lsn) 将名为 src_slot_name 的现有逻辑复制槽复制为名为 dst_slot_name 的逻辑复制槽,同时更改输出插件和持久性。复制后的逻辑槽从与源逻辑槽相同的 LSN 开始。temporary 和 plugin 都是可选的。如果省略 temporary 或 plugin,则使用与源逻辑槽相同的值。
pg_logical_slot_get_changes(slot_name name, upto_lsn pg_lsn, upto_nchanges int, VARIADIC options text[]) (lsn pg_lsn, xid xid, data text) 返回槽 slot_name 中自上次消费更改的位置起的更改。如果 upto_lsn 和 upto_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 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 int, VARIADIC options text[]) (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 int, VARIADIC options text[]) (lsn pg_lsn, xid xid, data bytea) 行为与 pg_logical_slot_get_changes() 相同,但更改以 bytea 返回,且不会被消费;也就是说,后续调用还会再次返回这些更改。
pg_replication_slot_advance(slot_name name, upto_lsn pg_lsn) (slot_name name, end_lsn pg_lsn) bool 推进名为 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 参数指定消息是作为当前事务的一部分,还是立即写入并在逻辑解码读到该记录时立即解码。prefix 是文本前缀,便于逻辑解码插件识别其关注的消息。content 是消息文本。
pg_logical_emit_message(transactional bool, prefix text, content bytea)pg_lsn发出二进制逻辑解码消息。这可用于通过 WAL 向逻辑解码插件传递通用消息。transactional 参数指定消息是作为当前事务的一部分,还是立即写入并在逻辑解码读到该记录时立即解码。prefix 是文本前缀,便于逻辑解码插件识别其关注的消息。content 是消息的二进制内容。

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

表 9.89 中的函数计算数据库对象的磁盘空间用量。

表 9.89. 数据库对象尺寸函数

名称返回类型描述
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)bigintpg_relation_size(..., 'main') 的简写
pg_size_bytes(text)bigint将带有大小单位的人类可读格式转换为字节数
pg_size_pretty(bigint)text将以 64 位整数表示的字节大小转换为带有大小单位的人类可读格式
pg_size_pretty(numeric)text将以 numeric 值表示的字节大小转换为带有大小单位的人类可读格式
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 和 pg_tablespace_size 接受数据库或表空间的 OID 或名称,返回其中占用的磁盘总空间。使用 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 可以将其他函数的结果格式化为便于阅读的形式,适当地使用 bytes、kB、MB、GB 或 TB 单位。

pg_size_bytes 可以将便于阅读的大小字符串转换为字节数。输入可以使用 bytes、kB、MB、GB 或 TB 单位,解析时不区分大小写。如果没有指定单位,则默认为字节。

注意

pg_size_pretty 和 pg_size_bytes 使用的 kB、MB、GB 和 TB 单位按 2 的幂定义,而不是 10 的幂。因此,1kB 为 1024 字节,1MB 为 10242 = 1048576 字节,以此类推。

上述操作表和索引的函数接受一个 regclass 参数,它是该表或索引在 pg_class 系统目录中的 OID。你不必手工去查找该 OID,因为 regclass 数据类型的输入转换器会为你代劳。只写包围在单引号内的表名,这样它看起来像一个字面量。为了与普通 SQL 名称的处理相兼容,该字符串将被转换为小写形式,除非其中在表名周围包含双引号。

如果向上述某个函数传入的 OID 不代表现有对象,则返回 NULL。

表 9.90 中展示的函数帮助标识数据库对象相关的磁盘文件。

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

名称返回类型描述
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 或名称,返回当前分配给它的“文件节点”编号。文件节点是关系文件名的基本组成部分(更多信息见第 69.1 节)。对于大多数表,结果与 pg_class.relfilenode 相同;但某些系统目录的 relfilenode 为零,必须使用此函数获取正确值。如果传入的关系没有存储空间(例如视图),函数返回 NULL。

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

pg_filenode_relation 执行 pg_relation_filenode 的逆操作。给定“表空间” OID 和“文件节点”,它返回关联关系的 OID。对于位于数据库默认表空间中的表,表空间可以指定为 0。

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

表 9.91. 排序规则管理函数

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

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

pg_import_system_collations 根据操作系统中找到的所有区域设置,向系统目录 pg_collation 添加排序规则。initdb 使用的就是此函数;更多信息见第 23.2.2 节。如果以后在操作系统中安装了其他区域设置,可以再次运行此函数,为新区域设置添加排序规则。与 pg_collation 中现有条目匹配的区域设置会被跳过。(但此函数不会删除基于操作系统中已不存在的区域设置的排序规则对象。)schema 参数通常为 pg_catalog,但并非必须如此;也可以将排序规则安装到其他模式中。函数返回新建的排序规则对象数量。此函数仅限超级用户使用。

表 9.92. 分区信息函数

名称返回类型描述
pg_partition_tree(regclass)setof record列出给定分区表或分区索引的分区树中各表或索引的信息,每个分区一行。提供的信息包括分区名称、直接父对象名称、表示该分区是否为叶子的布尔值,以及表示其层级的整数。输入表或索引作为分区树的根,其层级为 0;其分区为 1,这些分区的分区为 2,依此类推。
pg_partition_ancestors(regclass)setof regclass列出给定分区的祖先关系,包括该分区本身。
pg_partition_root(regclass)regclass返回给定关系所属分区树的最顶层父对象。

要检查第 5.11.2.1 节中介绍的 measurement 表所含数据的总大小,可以使用以下查询:

=# SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
     FROM pg_partition_tree('measurement');
 total_size 
------------
 24 kB
(1 row)

9.26.8. 索引维护函数 #

表 9.93 列出了可用于索引维护任务的函数。这些函数不能在恢复期间执行,仅限超级用户和给定索引的所有者使用。

表 9.93. 索引维护函数

名称返回类型描述
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 数据结构中,清理指定索引的待处理列表。它返回从待处理列表中移除的页面数。注意,如果参数是禁用了 fastupdate 选项的 GIN 索引,则不执行清理并返回 0,因为该索引没有待处理列表。关于待处理列表和 fastupdate 选项的详细信息,请参见第 66.4.1 节和第 66.5 节。

9.26.9. 通用文件访问函数 #

表 9.94 中展示的函数提供了对数据库服务器所在机器上的文件的本地访问。只能访问数据库集簇目录以及 log_directory 中的文件,除非用户被授予了角色 pg_read_server_files。使用相对路径访问集簇目录里面的文件,以及匹配 log_directory 配置设置的路径访问日志文件。

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

表 9.94. 通用文件访问函数

名称返回类型描述
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_ls_archive_statusdir() setof record列出 WAL 归档状态目录中文件的名称、大小和最后修改时间。pg_monitor 角色成员拥有访问权限,也可向其他非超级用户角色授予访问权限。
pg_ls_tmpdir([tablespace oid])setof record列出 tablespace 临时目录中文件的名称、大小和最后修改时间。如果未提供 tablespace,则使用 pg_default 表空间。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,用于指定文件或目录不存在时的行为。如果为 true,函数返回 NULL(但 pg_ls_dir 返回空结果集)。如果为 false,则会报错。默认值为 false。

pg_ls_dir 返回指定目录中所有文件的名称(也包括目录和其他特殊文件)。include_dot_dirs 指示结果集是否包含“.”和“..”。默认不包含它们(false);但当 missing_ok 为 true 时,包含它们有助于区分空目录和不存在的目录。

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

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

pg_ls_archive_statusdir 返回 WAL 归档状态目录 pg_wal/archive_status 中每个文件的名称、大小和最后修改时间(mtime)。默认情况下,只有超级用户和 pg_monitor 角色的成员可以使用此函数。可以使用 GRANT 授权其他用户访问。不会显示名称以点开头的文件、目录和其他特殊文件。

pg_ls_tmpdir 返回指定 tablespace 的临时文件目录中每个文件的名称、大小和最后修改时间(mtime)。如果不提供 tablespace,则使用 pg_default 表空间。默认情况下,只有超级用户和 pg_monitor 角色的成员可以使用此函数。可以使用 GRANT 授权其他用户访问。不会显示名称以点开头的文件、目录和其他特殊文件。

pg_read_file 从给定的 offset 开始返回文本文件的一部分,最多返回 length 字节(如果先到达文件末尾,则返回更少的字节)。如果 offset 为负,则它相对于文件末尾。如果省略 offset 和 length,则返回整个文件。从文件读取的字节按服务器编码解释为字符串;如果它们在该编码下无效,则会报错。

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),以及一个 boolean 值,表示它是否是目录。典型用法包括:

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

9.26.10. 咨询锁函数 #

表 9.95 中展示的函数管理咨询锁。有关正确使用这些函数的细节请参考第 13.3.5 节。

表 9.95. 咨询锁函数

名称返回类型描述
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 释放先前获得的会话级排他咨询锁。如果成功释放锁,则返回 true。如果未持有该锁,则返回 false,服务器还会报告一条 SQL 警告。

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 相同,但如果获得了锁,该锁会在当前事务结束时自动释放,不能显式释放。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.