本节描述的函数用于控制和监视 PostgreSQL 安装。
表 9.93 显示了可用于查询和更改运行时配置参数的函数。
表 9.93. 配置设置函数
函数 描述 示例 |
---|
返回设置
|
将参数
|
表 9.94 中显示的函数向其他服务器进程发送控制信号。默认情况下,只有超级用户才能使用这些函数,但可以使用 GRANT
将访问权限授予其他人,但有明确的例外。
如果信号发送成功,则每个函数都返回 true
,如果发送信号失败,则返回 false
。
表 9.94. 服务器信号函数
函数 描述 |
---|
取消后端进程具有指定进程 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: 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. 备份控制函数
函数 描述 |
---|
在预写式日志中创建一个已命名的标记记录,该记录稍后可用作恢复目标,并返回相应的预写式日志位置。给定的名称随后可与 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
对于计算LSN从文件偏移量和 WAL 文件名中,例如:
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. 恢复信息函数
表 9.97 中所示的函数控制恢复的进度。这些函数只能在恢复期间执行。
表 9.97. 恢复控制函数
在升级正在进行时,无法执行 pg_wal_replay_pause
和 pg_wal_replay_resume
。如果在恢复暂停时触发升级,则暂停状态将结束并且升级将继续。
如果禁用流复制,则暂停状态可能会无限期地持续下去,而不会出现问题。如果流复制正在进行中,则将继续接收 WAL 记录,这将最终填满可用的磁盘空间,具体取决于暂停的持续时间、WAL 生成速率和可用的磁盘空间。
PostgreSQL 允许数据库会话同步其快照。快照 确定使用该快照的事务可以看到哪些数据。当两个或多个会话需要查看数据库中的相同内容时,需要同步快照。如果两个会话只是独立启动其事务,则总是有可能在两个 START TRANSACTION
命令的执行之间提交某些第三个事务,因此一个会话看到该事务的效果,而另一个会话看不到。
为了解决这个问题,PostgreSQL 允许事务导出其正在使用的快照。只要导出事务保持打开状态,其他事务就可以导入其快照,从而保证它们看到与第一个事务完全相同的数据库视图。但请注意,任何这些事务所做的任何数据库更改对其他事务仍然不可见,这与未提交事务进行的更改通常一样。因此,这些事务在预先存在的数据方面是同步的,但对于它们自己所做的更改则正常运行。
快照使用 表 9.98 中显示的 pg_export_snapshot
函数导出,并使用 SET TRANSACTION 命令导入。
表 9.98. 快照同步函数
函数 描述 |
---|
保存事务的当前快照,并返回一个 如果需要,一个事务可以导出多个快照。请注意,这样做仅在 |
获取正在运行的事务的快照并将其写入 WAL,而无需等待后台写入程序或检查点程序记录。这对于备用服务器上的逻辑解码非常有用,因为逻辑槽的创建必须等到在备用服务器上重放该记录后才能进行。 |
表 9.99 中所示的函数用于控制复制功能并与之交互。有关底层功能的信息,请参阅 第 26.2.5 节、第 26.2.6 节和 第 48 章。默认情况下,仅超级用户允许使用复制源的函数,但可以通过使用 GRANT
命令允许其他用户使用。复制槽的函数的使用仅限于超级用户和具有 REPLICATION
特权的用户。
这些函数中的许多函数在复制协议中具有等效的命令;请参阅 第 53.4 节。
第 9.28.3 节、第 9.28.4 节和 第 9.28.5 节中描述的函数也与复制相关。
表 9.99. 复制管理函数
函数 描述 |
---|
创建一个名为 |
删除名为 |
使用输出插件 |
将一个现有的名为 |
将一个现有的名为 |
返回槽 |
行为与 |
行为与 |
行为与 |
推进名为 |
使用给定的外部名称创建一个复制源,并返回分配给它的内部 ID。 |
删除先前创建的复制源,包括任何关联的重放进度。 |
按名称查找复制源并返回内部 ID。如果未找到此类复制源,则返回 |
将当前会话标记为从给定的源重放,允许跟踪重放进度。仅当当前未选择源时才能使用。使用 |
取消 |
如果当前会话中已选择复制源,则返回 true。 |
返回当前会话中选择的复制源的重放位置。参数 |
将当前事务标记为重放已在给定的LSN位置和时间戳提交的事务。仅当使用 |
取消 |
将给定节点的复制进度设置为给定位置。这主要用于设置初始位置,或在配置更改后设置新位置等。请注意,不小心使用此函数可能会导致复制的数据不一致。 |
返回给定复制源的重放位置。参数 |
发出一个逻辑解码消息。 这可以用于通过 WAL 向逻辑解码插件传递通用消息。 |
将主服务器的逻辑故障转移复制槽同步到备用服务器。 此函数只能在备用服务器上执行。 临时的同步槽(如果有)不能用于逻辑解码,并且必须在升级后删除。 有关详细信息,请参阅 第 47.2.3 节。 请注意,如果启用了 警告如果在执行该函数后,备用服务器上禁用了 |
表 9.100 中显示的函数计算数据库对象的磁盘空间使用情况,或协助显示或理解使用结果。 bigint
结果以字节为单位进行度量。 如果将不代表现有对象的 OID 传递给其中一个函数,则返回 NULL
。
表 9.100. 数据库对象大小函数
函数 描述 |
---|
显示用于存储任何单个数据值的字节数。 如果直接应用于表列值,则反映已完成的任何压缩。 |
显示用于压缩单个可变长度值的压缩算法。 如果值未压缩,则返回 |
显示磁盘上的 |
计算具有指定名称或 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.101 中显示的函数有助于识别与数据库对象关联的特定磁盘文件。
表 9.101. 数据库对象位置函数
函数 描述 |
---|
返回当前分配给指定关系的“filenode”编号。 filenode 是用于关系的 文件名的基本组件(有关更多信息,请参阅第 65.1 节)。 对于大多数关系,结果与 |
返回关系的整个文件路径名(相对于数据库集群的数据目录 |
返回在表空间 OID 和 filenode 下存储的关系的 OID。 这基本上是 |
表 9.102 列出了用于管理排序规则的函数。
表 9.102. 排序规则管理函数
函数 描述 |
---|
返回排序规则对象的实际版本,该版本是当前安装在操作系统中的版本。如果此版本与 |
返回数据库排序规则的实际版本,该版本是当前安装在操作系统中的版本。如果此版本与 |
根据在操作系统中找到的所有区域设置,向系统目录 |
表 9.103 列出了提供有关分区表结构的函数。
表 9.103. 分区信息函数
例如,要检查分区表 measurement
中包含的数据的总大小,可以使用以下查询
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size FROM pg_partition_tree('measurement');
表 9.104 显示了可用于索引维护任务的函数。(请注意,这些维护任务通常由自动清理功能自动完成;仅在特殊情况下才需要使用这些函数。)这些函数不能在恢复期间执行。这些函数的使用仅限于超级用户和给定索引的所有者。
表 9.104. 索引维护函数
函数 描述 |
---|
扫描指定的 BRIN 索引,以查找索引当前未汇总的基本表中的页范围;对于任何此类范围,它会通过扫描这些表页来创建新的摘要索引元组。返回插入到索引中的新页范围摘要的数量。 |
如果尚未汇总,则汇总覆盖给定块的页范围。这类似于 |
如果存在,则删除汇总覆盖给定表块的页范围的 BRIN 索引元组。 |
通过将 “待处理” 列表中的条目批量移动到主 GIN 数据结构中,来清理指定 GIN 索引的 “待处理” 列表。返回从待处理列表中删除的页数。如果参数是使用禁用 |
表 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. 通用文件访问函数
表 9.106 中显示的函数用于管理咨询锁。有关正确使用这些函数的详细信息,请参见第 13.3.5 节。
所有这些函数都旨在用于锁定应用程序定义的资源,这些资源可以通过单个 64 位键值或两个 32 位键值来标识(请注意,这两个键空间不重叠)。如果另一个会话已在同一资源标识符上持有冲突的锁,则这些函数将等待直到资源可用,或者根据函数返回 false
结果。锁可以是共享锁或排它锁:共享锁不会与同一资源上的其他共享锁冲突,仅与排它锁冲突。锁可以在会话级别获取(因此它们会一直持有直到释放或会话结束),也可以在事务级别获取(因此它们会一直持有到当前事务结束;没有手动释放的规定)。多个会话级锁请求会堆叠,因此如果同一个资源标识符被锁定三次,则在会话结束之前必须有三个解锁请求来释放该资源。
表 9.106. 咨询锁函数
如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。