9.28. 系统管理函数 #
这一节描述的函数被用来控制和监视一个 PostgreSQL 安装。
9.28.1. 配置设定函数 #
表 9.95 展示了那些可以用于查询以及修改运行时配置参数的函数。
表 9.95. 配置设定函数
函数 描述 示例 |
|---|
返回设置
|
将参数
|
9.28.2. 服务器信号函数 #
在表 9.96 中展示的函数向其他服务器进程发送控制信号。默认情况下这些函数只能被超级用户使用,但是如果需要,可以利用 GRANT 把访问权限授予给其他用户(注明的例外除外)。
每个这样的函数如果信号成功发出则返回 true,如果发送信号失败则返回 false。
表 9.96. 服务器信号函数
函数 描述 |
|---|
取消具有指定进程 ID 的后端进程的会话的当前查询。如果调用角色是被取消的后端进程所属角色的成员,或者调用角色具有 |
请求记录具有指定进程 ID 的后端进程的内存上下文。此函数可以向除日志记录进程以外的后端进程和辅助进程发送请求。这些内存上下文将以 |
|
使 PostgreSQL 服务器的所有进程重新加载其配置文件。(这是通过向 postmaster 进程发送 SIGHUP 信号来启动的,postmaster 进程又向其每个子进程发送 SIGHUP。)您可以使用 |
通知日志文件管理器立即切换到一个新的输出文件。这仅在内置日志收集器运行时有效,因为否则没有日志文件管理器子进程。 |
终止具有指定进程 ID 的后端进程的会话。如果调用角色是正在终止的后端的角色的成员,或者调用角色具有
如果未指定 |
pg_cancel_backend 和 pg_terminate_backend 向由进程 ID 标识的后端进程发送信号(分别是 SIGINT 或 SIGTERM)。一个活动后端的进程 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: 1; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used LOG: level: 2; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used LOG: level: 2; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used LOG: level: 2; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used LOG: level: 2; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used LOG: level: 2; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used LOG: level: 2; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used LOG: level: 2; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used ... LOG: level: 2; 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.97 中显示的函数有助于进行在线备份。这些函数在恢复过程中无法执行(除了 pg_backup_start、pg_backup_stop 和 pg_wal_lsn_diff)。
有关正确使用这些函数的详细信息,参见第 25.3 节。
表 9.97. 备份控制函数
函数 描述 |
|---|
在预写式日志中创建一条命名标记记录,供以后用作恢复目标,并返回相应的预写式日志位置。随后可以在 recovery_target_name 中使用给定名称,指定恢复到哪一点。应避免创建多个同名恢复点,因为恢复会在第一个名称匹配恢复目标的恢复点停止。 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
返回当前预写式日志刷盘位置(参见下文说明)。 |
返回当前预写式日志插入位置(参见下文说明)。 |
返回当前预写式日志写入位置(参见下文说明)。 |
准备服务器开始在线备份。唯一必需的参数是用户任意指定的备份标签。(通常是备份转储文件将要保存的名称。)如果可选的第二个参数为 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
结束在线备份。备份标签文件和表空间映射文件所需的内容作为函数结果的一部分返回,必须将其写入备份区域中的文件。切勿将这些文件写入正在使用的数据目录(否则发生崩溃后 PostgreSQL 将无法重新启动)。
有一个
在主库上执行时,该函数还会在预写式日志归档区域创建备份历史文件。历史文件包括传给
该函数的结果是一条记录。 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
|
强制服务器切换到新的预写式日志文件,使当前文件可以归档(假设正在使用连续归档)。返回值是刚完成的预写式日志文件中的结束预写式日志位置加 1。如果自上次切换预写式日志以来没有发生任何预写式日志活动, 默认情况下,此函数仅限超级用户使用,但可以向其他用户授予 EXECUTE 权限以运行它。 |
将预写式日志位置转换为包含该位置的 WAL 文件的名称。 |
将预写式日志位置转换为 WAL 文件名和该文件中的字节偏移量。 |
从 WAL 文件名中提取序列号和时间线 ID。 |
计算两个预写式日志位置之间的字节差( |
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.28.4. 恢复控制函数 #
表 9.98 中展示的函数提供有关备库当前状态的信息。这些函数可以在恢复或普通运行过程中被执行。
表 9.98. 恢复信息函数
表 9.99 列出的函数用于控制恢复进度。这些函数只能在恢复期间执行。
表 9.99. 恢复控制函数
pg_wal_replay_pause 和 pg_wal_replay_resume 不能在提升进行时执行。如果在恢复暂停时触发了提升,则暂停状态结束,提升继续进行。
如果禁用了流复制,则暂停状态可能会无限期地持续下去,不会出现问题。如果正在进行流复制,那么将继续接收 WAL 记录,这将最终填满可用磁盘空间,这取决于暂停持续时间、WAL 生成速度和可用磁盘空间。
9.28.5. 快照同步函数 #
PostgreSQL 允许数据库会话同步它们的快照。一个快照决定对于正在使用该快照的事务哪些数据是可见的。当两个或者更多个会话需要看到数据库中的相同内容时,就需要同步快照。如果两个会话独立开始其事务,就总是有可能有某个第三事务在两个 START TRANSACTION 命令的执行之间提交,这样其中一个会话就可以看到该事务的效果而另一个则看不到。
为了解决这个问题,PostgreSQL 允许一个事务导出它正在使用的快照。只要导出快照的事务仍然保持打开,其他事务可以导入它的快照,并且因此可以保证它们可以看到和第一个事务看到的完全一样的数据库视图。但是注意这些事务中的任何一个对数据库所作的更改对其他事务仍然保持不可见,和未提交事务所作的修改一样。因此这些事务是针对以前存在的数据同步,而对由它们自己所作的更改则采取正常的动作。
如表 9.100 中所示,快照通过 pg_export_snapshot 函数导出,并且通过 SET TRANSACTION 命令导入。
表 9.100. 快照同步函数
函数 描述 |
|---|
|
保存事务的当前快照并返回
如果需要的话,一个事务可以导出多个快照。请注意,这样做仅在 |
为进行中的事务拍摄快照并将其写入 WAL,无须等待后台写入器或检查点进程记录快照。这对备用服务器上的逻辑解码很有用,因为创建逻辑复制槽必须等待此类记录在备用服务器上重放。 |
9.28.6. 复制管理函数 #
表 9.101 中展示的函数用于控制以及与复制特性交互。有关底层特性的信息请见第 26.2.5 节、第 26.2.6 节以及第 48 章。默认只允许超级用户使用复制源的函数,但可以通过 GRANT 命令允许其他用户使用。复制槽的函数只限于超级用户和拥有 REPLICATION 权限的用户。
很多这些函数在复制协议中都有等价的命令,见第 54.4 节。
第 9.28.3 节、第 9.28.4 节和第 9.28.5 节中描述的函数也与复制相关。
表 9.101. 复制管理函数
函数 描述 |
|---|
创建名为 |
删除名为 |
创建一个名为 |
将一个名为 |
复制一个名为 |
返回槽 |
行为就像 |
行为就像 |
行为就像 |
推进名为 |
用给定的外部名称创建一个复制源,并且返回分配给它的内部 ID。该名称长度不得超过 512 字节。 |
删除一个以前创建的复制源,包括任何相关的重放进度。 |
通过名称查找复制源并返回其内部 ID。如果未找到这样的复制源,则返回 |
将当前会话标记为从给定的复制源重放,从而允许跟踪重放进度。只能在当前没有选择复制源时使用。使用 |
取消 |
如果在当前会话中选择了复制源则返回真。 |
返回当前会话中选择的复制源的重放位置。参数 |
将当前事务标记为重放在给定 LSN 和时间戳上提交的事务。只能在使用 |
取消 |
将给定节点的复制进度设置为给定的位置。这主要用于设置初始位置,或在配置更改或类似的变更后设置新位置。请注意这个函数的不当使用可能会导致不一致的复制数据。 |
返回给定复制源的重放位置。参数 |
发出逻辑解码消息。这可用于通过 WAL 向逻辑解码插件传递通用消息。 |
将逻辑故障切换复制槽从主库同步到备库。此函数只能在备库上执行。临时同步的槽(如果有)不能用于逻辑解码,必须在提升后删除。详见第 47.2.3 节。请注意,此函数主要用于测试和调试目的,应谨慎使用。此外,如果 小心
如果在执行该函数后,备库上禁用了 |
9.28.7. 数据库对象管理函数 #
表 9.102 中所示的函数计算数据库对象的磁盘空间使用情况,或帮助展示或理解磁盘空间使用量的计算结果。bigint 结果以字节为单位。如果将不代表已有对象的 OID 传递给这些函数之一,则返回 NULL。
表 9.102. 数据库对象尺寸函数
函数 描述 |
|---|
显示用于存储任何单个数据值的字节数。如果直接应用于表的列值,则反映所做的任何压缩。 |
显示用于压缩单个变长值的压缩算法。如果值没有被压缩,则返回 |
显示磁盘上经过 TOAST 处理的值的 |
计算具有指定名称或 OID 的数据库使用的总磁盘空间。要使用此函数,您必须对指定数据库具有 |
计算附加到指定表的索引所使用的总磁盘空间。 |
计算指定关系的一个“分支”所使用的磁盘空间。(注意在大多数情况下,使用更高级的函数
|
将人类可读格式的大小(由 |
将字节大小转换为更易于人类阅读的格式,带有大小单位(字节,kB,MB,GB,TB 或 PB)。请注意,单位是 2 的幂,而不是 10 的幂,因此 1kB 是 1024 字节,1MB 是 10242 = 1048576 字节,依此类推。 |
计算指定表所使用的磁盘空间,不包括索引(但包括其 TOAST 表(如有)、空闲空间映射和可见性映射)。 |
计算具有指定名称或 OID 的表空间中使用的总磁盘空间。要使用此函数,您必须对指定的表空间具有 |
计算指定表所使用的总磁盘空间,包括所有索引和 TOAST 数据。结果等价于 |
上述操作表和索引的函数接受一个 regclass 参数,即该表或索引在 pg_class 系统目录中的 OID。不必手工查找该 OID,因为 regclass 数据类型的输入转换器会代为查找。详见第 8.19 节。
表 9.103 中展示的函数帮助标识数据库对象相关的磁盘文件。
表 9.103. 数据库对象位置函数
函数 描述 |
|---|
返回当前分配给指定关系的“文件节点”编号。文件节点是关系所用文件名的基本组成部分(更多信息见第 66.1 节)。对于大多数关系,结果与
|
返回关系的完整文件路径名称(相对于数据库集簇的数据目录,即 |
根据关系所在表空间的 OID 和文件节点返回该关系的 OID。这本质上是 |
表 9.104 列出用于管理排序规则的函数。
表 9.104. 排序规则管理函数
函数 描述 |
|---|
返回当前安装在操作系统中的该排序规则对象的实际版本。如果这个版本与 |
返回数据库当前在操作系统中安装的排序规则的实际版本。如果这与 |
根据操作系统中找到的所有区域设置,向系统目录 |
表 9.105 列出用于操纵统计信息的函数。这些函数不能在恢复期间执行。
警告
由这些统计信息操纵函数所做的更改可能会被 autovacuum(或手动
VACUUM 或 ANALYZE)覆盖,应视为临时性的。
表 9.105. 数据库对象统计信息操纵函数
函数 描述 |
|---|
更新表级统计信息。通常这些统计信息会自动收集或作为 VACUUM 或 ANALYZE 的一部分更新,因此不必调用此函数。但它在恢复后很有用,可以在尚未运行
被跟踪的统计信息可能因版本而异,所以参数以 SELECT pg_restore_relation_stats(
'
例如,要设置表 SELECT pg_restore_relation_stats(
'schemaname', 'myschema',
'relname', 'mytable',
'relpages', 173::integer,
'reltuples', 10000::real);
参数
此外,此函数还接受名为
次要错误会以
调用者必须对该表拥有 |
|
清除给定关系的表级统计信息,就像该表是新创建的一样。
调用者必须对该表拥有 |
创建或更新列级统计信息。通常这些统计信息会自动收集或作为 VACUUM 或 ANALYZE 的一部分更新,因此不必调用此函数。但它在恢复后很有用,可以在尚未运行
被跟踪的统计信息可能因版本而异,所以参数以 SELECT pg_restore_attribute_stats(
'
例如,要设置表 SELECT pg_restore_attribute_stats(
'schemaname', 'myschema',
'relname', 'mytable',
'attname', 'col1',
'inherited', false,
'avg_width', 125::integer,
'null_frac', 0.5::real);
必需的参数包括:
此外,此函数还接受名为
次要错误会以
调用者必须对该表拥有 |
|
清除给定关系和属性的列级统计信息,就像该表是新创建的一样。
调用者必须对该表拥有 |
表 9.106 列出提供有关分区表结构信息的函数。
表 9.106. 分区信息函数
例如,要检查分区表 measurement 中包含的数据的总大小,可以使用以下查询:
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
FROM pg_partition_tree('measurement');
9.28.8. 索引维护函数 #
表 9.107 显示了索引维护任务可以使用的函数。(注意,这些维护任务通常由 autovacuum 自动完成;只有在特殊情况下才需要使用这些函数。)这些函数在恢复过程中无法执行。这些函数的使用局限于超级用户和给定索引的所有者。
表 9.107. 索引维护函数
函数 描述 |
|---|
扫描指定的 BRIN 索引以查找基表中当前尚未生成索引摘要的页面范围;对于任何这样的范围,它都通过扫描这些表页来创建一个新的摘要索引元组。返回插入到索引中的新页面范围摘要的数量。 |
对覆盖给定块的页面范围执行摘要(如果尚未摘要)。这类似于 |
如果存在涵盖指定表块的页面范围摘要,则删除对应的 BRIN 索引元组。 |
将指定 GIN 索引的“待处理”列表中的条目批量移入主 GIN 数据结构,从而清理该列表。返回从待处理列表中移除的页数。如果参数是禁用 |
9.28.9. 通用文件访问函数 #
表 9.108 中展示的函数提供了对数据库服务器所在机器上的文件的本地访问。只能访问数据库集簇目录以及 log_directory 中的文件,除非用户是超级用户或者被授予了角色 pg_read_server_files。使用相对路径访问集簇目录里面的文件,并使用匹配 log_directory 配置设置的路径访问日志文件。
注意,向用户授予 pg_read_file() 或相关函数的 EXECUTE 权限,会使其能够读取服务器上数据库服务器进程能读取的任何文件;这些函数会绕过数据库内部的所有权限检查。例如,具有这种访问权限的用户能够读取存储认证信息的 pg_authid 表的内容,以及数据库中的任何表数据。因此,授予这些函数的访问权限时应仔细考虑。
授予这些函数的权限时,请注意:表中列出可选参数的条目,大多由多个参数列表不同的实际函数实现。若要使用其中某个函数,就必须单独授予该函数的权限。psql 的\df 命令可以帮助检查实际的函数签名。
这些函数中的一些函数接受可选的 missing_ok 参数,用于指定文件或目录不存在时的行为。如果为 true,函数会视情况返回 NULL 或空结果集。如果为 false,则会报错。(除“文件未找到”之外的失败情况,在任何情况下都会报错。)默认为 false。
表 9.108. 通用文件访问函数
9.28.10. 咨询锁函数 #
表 9.109 中展示的函数管理咨询锁。有关正确使用这些函数的细节请参考第 13.3.5 节。
这些函数用于锁定应用程序定义的资源;资源可用一个 64 位键值或两个 32 位键值标识(这两个键空间互不重叠)。如果另一个会话已对同一资源标识符持有冲突锁,函数会根据自身的行为等待资源可用,或返回 false。锁可以是共享的或排他的:共享锁不会与同一资源上的其他共享锁冲突,只会与排他锁冲突。锁可以在会话级获取(一直保持到释放或会话结束),也可以在事务级获取(一直保持到当前事务结束,不能手动释放)。多次会话级锁请求会累加,因此,如果同一资源标识符被锁定三次,就必须请求解锁三次,才能在会话结束前释放该资源。
表 9.109. 咨询锁函数
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.