选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

27.4. 进度报告 #

PostgreSQL能够在某些命令执行期间报告其进度。目前,支持进度报告的命令只有ANALYZECLUSTERCREATE INDEXVACUUM以及BASE_BACKUP(即 pg_basebackup 用于创建基础备份的复制命令)。未来可能会扩展此功能。

27.4.1. ANALYZE 进度报告 #

每当ANALYZE运行时,pg_stat_progress_analyze视图将包含当前运行该命令的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它们的信息。

Table 27.32. pg_stat_progress_analyze 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

后端连接到的数据库的OID。

datname name

后端连接到的数据库的名称。

relid oid

被分析的表的OID。

phase text

当前处理阶段。参见 Table 27.33

sample_blks_total bigint

将被采样的堆块的总数。

sample_blks_scanned bigint

扫描的堆块数量。

ext_stats_total bigint

扩展统计信息的数量。

ext_stats_computed bigint

已经计算的扩展统计信息数量。此计数器仅在 computing extended statistics 阶段递增。

child_tables_total bigint

子表的数量。

child_tables_done bigint

扫描的子表数量。此计数器仅在acquiring inherited sample rows阶段递增。

current_child_table_relid oid

当前正在扫描的子表的OID。此字段仅在acquiring inherited sample rows时有效。


Table 27.33. ANALYZE 阶段

阶段 描述
initializing 命令正在准备开始扫描堆。这个阶段预计会非常短暂。
acquiring sample rows 该命令当前正在扫描relid给出的表以获得样例行。
acquiring inherited sample rows 该命令当前正在扫描子表以获得样例行。列child_tables_total,child_tables_done, 和current_child_table_relid包含此阶段的进度信息。
computing statistics 该命令从表扫描期间获得的样例行计算统计信息。
computing extended statistics 该命令从表扫描期间获得的样例行计算扩展统计信息。
finalizing analyze 该命令在更新pg_class。当此阶段完成时,ANALYZE 将结束。

Note

请注意,如ANALYZE中所述,在分区表上运行ANALYZE时, 也会递归分析其所有分区。在这种情况下,首先报告父表的ANALYZE进度, 此时收集其继承统计信息,随后报告各个分区的进度。

27.4.2. CREATE INDEX 进度报告 #

每当运行CREATE INDEXREINDEX时,pg_stat_progress_create_index视图将包含当前正在创建索引的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。

Table 27.34. pg_stat_progress_create_index 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

后端连接到的数据库的OID。

datname name

后端连接到的数据库的名称。

relid oid

正在创建索引的表的OID。

index_relid oid

正在创建或重建索引的OID。在非并发 CREATE INDEX的时候,此为 0。

command text

在运行的命令: CREATE INDEX,CREATE INDEX CONCURRENTLY, REINDEX, 或 REINDEX CONCURRENTLY.

phase text

索引创建的当前处理阶段。 参见 Table 27.35

lockers_total bigint

在适用的情况下,需要等待的储物柜总数

lockers_done bigint

已经等待的储物柜数量。

current_locker_pid bigint

目前正在等待的储物柜的进程ID。

blocks_total bigint

本阶段要处理的区块总数。

blocks_done bigint

当前阶段已经处理的区块数量。

tuples_total bigint

当前阶段要处理的元组总数。

tuples_done bigint

在当前阶段已经处理的元组数量。

partitions_total bigint

在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。

partitions_done bigint

当在分区表上创建索引时,该列被设置为在其上建立索引的分区数。


Table 27.35. CREATE INDEX 的阶段

阶段 描述
initializing CREATE INDEXREINDEX正在准备创建索引。 这个阶段预计会非常短暂。
waiting for writers before build CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待有可能看到表的写锁的事务完成。 当不在并发模式时,这个阶段会被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
building index 索引是由访问方法专用代码建立的。 在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。 通常情况下,blocks_totalblocks_done将包含进度数据,也可能包含tuples_totaltuples_done
waiting for writers before validation CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待有可能写入表的事务完成写锁的事务。当不在并发模式时,这个阶段会被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
index validation: scanning index CREATE INDEX CONCURRENTLY正在扫描索引,搜索需要验证的元组。如果不是并发模式,则会跳过此阶段。列 blocks_total(设为索引总大小)和 blocks_done 包含该阶段的进度信息。
index validation: sorting tuples CREATE INDEX CONCURRENTLY正在对索引扫描阶段的输出进行排序。
index validation: scanning table CREATE INDEX CONCURRENTLY正在扫描表,以验证前两个阶段收集的索引元组。如果不是并发模式,则会跳过此阶段。blocks_total 列(设为表总大小)和 blocks_done 列包含该阶段的进度信息。
waiting for old snapshots CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待可能看到表的事务释放快照。 当不处于并发模式时,这个阶段会被跳过。 lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
waiting for readers before marking dead REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
waiting for readers before dropping REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_totallockers_donecurrent_locker_pid包含了这个阶段的进度信息。

27.4.3. VACUUM 进度报告 #

只要VACUUM正在运行,pg_stat_progress_vacuum视图就会为每个当前正在清理的后端(包括自动清理工作进程)包含一行。下表描述了将报告的信息,并说明如何解释这些信息。VACUUM FULL命令的进度通过pg_stat_progress_cluster报告,因为VACUUM FULLCLUSTER都会重写表,而常规的VACUUM只会原地修改表。参见Section 27.4.4

Table 27.36. pg_stat_progress_vacuum 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

