PostgreSQL 在命令执行期间具有报告某些命令的进度的功能。目前,唯一支持进度报告的命令是 ANALYZE
、CLUSTER
、CREATE INDEX
、VACUUM
、COPY
和 BASE_BACKUP(即 pg_basebackup 发出以进行基础备份的复制命令)。此功能今后有可能会得到扩展。
每当 ANALYZE
正在运行时,pg_stat_progress_analyze
视图将包含当前正在运行该命令的每个后端的行。下表描述将报告的信息,并提供有关如何解读这些信息的信息。
表 27.38. pg_stat_progress_analyze
视图
列类型 说明 |
---|
后端的进程 ID。 |
此后端连接的数据库的 OID。 |
此后端连接的数据库的名称。 |
正在分析的表的 OID。 |
当前处理阶段。请参阅 表 27.39。 |
将采样的堆块总数。 |
已扫描的堆块数。 |
扩展统计信息的数量。 |
已计算的扩展统计信息的数量。此计数器仅在阶段为 |
子表数。 |
已扫描的子表数。此计数器仅在阶段为 |
正在扫描的子表的 OID。此字段仅在阶段为 |
表 27.39. ANALYZE 阶段
阶段 | 说明 |
---|---|
initializing |
该命令正在准备开始扫描堆。此阶段预计将非常短暂。 |
acquiring sample rows |
该命令当前正在扫描 relid 给出的表,以获取样本行。 |
acquiring inherited sample rows |
该命令当前正在扫描子表,以获取样本行。列 child_tables_total 、child_tables_done 和 current_child_table_relid 包含此阶段的进度信息。 |
computing statistics |
该命令正在计算从表扫描期间获取的样本行的统计信息。 |
计算扩展统计信息 |
该命令正在从表扫描期间获取的示例行中计算扩展统计信息。 |
完成分析 |
该命令正在更新 pg_class 。当此阶段完成后,ANALYZE 将结束。 |
请注意,当对分区表运行 ANALYZE
时,其所有分区都将递归分析。在这种情况下,首先报告父表的 ANALYZE
进度,收集其继承统计信息,然后再报告每个分区的进度。
每当 CLUSTER
或 VACUUM FULL
正在运行时,pg_stat_progress_cluster
视图将包含一行,用于当前运行任一命令的每个后端。下表描述了将报告的信息,并提供了有关如何解释该信息的说明。
表 27.40. pg_stat_progress_cluster
视图
列类型 说明 |
---|
后端的进程 ID。 |
此后端连接的数据库的 OID。 |
此后端连接的数据库的名称。 |
正在群集的表的 OID。 |
正在运行的命令。要么是 |
当前处理阶段。请参见 表 27.41。 |
如果正在使用索引扫描表,这是正在使用的索引的 OID;否则为零。 |
扫描的堆元组数。此计数器仅在阶段为 |
写入的堆元组数。此计数器仅在阶段为 |
表中的堆块总数。此数字报告自 |
扫描的堆块数。此计数器仅在阶段为 |
已重建索引数。此计数器仅在阶段为 |
表 27.41。CLUSTER 和 VACUUM FULL 阶段
阶段 | 说明 |
---|---|
initializing |
该命令正在准备开始扫描堆。此阶段预计将非常短暂。 |
seq scanning heap |
该命令当前使用顺序扫描扫描表格。 |
index scanning heap |
CLUSTER 当前使用索引扫描扫描表格。 |
sorting tuples |
CLUSTER 当前正在对元组进行排序。 |
writing new heap |
CLUSTER 当前正在写入新的堆。 |
swapping relation files |
该命令当前正在将新构建的文件交换就位。 |
rebuilding index |
该命令当前正在重建索引。 |
performing final cleanup |
该命令正在执行最终清理。在该阶段完成时,CLUSTER 或 VACUUM FULL 将结束。 |
只要 COPY
正在运行,pg_stat_progress_copy
视图将包含一行用于当前正在运行 COPY
命令的每个后端。下表描述了将报告的信息,并提供了如何解释该信息的说明。
表 27.42。 pg_stat_progress_copy
视图
列类型 说明 |
---|
后端的进程 ID。 |
此后端连接的数据库的 OID。 |
此后端连接的数据库的名称。 |
执行 |
正在运行的命令: |
从其读取或写入数据的 I/O 类型: |
|
|
|
由于被 |
由于包含格式错误的数据而被跳过的元组数。此计数器仅在向 |
只要 CREATE INDEX
或 REINDEX
正在运行,pg_stat_progress_create_index
视图都将针对当前正在创建索引的每个后端包含一行。下表描述了将报告的信息,并提供有关如何解释这些信息的信息。
表 27.43. pg_stat_progress_create_index
视图
列类型 说明 |
---|
正在创建索引的后端的进程 ID。 |
此后端连接的数据库的 OID。 |
此后端连接的数据库的名称。 |
正在创建索引的表的 OID。 |
正在创建或重新索引的索引的 OID。在非并行 |
特定命令类型: |
索引创建的当前处理阶段。请参见 表 27.44。 |
在适用时,要等待的总锁定数。 |
已等待的锁定数。 |
当前正在等待的锁定者的进程 ID。 |
在当前阶段要处理的总块数。 |
在当前阶段已处理的块数。 |
在当前阶段要处理的总元组数。 |
在当前阶段已处理的元组数。 |
要在其上创建或附加索引的分区总数,包括直接和间接分区。在 |
已在其上创建或附加索引的分区数,包括直接和间接分区。在 |
表 27.44. CREATE INDEX 阶段
阶段 | 说明 |
---|---|
initializing |
创建索引 或 重建索引 正在准备创建索引。此阶段预计非常短。 |
在构建之前等待写入 |
并发创建索引 或 并发重建索引 正在等待可能会看到表的事务完成写锁操作。不在并发模式下时会跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
正在构建索引 |
索引正由特定于访问方式的代码构建。在此阶段,支持进度报告的访问方式会在自己的进度数据中填充数据,且子阶段在此列中表示。通常,blocks_total 和 blocks_done 将包含进度数据,以及可能是 tuples_total 和 tuples_done 。 |
在验证之前等待写入 |
并发创建索引 或 并发重建索引 正在等待可能会写表的事务完成写锁操作。不在并发模式下时会跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
索引验证:扫描索引 |
并发创建索引 正在扫描索引以查找需要验证的元组。不在并发模式下时会跳过此阶段。列 blocks_total (设置为索引的总大小)和 blocks_done 包含此阶段的进度信息。 |
索引验证:对元组进行排序 |
并发创建索引 正在对索引扫描阶段的输出进行排序。 |
索引验证:扫描表 |
并发创建索引 正在扫描表以验证在先前两个阶段收集的索引元组。不在并发模式下时会跳过此阶段。列 blocks_total (设置为表的总大小)和 blocks_done 包含此阶段的进度信息。 |
等待旧快照 |
并发创建索引 或 并发重建索引 正在等待可能会看到表的事务释放它们的快照。不在并发模式下时会跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
等待读者标记死索引 |
REINDEX CONCURRENTLY 正在等待表上读锁定的事务完成,然后标记旧索引为死索引。在非并发模式下,此阶段会被跳过。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
等待读者删除索引 |
REINDEX CONCURRENTLY 正在等待表上读锁定的事务完成,然后删除旧索引。在非并发模式下,此阶段会被跳过。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
只要 VACUUM
正在运行,pg_stat_progress_vacuum
视图就会针对每个后端(包括自动 VACUUM 工作进程)包含一行,这些后端当前正在执行 VACUUM。下表描述了将要报告的信息,并提供有关如何对其进行解释的信息。对于 VACUUM FULL
命令,可以通过 pg_stat_progress_cluster
报告其进度,因为 VACUUM FULL
和 CLUSTER
都重写表,而常规 VACUUM
仅就地修改表。请参阅 章节 27.4.2。
表 27.45. pg_stat_progress_vacuum
视图
列类型 说明 |
---|
后端的进程 ID。 |
此后端连接的数据库的 OID。 |
此后端连接的数据库的名称。 |
正在执行 VACUUM 的表的 OID。 |
当前处理的 VACUUM 阶段。请参阅 表 27.46。 |
表中堆块的总数。此数字报告自扫描开始时的数字;稍后添加的块不会(也不需要)被此 |
扫描的堆块数。因为使用 可见性映射 来优化扫描,所以某些块不会被检查直接跳过;跳过的块包含在此总数中,因此当 VACUUM 完成后,此数字最终将等于 |
已清除的堆块数量。除非表没有索引,否则只有在阶段是 |
已完成的索引清除周期数量。 |
在需要执行索引清除周期之前可以存储的死元组数据量,基于 maintenance_work_mem。 |
上个索引 vacuum 周期以来收集的死元组数。 |
上个索引 vacuum 周期以来收集的死项目标识符数。 |
将要执行 vacuum 或清理操作的索引总数。这个数在 |
已处理的索引数。此计数器仅在阶段为 |
表 27.46。VACUUM 阶段
阶段 | 说明 |
---|---|
initializing |
VACUUM 准备开始扫描堆。此阶段预计非常短暂。 |
scanning heap |
VACUUM 当前正在扫描堆。如果需要,它会裁剪并整理每个页面,并可能执行冻结活动。使用 heap_blks_scanned 列可以监控扫描的进度。 |
vacuuming indexes |
VACUUM 当前正在对索引执行 vacuum 操作。如果一张表具有任何索引,此操作会在堆完全扫描完毕后执行至少一次。如果 maintenance_work_mem(或者在 autovacuum 的情况下,如果已设置,则为 autovacuum_work_mem)不足以存储发现的死元组数量,则每执行一次 vacuum 可能会执行多次此操作。 |
vacuuming heap |
VACUUM 当前正在对堆执行 vacuum 操作。对堆执行 vacuum 操作与扫描堆不同,且在每次对索引执行 vacuum 操作之后都会执行。如果 heap_blks_scanned 小于 heap_blks_total ,则系统会在此阶段完成后返回到扫描堆;否则,系统会在此阶段完成后开始清理索引。 |
cleaning up indexes |
VACUUM 当前正在清理索引。此操作在堆完全扫描完毕且对索引和堆的所有 vacuum 操作都已完成后执行。 |
truncating heap |
VACUUM 当前正在对堆进行截断操作,以便在关系末尾为操作系统返回空页面。此操作在清理索引之后执行。 |
performing final cleanup |
VACUUM 正在执行最后的清理。在此阶段,VACUUM 会清理空闲空间映射,更新 pg_class 的统计数据,并将统计数据报告到累积统计数据系统。此阶段完成后,VACUUM 将结束。 |
当 pg_basebackup 等应用程序执行基准备份时,pg_stat_progress_basebackup
视图会为当前运行 BASE_BACKUP
复制命令并串流备份的每个 WAL 发送器进程包含一行数据。下表介绍将报告的信息,并提供如何解释该信息的详细信息。
表 27.47. pg_stat_progress_basebackup
视图
列类型 说明 |
---|
WAL 发送器进程的进程 ID。 |
当前处理阶段。请参见 表 27.48。 |
将要串流的数据总量。根据 |
串流的数据量。当阶段为 |
将要串流的表空间总数。 |
已串流的表空间数。当阶段为 |
表 27.48. 基准备份阶段
阶段 | 说明 |
---|---|
initializing |
WAL 发送器进程准备开始备份。预计此阶段非常短暂。 |
等待检查点完成 |
WAL 发送器进程当前正在执行 pg_backup_start 以准备执行基准备份,并等待开始备份检查点完成。 |
估算备份大小 |
WAL 发送器进程当前正在估算作为基准备份要串流的数据库文件总量。 |
串流数据库文件 |
WAL 发送器进程当前正在作为基准备份串流数据库文件。 |
等待 WAL 归档完成 |
WAL 发送器进程当前正在执行 pg_backup_stop 以完成备份,并正在等待为基本备份所需的全部 WAL 文件成功归档。如果在 pg_basebackup 中指定 --wal-method=none 或 --wal-method=stream ,备份将在此阶段完成后结束。 |
传输 WAL 文件 |
WAL 发送器进程目前正在传输备份期间生成的所有 WAL 日志。如果在 pg_basebackup 中指定 --wal-method=fetch ,此阶段会在 正在等待 WAL 归档结束 阶段之后发生。备份将在此阶段完成后结束。 |