支持的版本: 当前 (17) / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 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 阶段

阶段 描述
正在初始化 该命令正准备开始扫描堆。预计此阶段非常短暂。
正在获取样本行 该命令当前正在扫描由 relid 给出的表以获取样本行。
正在获取继承的样本行 该命令当前正在扫描子表以获取样本行。列 child_tables_totalchild_tables_donecurrent_child_table_relid 包含此阶段的进度信息。
正在计算统计信息 该命令正在根据表扫描期间获得的样本行计算统计信息。
正在计算扩展统计信息 该命令正在根据表扫描期间获得的样本行计算扩展统计信息。
正在完成分析 该命令正在更新 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

正在运行的命令。可以是 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 和 VACUUM FULL 阶段

阶段 描述
正在初始化 该命令正准备开始扫描堆。预计此阶段非常短暂。
顺序扫描堆 该命令当前正在使用顺序扫描扫描表。
索引扫描堆 CLUSTER 当前正在使用索引扫描扫描表。
正在排序元组 CLUSTER 当前正在排序元组。
正在写入新堆 CLUSTER 当前正在写入新堆。
正在交换关系文件 该命令当前正在将新构建的文件交换到位。
正在重建索引 该命令当前正在重建索引。
正在执行最终清理 该命令正在执行最终清理。当此阶段完成时,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 阶段

阶段 描述
正在初始化 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。仅当阶段为 扫描堆 时,此计数器才会增加。

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

将要清理或清除的索引的总数。此数字在 清理索引 阶段或 清除索引 阶段的开始时报告。

indexes_processed bigint

已处理的索引数量。仅当阶段为 清理索引清除索引 时,此计数器才会增加。


表 27.46. VACUUM 阶段

阶段 描述
正在初始化 VACUUM 正在准备开始扫描堆。预计此阶段非常短暂。
扫描堆 VACUUM 当前正在扫描堆。如果需要,它将修剪和整理每个页面,并可能执行冻结活动。heap_blks_scanned 列可用于监视扫描的进度。
清理索引 VACUUM 当前正在清理索引。如果表有任何索引,则每次清理至少会发生一次,在堆被完全扫描之后。如果 maintenance_work_mem (或者,在自动清理的情况下,如果设置了 autovacuum_work_mem)不足以存储找到的已删除元组的数量,则每次清理可能会发生多次。
清理堆 VACUUM 当前正在清理堆。清理堆与扫描堆不同,并且在每次清理索引后发生。如果 heap_blks_scanned 小于 heap_blks_total,则系统在此阶段完成后将返回扫描堆;否则,它将在完成此阶段后开始清除索引。
清除索引 VACUUM 当前正在清除索引。这发生在堆被完全扫描,并且所有索引和堆的清理都完成后。
截断堆 VACUUM 当前正在截断堆,以便将关系末尾的空页返回到操作系统。这发生在清除索引之后。
正在执行最终清理 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 filestransferring wal files时,此计数器才会递增。

tablespaces_total bigint

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

tablespaces_streamed bigint

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


表 27.48. 基础备份阶段

阶段 描述
正在初始化 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,则此阶段会在waiting for wal archiving to finish阶段之后发生。备份将在完成此阶段时结束。

提交更正

如果您发现文档中任何不正确、与您使用特定功能的经验不符或需要进一步澄清的地方,请使用此表单报告文档问题。