2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6

27.4. 进度报告 #

PostgreSQL 能够报告某些命令在执行期间的进度。目前,唯一支持进度报告的命令是 ANALYZECLUSTERCREATE INDEXVACUUMCOPY 以及 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 时有效。

delay_time double precision

由于基于成本的延迟而花费的总睡眠时间(参见 第 19.10.2 节),以毫秒为单位(如果启用了 track_cost_delay_timing,否则为零)。


表 27.39. ANALYZE 阶段

阶段 描述
initializing 命令正在准备开始扫描堆。此阶段预计非常短暂。
acquiring sample rows 命令当前正在扫描由 relid 指定的表以获取样本行。
acquiring inherited sample rows 命令当前正在扫描子表以获取样本行。列 child_tables_totalchild_tables_donecurrent_child_table_relid 包含此阶段的进度信息。
computing statistics 命令正在根据在表扫描期间获得的样本行计算统计信息。
computing extended statistics 命令正在根据在表扫描期间获得的样本行计算扩展统计信息。
finalizing analyze 命令正在更新 pg_class。当此阶段完成时,ANALYZE 将结束。

注意

请注意,当 ANALYZE 在没有 ONLY 关键字的情况下应用于分区表时,其所有分区也将被递归分析。在这种情况下,ANALYZE 进度将首先报告给父表,收集其继承统计信息,然后报告给每个分区。

27.4.2. CLUSTER 进度报告 #

每当 CLUSTERVACUUM FULL 运行时,pg_stat_progress_cluster 视图将包含一个行,对应一个当前正在运行其中一个命令的后端。下表描述了将报告的信息以及如何解释这些信息。

表 27.40. pg_stat_progress_cluster 视图

列 类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在聚类的表的 OID。

command text

正在运行的命令。可能是 CLUSTERVACUUM FULL

phase text

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

cluster_index_relid oid

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

heap_tuples_scanned bigint

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

heap_tuples_written bigint

已写入的堆元组数。此计数器仅在阶段为 seq scanning heapindex scanning heapwriting 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 and 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.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 FROMCOPY TO

type text

数据读取或写入的 I/O 类型:FILEPROGRAMPIPE(用于 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 选项指定的值不是 stop 时递增。


27.4.4. CREATE INDEX 进度报告 #

每当 CREATE INDEXREINDEX 运行时,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 INDEXCREATE INDEX CONCURRENTLYREINDEXREINDEX 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 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.5. VACUUM 进度报告 #

每当 VACUUM 运行时,pg_stat_progress_vacuum 视图将包含一个行,对应一个当前正在 vacuuming 的后端(包括 autovacuum 工作进程)。下表描述了将报告的信息以及如何解释这些信息。 VACUUM FULL 命令的进度通过 pg_stat_progress_cluster 报告,因为 VACUUM FULLCLUSTER 都会重写表,而常规的 VACUUM 只会就地修改它。请参见 第 27.4.2 节

表 27.45. pg_stat_progress_vacuum 视图

列 类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在 vacuuming 的表的 OID。

phase text

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

heap_blks_total bigint

表中堆块的总数。此数字报告自扫描开始时的值;稍后添加的块不会(也不需要)被此 VACUUM 访问。

heap_blks_scanned bigint

已扫描的堆块数。由于使用 可见性图 来优化扫描,因此一些块会被跳过而无需检查;跳过的块包含在此总数中,因此当 vacuum 完成时,此数字最终将等于 heap_blks_total。此计数器仅在阶段为 scanning heap 时递增。

heap_blks_vacuumed bigint

已 vacuumed 的堆块数。除非表没有任何索引,否则此计数器仅在阶段为 vacuuming heap 时递增。包含没有死元组的块将被跳过,因此计数器有时会以大增量向前跳跃。

index_vacuum_count bigint

已完成的索引 vacuum 循环次数。

max_dead_tuple_bytes bigint

在我们能够存储的死元组数据量,在需要执行索引 vacuum 循环之前,基于 maintenance_work_mem

dead_tuple_bytes bigint

自上一个索引 vacuum 循环以来收集的死元组数据量。

num_dead_item_ids bigint

自上一个索引 vacuum 循环以来收集的死项标识符数量。

indexes_total bigint

将要 vacuumed 或清理的总索引数。此数字在 vacuuming indexes 阶段或 cleaning up indexes 阶段开始时报告。

indexes_processed bigint

已处理的索引数。此计数器仅在阶段为 vacuuming indexescleaning up indexes 时递增。

delay_time double precision

由于基于成本的延迟而花费的总睡眠时间(参见 第 19.10.2 节),以毫秒为单位(如果启用了 track_cost_delay_timing,否则为零)。这包括任何关联的并行工作进程睡眠的时间。但是,并行工作进程报告其睡眠时间不频繁于每秒一次,因此报告的值可能略有滞后。


表 27.46. VACUUM 阶段

阶段 描述
initializing VACUUM 正在准备开始扫描堆。此阶段预计非常短暂。
scanning heap VACUUM 当前正在扫描堆。它将根据需要进行修剪和碎片整理,并可能执行冻结活动。heap_blks_scanned 列可用于监视扫描进度。
vacuuming indexes VACUUM 当前正在 vacuuming 索引。如果表有任何索引,这至少会发生一次 vacuum,在堆完全扫描之后。如果 maintenance_work_mem(或 autovacuum 的情况下,如果设置了 autovacuum_work_mem)不足以存储找到的死元组数量,则每次 vacuum 可能会发生多次。
vacuuming heap VACUUM 当前正在 vacuuming 堆。堆的 vacuuming 与扫描堆不同,发生在每次索引 vacuum 之后。如果 heap_blks_scanned 小于 heap_blks_total,则在此阶段完成后,系统将返回到扫描堆;否则,它将在该阶段完成后开始清理索引。
cleaning up indexes VACUUM 当前正在清理索引。这发生在堆完全扫描以及所有索引和堆的 vacuuming 完成之后。
truncating heap VACUUM 当前正在截断堆,以便将关系末尾的空页返回给操作系统。这发生在清理索引之后。
performing final cleanup VACUUM 正在执行最终清理。在此阶段,VACUUM 将 vacuum 空闲空间图,更新 pg_class 中的统计信息,并将统计信息报告给累积统计系统。当此阶段完成时,VACUUM 将结束。

27.4.6. Base Backup 进度报告 #

每当像 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 filestransferring wal files 时递增。

tablespaces_total bigint

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

tablespaces_streamed bigint

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


表 27.48. Base Backup 阶段

阶段 描述
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 阶段之后。备份将在该阶段完成后结束。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步说明的内容,请使用 此表单 报告文档问题。