受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
此文档适用于不受支持的 PostgreSQL 版本。
您可能需要查看当前版本的相同页面,或上面列出的其他受支持版本。

27.4. 进度报告 #

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

27.4.1. ANALYZE 进度报告 #

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

Table 27.41. pg_stat_progress_analyze 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

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

datname name

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

relid oid

被分析的表的OID。

phase text

当前处理阶段。参见 Table 27.42

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时有效。

delay_time double precision

因基于成本的延迟而睡眠的总时间(参见Section 19.4.4),以毫秒计(如果启用了 track_cost_delay_timing,否则为零)。

started_by text

说明当前 ANALYZE 操作是由什么触发的。可能的值有:

  • manual:由显式的 ANALYZE,或者带有 ANALYZE 选项的 VACUUM 启动。

  • autovacuum:由自动清理工作进程启动。


Table 27.42. 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进度,收集它的继承统计信息,然后是每个分区的(继承统计信息)。

27.4.2. CREATE INDEX 进度报告 #

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

Table 27.43. 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.44

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

在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。 在REINDEX期间,此字段为0

partitions_done bigint

当在分区表上创建索引时,该列被设置为在其上建立索引的分区数。 在REINDEX期间,此字段为0


Table 27.44. CREATE INDEX 的阶段

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

27.4.3. REPACK 进度报告 #

每当REPACK运行时,pg_stat_progress_repack视图将包含当前运行该命令的每一个后台的一行。下面的表格描述了将要报告的信息,并提供了关于如何解释这些信息的信息。

Table 27.45. pg_stat_progress_repack 视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

被重整的表的 OID。

command text

正在运行的命令。可以是 REPACKVACUUM FULLCLUSTER

phase text

当前处理阶段。参见 Table 27.46

repack_index_relid oid

如果正使用索引扫描表,这里就是所用索引的 OID;否则为零。

heap_tuples_scanned bigint

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

heap_tuples_inserted bigint

插入的堆元组数。该计数器仅在 seq scanning heapindex scanning heapwriting new heapcatch-up 阶段递增。

heap_tuples_updated bigint

更新的堆元组数。该计数器仅在 catch-up 阶段递增。

heap_tuples_deleted bigint

删除的堆元组数。该计数器仅在 catch-up 阶段递增。

heap_blks_total bigint

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

heap_blks_scanned bigint

已扫描的堆块数。该计数器仅在 seq scanning heap 阶段递增。

index_rebuild_count bigint

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


Table 27.46. REPACK 阶段

阶段 描述
initializing 命令正在准备开始扫描堆。这个阶段预计会非常短暂。
seq scanning heap 命令正在使用顺序扫描扫描表。
index scanning heap REPACK 正在使用索引扫描表。
sorting tuples REPACK 正在对元组排序。
writing new heap REPACK 正在写入新的堆。
catch-up REPACK CONCURRENTLY 正在处理其他事务在前述任一阶段执行的 DML 命令。
swapping relation files 命令正在把新构建的文件交换到位。
rebuilding index 命令正在重建一个索引。
performing final cleanup 命令正在执行最终清理。当此阶段完成时,REPACK 将结束。

27.4.4. VACUUM 进度报告 #

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

Table 27.47. pg_stat_progress_vacuum 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

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

datname name

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

relid oid

被vacuum的表的OID。

phase text

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

heap_blks_total bigint

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

heap_blks_scanned bigint

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

heap_blks_vacuumed bigint

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

index_vacuum_count bigint

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

max_dead_tuple_bytes bigint

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

dead_tuple_bytes bigint

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

num_dead_item_ids bigint

自上一个索引清理周期以来收集到的死项标识符数量。

indexes_total bigint

将要执行 vacuum 或清理的索引总数。该数字会在 vacuuming indexescleaning up indexes 阶段开始时报告。

indexes_processed bigint

已处理的索引数量。该计数器只会在 vacuuming indexescleaning up indexes 阶段推进。

delay_time double precision

因基于成本的延迟而睡眠的总时间(参见Section 19.4.4),以毫秒计(如果启用了 track_cost_delay_timing,否则为零)。这包括任何相关并行工作进程的睡眠时间;不过,并行工作进程最多每秒才会上报一次自己的睡眠时间,因此该值可能略有滞后。

mode text

当前 VACUUM 操作所处的模式。有关每种模式的详细信息请参见 Section 24.1.5。可能的值有:

  • normal:执行标准 vacuum,既不需要以 aggressive 模式运行,也不处于 failsafe 模式。

  • aggressive:执行 aggressive vacuum,必须扫描所有未标记为 all-frozen 的页面。vacuum_freeze_table_agevacuum_multixact_freeze_table_age 决定何时需要 aggressive vacuum。

  • failsafe:vacuum 已进入 failsafe 模式,只执行避免事务 ID 或 multixact ID 回卷失败所需的最少工作。vacuum_failsafe_agevacuum_multixact_failsafe_age 决定何时进入 failsafe 模式。vacuum 可能一开始就处于该模式,或者运行过程中切换到该模式;mode 列的值在操作期间可能从其他模式变为 failsafe

started_by text

