9.27。系统管理函数#
- 9.27.1。配置设置函数
- 9.27.2。服务器信号函数
- 9.27.3。备份控制函数
- 9.27.4。恢复控制函数
- 9.27.5。快照同步函数
- 9.27.6。复制管理函数
- 9.27.7。数据库对象管理函数
- 9.27.8。索引维护函数
- 9.27.9。通用文件访问函数
- 9.27.10。咨询锁函数
本节中描述的函数用于控制和监视PostgreSQL安装。
9.27.1。配置设置函数#
表 9.89显示了可用于查询和更改运行时配置参数的函数。
表 9.89。配置设置函数
函数 说明 示例 |
---|
返回设置
|
将参数
|
9.27.2。服务器信号函数#
在表 9.90中显示的函数向其他服务器进程发送控制信号。默认情况下,只有超级用户才能使用这些函数,但可以使用GRANT
授予其他人访问权限,但有例外情况。
如果信号已成功发送,则这些函数中的每个函数将返回true
,如果发送信号失败,则返回false
。
表 9.90。服务器信号函数
函数 说明 |
---|
取消后台进程具有指定进程 ID 的会话的当前查询。如果调用角色是其后台正在取消的角色的成员,或者调用角色具有 |
请求记录具有指定进程 ID 的后台的内存上下文。此函数可以将请求发送到后台和辅助进程(记录器除外)。这些内存上下文将记录在 |
导致 PostgreSQL 服务器的所有进程重新加载其配置文件。(这是通过向 postmaster 进程发送 SIGHUP 信号来启动的,postmaster 进程又向其每个子进程发送 SIGHUP。)在重新加载之前,可以使用 |
向日志文件管理器发出信号,立即切换到新的输出文件。这仅在内置日志收集器正在运行时才有效,因为否则没有日志文件管理器子进程。 |
终止具有指定进程 ID 的后端进程的会话。如果调用角色是正在终止的后端的角色的成员,或者调用角色具有 如果未指定 |
pg_cancel_backend
和pg_terminate_backend
向由进程 ID 标识的后端进程发送信号(分别为SIGINT或SIGTERM)。可以在pg_stat_activity
视图的pid
列中找到活动后端的进程 ID,或通过列出服务器上的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.27.3. 备份控制函数#
表 9.91中显示的函数有助于进行在线备份。这些函数不能在恢复期间执行(pg_backup_start
、pg_backup_stop
和pg_wal_lsn_diff
除外)。
有关正确使用这些函数的详细信息,请参见第 26.3 节。
表 9.91. 备份控制函数
函数 说明 |
---|
在预写日志中创建一个命名的标记记录,该记录稍后可用作恢复目标,并返回相应的预写日志位置。然后,可以在 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.27.4. 恢复控制函数#
表 9.92中显示的函数提供有关备用服务器当前状态的信息。这些函数可以在恢复期间和正常运行期间执行。
表 9.92. 恢复信息函数
在表 9.93中显示的函数控制恢复的进度。这些函数只能在恢复期间执行。
表 9.93。恢复控制函数
pg_wal_replay_pause
和pg_wal_replay_resume
在提升正在进行时无法执行。如果在恢复暂停时触发提升,则暂停状态结束且提升继续。
如果已禁用流复制,则暂停状态可能会无限期地持续下去而不会出现问题。如果流复制正在进行中,则将继续接收 WAL 记录,这最终将填满可用磁盘空间,具体取决于暂停的持续时间、WAL 生成的速率和可用磁盘空间。
9.27.5 快照同步函数#
PostgreSQL允许数据库会话同步其快照。快照确定使用该快照的事务可见哪些数据。当两个或更多会话需要在数据库中看到相同内容时,需要同步快照。如果两个会话只是独立地启动其事务,则在执行这两个START TRANSACTION
命令之间,总有可能有第三个事务提交,因此一个会话会看到该事务的效果,而另一个会话则不会。
为了解决此问题,PostgreSQL允许事务导出其正在使用的快照。只要导出事务保持打开状态,其他事务就可以导入其快照,从而保证它们看到的数据库视图与第一个事务看到的完全相同。但请注意,这些事务中的任何一个所做的任何数据库更改对于其他事务仍然不可见,这与未提交事务所做的更改通常一样。因此,事务相对于预先存在的数据是同步的,但对于它们自己所做的更改则正常执行。
快照使用pg_export_snapshot
函数导出,该函数在表 9.94中显示,并使用SET TRANSACTION命令导入。
表 9.94。快照同步函数
函数 说明 |
---|
保存事务的当前快照,并返回一个标识该快照的 如果需要,一个事务可以导出多个快照。请注意,这样做仅在 |
对正在运行的事务进行快照,并将其写入 WAL,而无需等待 bgwriter 或检查点记录一个。这对于备用上的逻辑解码很有用,因为逻辑槽的创建必须等到此类记录在备用上重放。 |
9.27.6。复制管理函数#
在表 9.95中显示的函数用于控制和与复制功能交互。有关底层功能的信息,请参见第 27.2.5 节、第 27.2.6 节和第 50 章。默认情况下,只有超级用户才能使用复制源函数,但可以使用GRANT
命令允许其他用户使用。复制槽函数的使用仅限于超级用户和具有REPLICATION
权限的用户。
这些函数中的许多函数在复制协议中具有等效命令;请参阅第 55.4 节。
第 9.27.3 节、第 9.27.4 节和第 9.27.5 节中描述的函数也与复制相关。
表 9.95. 复制管理函数
函数 说明 |
---|
创建一个名为 |
删除名为 |
使用输出插件 |
将名为 |
将名为 |
返回槽 |
行为与 |
行为与 |
行为与 |
推进名为 |
创建一个具有给定外部名称的复制源,并返回分配给它的内部 ID。 |
删除先前创建的复制源,包括任何关联的重播进度。 |
按名称查找复制源并返回内部 ID。如果找不到此类复制源,则返回 |
将当前会话标记为从给定源重播,允许跟踪重播进度。仅当当前未选择任何源时才能使用。使用 |
取消 |
如果在当前会话中已选择复制源,则返回 true。 |
返回当前会话中选择的复制源的重放位置。参数 |
将当前事务标记为重放已在给定 和时间戳提交的事务。仅当已使用 |
取消 |
将给定节点的复制进度设置为给定位置。这主要用于设置初始位置,或在配置更改等操作后设置新位置。请注意,不当使用此函数会导致数据复制不一致。 |
返回给定复制源的重放位置。参数 |
发出逻辑解码消息。这可用于通过 WAL 向逻辑解码插件传递通用消息。 |
9.27.7. 数据库对象管理函数#
表 9.96中显示的函数计算数据库对象磁盘空间使用情况,或帮助呈现或理解使用情况结果。bigint
结果以字节为单位进行测量。如果将不表示现有对象的 OID 传递给其中一个函数,则返回NULL
。
表 9.96。数据库对象大小函数
上面对表或索引进行操作的函数接受regclass
参数,它只是pg_class
系统目录中表或索引的 OID。但是,您不必手动查找 OID,因为regclass
数据类型的输入转换器将为您完成这项工作。有关详细信息,请参见第 8.19 节。
表 9.97中显示的函数有助于识别与数据库对象关联的特定磁盘文件。
表 9.97. 数据库对象位置函数
函数 说明 |
---|
返回当前分配给指定关系的 “filenode” 号码。filenode 是用于关系的文件名的基本组件(有关更多信息,请参见 第 73.1 节)。对于大多数关系,结果与 |
返回关系的整个文件路径名(相对于数据库集群的数据目录 |
返回给定表空间 OID 和其存储的文件节点的关系的 OID。这本质上是 |
表 9.98列出了用于管理整理规则的函数。
表 9.98。整理规则管理函数
函数 说明 |
---|
返回整理规则对象在操作系统中当前安装的实际版本。如果这与 |
返回数据库整理规则在操作系统中当前安装的实际版本。如果这与 |
根据操作系统中找到的所有语言环境,将对照添加到系统目录 |
表 9.99列出了提供有关分区表结构的信息的函数。
表 9.99. 分区信息函数
例如,要检查分区表measurement
中包含的数据的总大小,可以使用以下查询
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
FROM pg_partition_tree('measurement');
9.27.8. 索引维护函数#
表 9.100显示了可用于索引维护任务的函数。(请注意,这些维护任务通常由自动清理程序自动完成;仅在特殊情况下才需要使用这些函数。)这些函数不能在恢复期间执行。这些函数的使用仅限于超级用户和给定索引的所有者。
表 9.100. 索引维护函数
函数 说明 |
---|
扫描指定的 BRIN 索引以查找基本表中当前未由索引总结的页面范围;对于任何此类范围,它通过扫描那些表页面来创建一个新的总结索引元组。返回插入到索引中的新页面范围总结的数量。 |
总结覆盖给定块的页面范围(如果尚未总结)。这类似于 |
如果存在,则删除总结覆盖给定表块的页面范围的 BRIN 索引元组。 |
清理指定 GIN 索引的 “待处理” 列表,将其中的条目批量移动到 GIN 主数据结构中。返回从待处理列表中移除的页数。如果参数是使用禁用了 |
9.27.9. 通用文件访问函数#
在表 9.101中显示的函数提供对托管服务器的机器上的文件的本机访问。除非用户是超级用户或被授予pg_read_server_files
角色,否则只能访问数据库集群目录和log_directory
中的文件。对集群目录中的文件使用相对路径,对日志文件使用与log_directory
配置设置匹配的路径。
请注意,向用户授予对pg_read_file()
或相关函数的 EXECUTE 权限,允许他们读取数据库服务器进程可以读取的服务器上的任何文件;这些函数绕过了所有数据库内权限检查。这意味着,例如,具有此类访问权限的用户能够读取存储身份验证信息的pg_authid
表的内容,以及读取数据库中的任何表数据。因此,应仔细考虑授予对这些函数的访问权限。
在授予对这些函数的权限时,请注意,显示可选参数的表条目主要作为具有不同参数列表的多个物理函数实现。如果要使用此类函数,则必须分别授予每个函数的权限。psql的\df
命令可用于检查实际函数签名。
其中一些函数采用可选的*missing_ok
*参数,该参数指定文件或目录不存在时的行为。如果为true
,则该函数将返回NULL
或空结果集(视情况而定)。如果为false
,则会引发错误。(无论如何,都会将“文件未找到”以外的故障条件报告为错误。)默认值为false
。
表 9.101. 通用文件访问函数
9.27.10. 咨询锁功能#
在表 9.102中显示的功能管理咨询锁。有关这些功能的正确使用详细信息,请参阅第 13.3.5 节。
所有这些功能都旨在用于锁定应用程序定义的资源,这些资源可以通过单个 64 位键值或两个 32 位键值来标识(请注意,这两个键空间不重叠)。如果另一个会话已对同一资源标识符持有冲突锁,则这些功能将等待资源可用,或返回false
结果,具体取决于该功能。锁可以是共享的或独占的:共享锁不会与同一资源上的其他共享锁冲突,只会与独占锁冲突。锁可以在会话级别(以便在释放或会话结束之前一直持有)或在事务级别(以便在当前事务结束之前一直持有;没有手动释放的规定)进行获取。多个会话级锁请求堆叠,因此如果同一资源标识符被锁定了三次,则必须有三个解锁请求才能在会话结束之前释放资源。
表 9.102. 咨询锁功能