Skip to content

28.4. 进度报告#

28.4.1. ANALYZE 进度报告
28.4.2. CLUSTER 进度报告
28.4.3. COPY 进度报告
28.4.4. CREATE INDEX 进度报告
28.4.5. VACUUM 进度报告
28.4.6. 基本备份进度报告

PostgreSQL可以在命令执行期间报告某些命令的进度。目前,唯一支持进度报告的命令是ANALYZECLUSTERCREATE INDEXVACUUMCOPYBASE_BACKUP(即pg_basebackup发出的用于获取基本备份的复制命令)。此功能将来可能会扩展。

28.4.1. ANALYZE 进度报告#

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

表 28.37.pg_stat_progress_analyze视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在分析的表的 OID。

phase text

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

sample_blks_total bigint

将采样的堆块总数。

sample_blks_scanned bigint

已扫描的堆块数。

ext_stats_total bigint

扩展统计信息的数量。

ext_stats_computed bigint

已计算的扩展统计信息的数量。此计数器仅在阶段为 计算扩展统计信息 时才会增加。

child_tables_total bigint

子表数。

child_tables_done bigint

已扫描的子表数。此计数器仅在阶段为 获取继承的样本行 时才会增加。

current_child_table_relid oid

当前正在扫描的子表的 OID。此字段仅在阶段为 获取继承的样本行 时才有效。

表 28.38. ANALYZE 阶段

阶段描述
初始化该命令准备开始扫描堆。预计此阶段非常短暂。
获取示例行该命令当前正在扫描 relid 给出的表以获取示例行。
获取继承的示例行该命令当前正在扫描子表以获取示例行。列 child_tables_totalchild_tables_donecurrent_child_table_relid 包含此阶段的进度信息。
计算统计信息该命令正在计算从表扫描期间获取的示例行的统计信息。
计算扩展统计信息该命令正在计算从表扫描期间获取的示例行的扩展统计信息。
完成分析该命令正在更新 pg_class。当此阶段完成后,ANALYZE 将结束。

注意

请注意,当在分区表上运行ANALYZE时,其所有分区也将递归分析。在这种情况下,ANALYZE进度首先针对父表报告,从而收集其继承统计信息,然后针对每个分区报告。

28.4.2. CLUSTER 进度报告#

每当CLUSTERVACUUM FULL正在运行时,pg_stat_progress_cluster视图将包含一行,针对当前正在运行任一命令的每个后端。下表描述了将报告的信息,并提供有关如何解释这些信息的信息。

表 28.39.pg_stat_progress_cluster视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在集群的表的 OID。

command text

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

phase text

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

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 时才会增加。

表 28.40. CLUSTER 和 VACUUM FULL 阶段

阶段描述
初始化该命令准备开始扫描堆。预计此阶段非常短暂。
seq scanning heap该命令当前正在使用顺序扫描扫描表。
index scanning heapCLUSTER 当前正在使用索引扫描扫描表。
sorting tuplesCLUSTER 当前正在对元组进行排序。
writing new heapCLUSTER 当前正在写入新堆。
swapping relation files该命令当前正在将新构建的文件交换到原处。
rebuilding index该命令当前正在重建索引。
performing final cleanup该命令正在执行最终清理。此阶段完成后,CLUSTERVACUUM FULL 将结束。

28.4.3. COPY 进度报告#

每当COPY正在运行时,pg_stat_progress_copy视图将为当前正在运行COPY命令的每个后端包含一行。下表描述了将报告的信息,并提供了有关如何解释这些信息的信息。

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

数据读写时的 io 类型: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 子句排除,而未处理的元组数。

28.4.4. CREATE INDEX 进度报告#

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

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

索引创建的当前处理阶段。请参见 表 28.43

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

表 28.43。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 包含此阶段的进度信息。

28.4.5. VACUUM 进度报告#

每当VACUUM正在运行时,pg_stat_progress_vacuum视图将包含一行,用于当前正在执行 vacuum 的每个后端(包括自动 vacuum 工作进程)。下表描述了将报告的信息,并提供了有关如何解释这些信息的信息。对于VACUUM FULL命令的进度通过pg_stat_progress_cluster报告,因为VACUUM FULLCLUSTER都重写了表,而常规VACUUM仅就地修改表。请参见第 28.4.2 节

表 28.44.pg_stat_progress_vacuum视图

列类型

描述

pid integer

后端的进程 ID。

datid oid

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

datname name

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

relid oid

正在清理的表的 OID。

phase text

清理的当前处理阶段。请参阅 表 28.45

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

在需要执行索引清理周期之前可以存储的死元组数,基于 maintenance_work_mem

num_dead_tuples bigint

自上次索引清理周期以来收集的死元组数。

表 28.45。VACUUM 阶段

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

28.4.6. 基本备份进度报告#

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

表 28.46.pg_stat_progress_basebackup视图

列类型

描述

pid integer

WAL 发送器进程的进程 ID。

phase text

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

backup_total bigint

将流式传输的数据总量。这是估计值,并报告为 流式传输数据库文件 阶段的开始。请注意,这只是一个近似值,因为数据库可能会在 流式传输数据库文件 阶段发生更改,并且 WAL 日志可能会稍后包含在备份中。一旦流式传输的数据量超过估计的总大小,这始终与 backup_streamed 的值相同。如果在 pg_basebackup 中禁用了估计(即,指定了 --no-estimate-size 选项),则这是 NULL

backup_streamed bigint

流式传输的数据量。此计数器仅在阶段为 流式传输数据库文件传输 wal 文件 时才会增加。

tablespaces_total bigint

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

tablespaces_streamed bigint

已流式传输的数据表空间数。此计数器仅在阶段为 流式传输数据库文件 时才会增加。

表 28.47 基本备份阶段

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