说明当前 VACUUM 操作是由什么触发的。可能的值有:

  • manual:由显式的 VACUUM 命令启动。

  • autovacuum:由自动清理工作进程启动。自动清理工作进程执行的 vacuum 可能会因锁冲突而被中断。

  • autovacuum_wraparound:由自动清理工作进程为防止事务 ID 或 multixact ID 回卷而启动。用于回卷保护的 vacuum 不会因锁冲突而中断。


Table 27.48. VACUUM的阶段

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

27.4.5. CLUSTER 进度报告 #

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

Table 27.49. pg_stat_progress_cluster 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

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

datname name

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

relid oid

被集群的表的OID。

command text

正在运行的命令。CLUSTERVACUUM FULL。由于这个视图只为兼容性而保留,它会把任何REPACK命令映射成前两者之一。

phase text

当前处理阶段。参见Table 27.50

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

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


Table 27.50. CLUSTER 和 VACUUM FULL 阶段

阶段 描述
初始化 该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。
seq扫描堆 该命令目前采用顺序扫描的方式对表进行扫描。
索引扫描堆 CLUSTER目前正在使用索引扫描表。
元组排序 CLUSTER目前正在对元组进行排序。
新写入堆 CLUSTER目前正在编写新的堆。
交换关系文件 目前,该命令正在将新建立的文件调换到位。
重建索引 该命令目前正在重建一个索引。
清理 该命令正在执行最后的清理工作。 当此阶段完成后,CLUSTERVACUUM FULL将结束。

27.4.6. 基础备份进度报告 #

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

Table 27.51. pg_stat_progress_basebackup 视图

列类型

描述

pid integer

WAL 发送进程的进程 ID。

phase text

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

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阶段递增。

backup_type text

备份类型。可以是 fullincremental


Table 27.52. 基础备份阶段

阶段 描述
initializing WAL 发送进程正在准备开始备份。这个阶段预计会非常短暂。
等待检查点完成 WAL 发送进程当前正在执行pg_backup_start以准备进行基础备份,并等待备份起始检查点完成。
estimating backup size WAL 发送进程当前正在估算将作为基础备份流式传输的数据库文件总量。
streaming database files WAL 发送进程当前正将数据库文件作为基础备份进行流式传输。
等待wal归档完成 WAL发送进程当前正在执行pg_backup_stop以完成备份, 并等待基础备份所需的所有 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阶段之后。当此阶段完成时备份将结束。

27.4.7. COPY 进度报告 #

COPY正在运行时,pg_stat_progress_copy视图会为每个当前正在执行COPY命令的后端包含一行。下表描述了会报告哪些信息,以及应如何解释这些信息。

Table 27.53. pg_stat_progress_copy 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

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

datname name

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

relid oid

执行COPY命令的表的OID。 如果从SELECT查询中复制,它被设置为0

command text

正在运行的命令: COPY FROM, 或 COPY TO

type text

数据被读取或写入的io类型:FILE, PROGRAM, PIPE (对于COPY FROM STDINCOPY TO STDOUT),或 CALLBACK(例如在逻辑复制中初始表同步期间使用)。

bytes_processed bigint

已经被COPY命令处理的字节数。

bytes_total bigint

COPY FROM命令的源文件大小,以字节计。 如果不可用则设置为0

tuples_processed bigint

已经被COPY命令处理的元组数。

tuples_excluded bigint

没有处理的元组数,因为它们被COPY命令的WHERE子句所排除。

tuples_skipped bigint

因包含格式错误的数据而被跳过的元组数。只有当 ON_ERROR 指定为 ignore 时,此计数器才会递增。


27.4.8. 数据校验和进度报告 #

当在运行中的集簇上启用数据校验和时,pg_stat_progress_data_checksums视图将包含启动进程的一行,以及每个当前正在为某个数据库中的数据页计算并写入校验和的工作进程的一行。启动进程提供整体进度概览(已处理多少个数据库,还剩多少个),而工作进程跟踪当前正在处理的数据库的进度。

Table 27.54. pg_stat_progress_data_checksums 视图

列类型

描述

pid integer

数据校验和进程的进程 ID,启动进程或工作进程。

datid oid

这个数据库的 OID,或者对于启动进程为 0

datname name

这个数据库的名称,或者对于启动进程为 NULL

phase text

当前处理阶段,参见 Table 27.55 了解各阶段的说明。

databases_total integer

将要处理的数据库总数。只有启动进程会设置这个值,工作进程为 NULL

databases_done integer

已处理的数据库数量。只有启动进程会设置这个值,工作进程为 NULL

relations_total integer

将要处理的关系总数,或者如果工作进程还没有计算出关系数量,则为 NULL。启动进程将该值设为 NULL,因为它不负责处理关系,只负责启动工作进程。

relations_done integer

已处理的关系数量。启动进程将该值设为 NULL

blocks_total integer

当前关系中将要处理的块数,或者如果工作进程还没有计算出块数,则为 NULL。启动进程将该值设为 NULL

blocks_done integer

当前关系中已经处理的块数。启动进程将该值设为 NULL


Table 27.55. 数据校验和阶段

阶段 描述
enabling 命令正在当前集簇上启用数据校验和。
disabling 命令正在当前集簇上禁用数据校验和。
done 命令已完成,且集簇中的数据校验和状态已经改变。
waiting on barrier 命令当前正在等待当前活动后端确认数据校验和状态的变更。
waiting on temporary tables 命令当前正在等待在该命令启动时存在的所有临时表被移除。