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

27.4. 进度报告 #

PostgreSQL 能够在命令执行期间报告某些命令的进度。目前,唯一支持进度报告的命令是 ANALYZECLUSTERCREATE INDEXVACUUMCOPYBASE_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_totalchild_tables_donecurrent_child_table_relid 包含此阶段的进度信息。
computing statistics 命令正在从在表扫描期间获取的样本行中计算统计数据。
computing extended statistics 命令正在从在表扫描期间获取的样本行中计算扩展统计数据。
finalizing analyze 命令正在更新 pg_class。当此阶段完成时,ANALYZE 将结束。

注意

请注意,当在分区表上运行 ANALYZE 时,它的所有分区也将被递归分析。在这种情况下,首先报告父表的 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

正在运行的命令。无论是 CLUSTER 还是 VACUUM 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 和 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 正在准备创建索引。此阶段预计非常短暂。
等待写入器进行构建 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 包含此阶段的进度信息。
在标记已删除之前等待读取器 REINDEX CONCURRENTLY 正在等待对表具有读锁的事务完成,然后标记旧索引已删除。当未处于并发模式时,此阶段将跳过。列 lockers_totallockers_donecurrent_locker_pid 包含此阶段的进度信息。
在删除之前等待读取器 REINDEX CONCURRENTLY 正在等待对表具有读锁的事务完成,然后删除旧索引。当未处于并发模式时,此阶段将跳过。列 lockers_totallockers_donecurrent_locker_pid 包含此阶段的进度信息。

27.4.5. VACUUM 进度报告 #

每当 VACUUM 运行时,pg_stat_progress_vacuum 视图将包含每个后端(包括自动清理工作进程)正在执行清理的行的信息。下表描述了将报告的信息,并提供有关如何解释它的信息。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

正在清理的表的 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 indexescleaning up indexes 时才递增。


表 27.46. VACUUM 阶段

阶段 描述
initializing VACUUM 正在准备开始扫描堆。此阶段预计非常短暂。
扫描堆 VACUUM 当前正在扫描堆。如果需要,它将修剪和整理每个页面,并可能执行冻结活动。可以使用 heap_blks_scanned 列来监控扫描的进度。
清理索引 VACUUM 当前正在清理索引。如果表有任何索引,这将至少每清理一次执行一次,在堆完全扫描之后。如果 maintenance_work_mem(或在自动清理的情况下,如果设置了 autovacuum_work_mem)不足以存储找到的已删除元组数量,则它可能会在每次清理时执行多次。
清理堆 VACUUM 当前正在清理堆。清理堆不同于扫描堆,它在每个索引清理实例之后发生。如果 heap_blks_scanned 小于 heap_blks_total,则系统将在此阶段完成后返回到扫描堆;否则,它将在此阶段完成后开始清理索引。
清理索引 VACUUM 当前正在清理索引。这发生在堆完全扫描且所有索引和堆的清理都已完成之后。
截断堆 VACUUM 当前正在截断堆,以便将关系末尾的空页面返回到操作系统。这发生在清理索引之后。
performing final cleanup VACUUM 正在执行最终清理。在此阶段,VACUUM 将清理空闲空间映射,更新 pg_class 中的统计信息,并将统计信息报告到累积统计信息系统。此阶段完成后,VACUUM 将结束。

27.4.6. 基本备份进度报告 #

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

表 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. 基本备份阶段

阶段 描述
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 归档完成 阶段之后发生。在完成此阶段后,备份将结束。

提交更正

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