↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6

27.4. 进度报告 #

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

27.4.1. ANALYZE 进度报告 #

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

表 27.38. pg_stat_progress_analyze 视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

被分析的表的 OID。

phase text

当前处理阶段。参见表 27.39。

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


表 27.39. 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 将结束。

注意

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

27.4.2. CLUSTER 进度报告 #

每当 CLUSTER 或 VACUUM FULL 运行时,pg_stat_progress_cluster 视图将为每个当前正在运行这两种命令之一的后端包含一行。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。

表 27.40. pg_stat_progress_cluster 视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在聚簇的表的 OID。

command text

正在运行的命令。CLUSTER 或 VACUUM FULL。

phase text

当前处理阶段。参见表 27.41。

cluster_index_relid oid

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

heap_tuples_scanned bigint

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

heap_tuples_written bigint

写入的堆元组的数量。这个计数器只有在阶段为 seq scanning heap、index scanning heap 或 writing new heap 时才会递增。

heap_blks_total bigint

表中的堆块总数。这个数字以 seq scanning heap 开始时的数量为准。

heap_blks_scanned bigint

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

index_rebuild_count bigint

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


表 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 将结束。

27.4.3. COPY 进度报告 #

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

表 27.42. 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

读取或写入数据的 I/O 类型:FILE、PROGRAM、PIPE(用于 COPY FROM STDIN 和 COPY 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 选项指定的值不是 stop 时,此计数器才会递增。


27.4.4. CREATE INDEX 进度报告 #

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

表 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

索引创建的当前处理阶段。参见表 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。


表 27.44. CREATE INDEX 阶段

阶段描述
initializing CREATE INDEX 或 REINDEX 正在准备创建索引。这个阶段预计会非常短暂。
waiting for writers before build CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待持有写锁且可能看到该表的事务结束。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
building index 索引是由访问方法专用代码建立的。在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。通常情况下,blocks_total 和 blocks_done 将包含进度数据,tuples_total 和 tuples_done 也可能包含进度数据。
waiting for writers before validation CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待持有写锁且可能写入该表的事务结束。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_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 CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待可能看到表的事务释放快照。当不处于并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
waiting for readers before marking dead REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
waiting for readers before dropping REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_total、lockers_done 和 current_locker_pid 包含了这个阶段的进度信息。

27.4.5. VACUUM 进度报告 #

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

表 27.45. pg_stat_progress_vacuum 视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在清理的表的 OID。

phase text

清理的当前处理阶段。参见表 27.46。

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_tuple_bytes bigint

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

dead_tuple_bytes bigint

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

num_dead_item_ids bigint

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

indexes_total bigint

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

indexes_processed bigint

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


表 27.46. VACUUM 阶段

阶段描述
initializing VACUUM 正在准备开始扫描堆。这个阶段应该很简短。
scanning heap VACUUM 正在扫描堆。如果需要,它将会对每个页面进行剪枝以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned 列可以用来监控扫描的进度。
vacuuming indexesVACUUM 当前正在清理索引。如果表有索引,每次清理都会在堆扫描完成后至少执行一次此阶段。如果 maintenance_work_mem(或者,对于自动清理,已设置的 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.6. 基础备份进度报告 #

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

表 27.47. pg_stat_progress_basebackup 视图

列类型

描述

pid integer

WAL 发送进程的进程 ID。

phase text

当前处理阶段。参见表 27.48。

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


表 27.48. 基础备份阶段

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

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.