后端连接到的数据库的OID。

datname name

后端连接到的数据库的名称。

relid oid

被vacuum的表的OID。

phase text

vacuum的当前处理阶段。参见 Table 27.37

heap_blks_total bigint

该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个VACUUM访问。

heap_blks_scanned bigint

被扫描的堆块数量。由于可见性映射被用来优化扫描,一些块将被跳过而不做检查, 被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total。 仅当处于scanning heap阶段时这个计数器才会前进。

heap_blks_vacuumed bigint

被清理的堆块数量。除非表没有索引,这个计数器仅在处于vacuuming heap阶段时才会前进。 不包含死亡元组的块会被跳过,因此这个计数器可能有时会向前跳跃一个比较大的增量。

index_vacuum_count bigint

已完成的索引清理周期数。

max_dead_tuples bigint

在需要执行索引清理周期之前可存储的死亡元组数据量,取决于maintenance_work_mem

num_dead_tuples bigint

自上一个索引清理周期以来收集到的死亡元组数据量。


Table 27.37. VACUUM的阶段

阶段 描述
initializing VACUUM正在准备开始扫描堆。这个阶段应该很简短。
scanning heap VACUUM正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned列可以用来监控扫描的进度。
vacuuming indexes VACUUM当前正在清理索引。 如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。 如果maintenance_work_mem不足以存放找到的死亡元组(或者, 在autovacuum情况下,如果设置了autovacuum_work_mem) ,则每次清理时会多次清理索引。
vacuuming heap VACUUM当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果heap_blks_scanned小于heap_blks_total,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。
cleaning up indexes VACUUM当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。
truncating heap VACUUM正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。
performing final cleanup VACUUM正在执行最终清理。在此阶段,VACUUM将清理空闲空间映射, 更新pg_class中的统计信息,并向统计收集器报告统计信息。当此阶段完成时, VACUUM将结束。

27.4.4. CLUSTER 进度报告 #

每当CLUSTERVACUUM FULL运行时,pg_stat_progress_cluster视图将包含当前正在运行的每一个后台的记录。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。

Table 27.38. pg_stat_progress_cluster 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

后端连接到的数据库的OID。

datname name

后端连接到的数据库的名称。

relid oid

被集群的表的OID。

command text

正在运行的命令。CLUSTERVACUUM FULL

phase text

当前处理阶段。参见Table 27.39

cluster_index_relid oid

如果正在使用索引对表进行扫描,这就是正在使用的索引的OID;否则为0。

heap_tuples_scanned bigint

扫描的堆元组数。 该计数器仅在阶段为seq scanning heapindex scanning heapwriting new heap 时才会递增。

heap_tuples_written bigint

写入的堆元组的数量。这个计数器只有在阶段为seq scanning heap,index scanning heapwriting new heap时才会前进。

heap_blks_total bigint

表中的堆块总数。 这个数字是在seq scanning heap的开始时报告的。

heap_blks_scanned bigint

扫描的堆块数量。该计数器仅在阶段为seq scanning heap时才会递增。

index_rebuild_count bigint

已重建的索引数。该计数器仅在rebuilding index阶段时才会递增。


Table 27.39. 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 该命令正在执行最后的清理工作。 当此阶段完成后,CLUSTERVACUUM FULL将结束。

27.4.5. 基础备份进度报告 #

每当像pg_basebackup这样的应用程序执行基础备份时, pg_stat_progress_basebackup视图将包含当前运行BASE_BACKUP复制命令和流式传输备份的每个WAL发送进程的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。

Table 27.40. pg_stat_progress_basebackup 视图

列类型

描述

pid integer

WAL 发送进程的进程 ID。

phase text

目前的处理阶段。 参见 Table 27.41

backup_total bigint

将被流式传输的数据总量。该值在streaming database files阶段开始时进行估算并报告。 注意,这只是一个近似值,因为数据库可能会在streaming database files阶段期间发生变化,而 WAL 日志也可能在稍后的备份阶段被包含进来。 一旦流式传输的数据量超过了估计的总大小,该值始终与backup_streamed相同。 如果在pg_basebackup中禁用估算(也就是说,指定了--no-estimate-size选项),这为NULL

backup_streamed bigint

已流式传输的数据量。该计数器仅在streaming database files阶段或transferring wal files阶段递增。

tablespaces_total bigint

将要流式传输的表空间总数。

tablespaces_streamed bigint

已流式传输的表空间数量。此计数器仅在streaming database files阶段递增。


Table 27.41. 基础备份阶段

阶段 描述
initializing WAL 发送进程正在准备开始备份。这个阶段预计会非常短暂。
waiting for checkpoint to finish WAL 发送进程当前正在执行pg_start_backup以准备进行基础备份,并等待备份起始检查点完成。
estimating backup size WAL 发送进程当前正在估算将作为基础备份流式传输的数据库文件总量。
streaming database files WAL 发送进程当前正将数据库文件作为基础备份进行流式传输。
waiting for wal archiving to finish WAL发送进程当前正在执行pg_stop_backup以完成备份, 并等待基础备份所需的所有 WAL 文件成功归档。 如果在pg_basebackup中指定了--wal-method=none--wal-method=stream,备份将在此阶段完成时结束。
transferring wal files WAL 发送进程当前正在传输备份期间生成的全部 WAL 日志。 如果pg_basebackup中指定了--wal-method=fetch, 则该阶段发生在waiting for wal archiving to finish阶段之后。当此阶段完成时备份将结束。