9.27. 系统管理函数 #
这一节描述的函数被用来控制和监视一个 PostgreSQL 安装。
9.27.1. 配置设定函数 #
表 9.83 展示了那些可以用于查询以及修改运行时配置参数的函数。
表 9.83. 配置设定函数
函数 描述 示例 |
|---|
返回设置
|
将参数
|
9.27.2. 服务器信号函数 #
在表 9.84 中展示的函数向其它服务器进程发送控制信号。默认情况下这些函数只能被超级用户使用,但是如果需要,可以利用 GRANT 把访问权限授予给其他用户(注明的例外除外)。
这些函数在成功时都返回 true,否则返回 false。
表 9.84. 服务器信号函数
pg_cancel_backend 和 pg_terminate_backend 向由进程 ID 标识的后端进程发送信号(分别是 SIGINT 或 SIGTERM)。一个活动后端的进程 ID 可以从 pg_stat_activity 视图的 pid 列中找到,或者通过在服务器上列出 postgres 进程(在 Unix 上使用 ps 或者在 Windows 上使用任务管理器)得到。一个活动后端的角色可以在 pg_stat_activity 视图的 usename 列中找到。
9.27.3. 备份控制函数 #
表 9.85 中列出的函数有助于进行在线备份。这些函数不能在恢复期间执行(非排他模式的 pg_start_backup、非排他模式的 pg_stop_backup、pg_is_in_backup、pg_backup_start_time 和 pg_wal_lsn_diff 除外)。
有关正确使用这些函数的详细信息,参见第 25.3 节。
表 9.85. 备份控制函数
函数 描述 |
|---|
在预写式日志中创建一条命名标记记录,供以后用作恢复目标,并返回相应的预写式日志位置。随后可以在 recovery_target_name 中使用给定名称,指定恢复到哪一点。应避免创建多个同名恢复点,因为恢复会在第一个名称匹配恢复目标的恢复点停止。 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
返回当前预写式日志刷盘位置(参见下文说明)。 |
返回当前预写式日志插入位置(参见下文说明)。 |
返回当前预写式日志写入位置(参见下文说明)。 |
准备服务器开始在线备份。唯一必需的参数是用户任意指定的备份标签。(通常是备份转储文件将要保存的名称。)如果可选的第二个参数为 在排他模式下使用时,该函数会将备份标签文件( 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
结束排他或非排他的在线备份。
有一个
在主库上执行时,该函数还会在预写式日志归档区域创建备份历史文件。历史文件包括传给 该函数的结果是一条记录。 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
结束排他在线备份。这个简化版本等价于 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
|
如果正在进行在线排他备份,则返回 true。 |
如果正在进行在线排他备份,返回其开始时间,否则返回 |
|
强制服务器切换到新的预写式日志文件,使当前文件可以归档(假设正在使用连续归档)。返回值是刚完成的预写式日志文件中的结束预写式日志位置加 1。如果自上次切换预写式日志以来没有发生任何预写式日志活动, 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
将预写式日志位置转换为包含该位置的 WAL 文件的名称。 |
将预写式日志位置转换为 WAL 文件名和该文件中的字节偏移量。 |
计算两个预写式日志位置之间的字节差( |
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_stop_backup());
file_name | file_offset
--------------------------+-------------
00000001000000000000000D | 4039624
(1 row)
类似地,pg_walfile_name 仅提取预写式日志文件名。当指定的预写式日志位置恰好位于预写式日志文件边界时,这两个函数都返回前一个预写式日志文件的名称。这通常正是管理预写式日志归档时所需的行为,因为前一个文件是当前需要归档的最后一个文件。
9.27.4. 恢复控制函数 #
表 9.86 中展示的函数提供有关备库当前状态的信息。这些函数可以在恢复或普通运行过程中被执行。
表 9.86. 恢复信息函数
表 9.87 列出的函数用于控制恢复进度。这些函数只能在恢复期间执行。
表 9.87. 恢复控制函数
pg_wal_replay_pause 和 pg_wal_replay_resume 不能在提升进行时执行。如果在恢复暂停时触发了提升,则暂停状态结束,提升继续进行。
如果禁用了流复制,则暂停状态可能会无限期地持续下去,不会出现问题。如果正在进行流复制,那么将继续接收 WAL 记录,这将最终填满可用磁盘空间,这取决于暂停持续时间、WAL 生成速度和可用磁盘空间。
9.27.5. 快照同步函数 #
PostgreSQL 允许数据库会话同步它们的快照。一个快照决定对于正在使用该快照的事务哪些数据是可见的。当两个或者更多个会话需要看到数据库中的相同内容时,就需要同步快照。如果两个会话独立开始其事务,就总是有可能有某个第三事务在两个 START TRANSACTION 命令的执行之间提交,这样其中一个会话就可以看到该事务的效果而另一个则看不到。
为了解决这个问题,PostgreSQL 允许一个事务导出它正在使用的快照。只要导出快照的事务仍然保持打开,其他事务可以导入它的快照,并且因此可以保证它们可以看到和第一个事务看到的完全一样的数据库视图。但是注意这些事务中的任何一个对数据库所作的更改对其他事务仍然保持不可见,和未提交事务所作的修改一样。因此这些事务是针对以前存在的数据同步,而对由它们自己所作的更改则采取正常的动作。
如表 9.88 中所示,快照通过 pg_export_snapshot 函数导出,并且通过 SET TRANSACTION 命令导入。
表 9.88. 快照同步函数
函数 描述 |
|---|
|
保存事务的当前快照并返回
如果需要的话,一个事务可以导出多个快照。请注意,这样做仅在 |
9.27.6. 复制管理函数 #
表 9.89 中展示的函数用于控制以及与复制特性交互。有关底层特性的信息请见第 26.2.5 节、第 26.2.6 节以及第 49 章。复制源函数的使用仅限于超级用户。复制槽的函数只限于超级用户和拥有 REPLICATION 权限的用户。
很多这些函数在复制协议中都有等价的命令,见第 52.4 节。
第 9.27.3 节、第 9.27.4 节和第 9.27.5 节中描述的函数也与复制相关。
表 9.89. 复制管理函数
函数 描述 |
|---|
创建名为 |
删除名为 |
创建一个名为 |
将一个名为 |
复制一个名为 |
返回槽 |
行为就像 |
行为就像 |
行为就像 |
推进名为 |
用给定的外部名称创建一个复制源,并且返回分配给它的内部 ID。 |
删除一个以前创建的复制源,包括任何相关的重放进度。 |
通过名称查找复制源并返回其内部 ID。如果未找到这样的复制源,则返回 |
将当前会话标记为从给定的复制源重放,从而允许跟踪重放进度。只能在当前没有选择复制源时使用。使用 |
取消 |
如果在当前会话中选择了复制源则返回真。 |
返回当前会话中选择的复制源的重放位置。参数 |
将当前事务标记为重放在给定 LSN 和时间戳上提交的事务。只能在使用 |
取消 |
将给定节点的复制进度设置为给定的位置。这主要用于设置初始位置,或在配置更改或类似的变更后设置新位置。请注意这个函数的不当使用可能会导致不一致的复制数据。 |
返回给定复制源的重放位置。参数 |
发出逻辑解码消息。这可用于通过 WAL 向逻辑解码插件传递通用消息。 |
9.27.7. 数据库对象管理函数 #
表 9.90 中所示的函数计算数据库对象的磁盘空间使用情况,或帮助展示使用结果。所有这些函数返回的大小都以字节为单位。如果将不代表已有对象的 OID 传递给这些函数之一,则返回 NULL。
表 9.90. 数据库对象尺寸函数
上述操作表和索引的函数接受一个 regclass 参数,它是该表或索引在 pg_class 系统目录中的 OID。你不必手工去查找该 OID,因为 regclass 数据类型的输入转换器会为你代劳。只写包围在单引号内的表名,这样它看起来像一个字面量。为了与普通 SQL 名称的处理相兼容,该字符串将被转换为小写形式,除非其中在表名周围包含双引号。
表 9.91 中展示的函数帮助标识数据库对象相关的磁盘文件。
表 9.91. 数据库对象位置函数
函数 描述 |
|---|
返回当前分配给指定关系的“文件节点”编号。文件节点是关系所用文件名的基本组成部分(更多信息见第 69.1 节)。对于大多数关系,结果与
|
返回关系的完整文件路径名称(相对于数据库集簇的数据目录,即 |
根据关系所在表空间的 OID 和文件节点返回该关系的 OID。这本质上是 |
表 9.92 列出用于管理排序规则的函数。
表 9.92. 排序规则管理函数
函数 描述 |
|---|
返回当前安装在操作系统中的该排序规则对象的实际版本。如果这个版本与 |
根据操作系统中找到的所有区域设置,向系统目录 |
表 9.93 列出了提供分区表结构信息的函数。
表 9.93. 分区信息函数
例如,要检查分区表 measurement 中包含的数据的总大小,可以使用以下查询:
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
FROM pg_partition_tree('measurement');
9.27.8. 索引维护函数 #
表 9.94 显示了索引维护任务可以使用的函数。(注意,这些维护任务通常由 autovacuum 自动完成;只有在特殊情况下才需要使用这些函数。)这些函数在恢复过程中无法执行。这些函数的使用局限于超级用户和给定索引的所有者。
表 9.94. 索引维护函数
函数 描述 |
|---|
扫描指定的 BRIN 索引以查找基表中当前尚未生成索引摘要的页面范围;对于任何这样的范围,它都通过扫描这些表页来创建一个新的摘要索引元组。返回插入到索引中的新页面范围摘要的数量。 |
对覆盖给定块的页面范围执行摘要(如果尚未摘要)。这类似于 |
如果存在涵盖指定表块的页面范围摘要,则删除对应的 BRIN 索引元组。 |
将指定 GIN 索引的“待处理”列表中的条目批量移入主 GIN 数据结构,从而清理该列表。返回从待处理列表中移除的页数。如果参数是禁用 |
9.27.9. 通用文件访问函数 #
表 9.95 中展示的函数提供了对数据库服务器所在机器上的文件的本地访问。只能访问数据库集簇目录以及 log_directory 中的文件,除非用户是超级用户或者被授予了角色 pg_read_server_files。使用相对路径访问集簇目录里面的文件,以及匹配 log_directory 配置设置的路径访问日志文件。
注意,向用户授予 pg_read_file() 或相关函数的 EXECUTE 权限,会使其能够读取服务器上数据库服务器进程能读取的任何文件;这些函数会绕过数据库内部的所有权限检查。例如,具有这种访问权限的用户能够读取存储认证信息的 pg_authid 表的内容,以及数据库中的任何表数据。因此,授予这些函数的访问权限时应仔细考虑。
这些函数中的一些函数接受可选的 missing_ok 参数,用于指定文件或目录不存在时的行为。如果为 true,函数会视情况返回 NULL 或空结果集。如果为 false,则会报错。默认为 false。
表 9.95. 通用文件访问函数
9.27.10. 咨询锁函数 #
表 9.96 中展示的函数管理咨询锁。有关正确使用这些函数的细节请参考第 13.3.5 节。
这些函数用于锁定应用程序定义的资源;资源可用一个 64 位键值或两个 32 位键值标识(这两个键空间互不重叠)。如果另一个会话已对同一资源标识符持有冲突锁,函数会根据自身的行为等待资源可用,或返回 false。锁可以是共享的或排他的:共享锁不会与同一资源上的其他共享锁冲突,只会与排他锁冲突。锁可以在会话级获取(一直保持到释放或会话结束),也可以在事务级获取(一直保持到当前事务结束,不能手动释放)。多次会话级锁请求会累加,因此,如果同一资源标识符被锁定三次,就必须请求解锁三次,才能在会话结束前释放该资源。
表 9.96. 咨询锁函数