PostgreSQL 可以在命令执行期间报告某些命令的进度。目前,唯一支持进度报告的命令是 ANALYZE
、CLUSTER
、CREATE INDEX
、VACUUM
、COPY
和 BASE_BACKUP(即 pg_basebackup 发出的用于获取基本备份的复制命令)。此功能将来可能会扩展。
每当 ANALYZE
正在运行时,pg_stat_progress_analyze
视图将包含一行用于当前正在运行该命令的每个后端。下表描述了将报告的信息,并提供有关如何解释这些信息的信息。
表 28.37. pg_stat_progress_analyze
视图
列类型 描述 |
---|
后端的进程 ID。 |
此后端连接到的数据库的 OID。 |
此后端连接到的数据库的名称。 |
正在分析的表的 OID。 |
当前处理阶段。请参见 表 28.38。 |
将采样的堆块总数。 |
已扫描的堆块数。 |
扩展统计信息的数量。 |
已计算的扩展统计信息的数量。此计数器仅在阶段为 |
子表数。 |
已扫描的子表数。此计数器仅在阶段为 |
当前正在扫描的子表的 OID。此字段仅在阶段为 |
表 28.38. ANALYZE 阶段
阶段 | 描述 |
---|---|
初始化 |
该命令准备开始扫描堆。预计此阶段非常短暂。 |
获取示例行 |
该命令当前正在扫描 relid 给出的表以获取示例行。 |
获取继承的示例行 |
该命令当前正在扫描子表以获取示例行。列 child_tables_total 、child_tables_done 和 current_child_table_relid 包含此阶段的进度信息。 |
计算统计信息 |
该命令正在计算从表扫描期间获取的示例行的统计信息。 |
计算扩展统计信息 |
该命令正在计算从表扫描期间获取的示例行的扩展统计信息。 |
完成分析 |
该命令正在更新 pg_class 。当此阶段完成后,ANALYZE 将结束。 |
请注意,当在分区表上运行 ANALYZE
时,其所有分区也将递归分析。在这种情况下,ANALYZE
进度首先针对父表报告,从而收集其继承统计信息,然后针对每个分区报告。
每当 CLUSTER
或 VACUUM FULL
正在运行时,pg_stat_progress_cluster
视图将包含一行,针对当前正在运行任一命令的每个后端。下表描述了将报告的信息,并提供有关如何解释这些信息的信息。
表 28.39. pg_stat_progress_cluster
视图
列类型 描述 |
---|
后端的进程 ID。 |
此后端连接到的数据库的 OID。 |
此后端连接到的数据库的名称。 |
正在集群的表的 OID。 |
正在运行的命令。可能是 |
当前处理阶段。请参见 表 28.40。 |
如果正在使用索引扫描表,则这是正在使用的索引的 OID;否则为零。 |
扫描的堆元组数。此计数器仅在阶段为 |
写入堆元组的数量。此计数器仅在阶段为 |
表中堆块的总数。此数字在 |
扫描的堆块数。此计数器仅在阶段为 |
重建的索引数。此计数器仅在阶段为 |
表 28.40. CLUSTER 和 VACUUM FULL 阶段
阶段 | 描述 |
---|---|
初始化 |
该命令准备开始扫描堆。预计此阶段非常短暂。 |
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 将结束。 |
每当 COPY
正在运行时,pg_stat_progress_copy
视图将为当前正在运行 COPY
命令的每个后端包含一行。下表描述了将报告的信息,并提供了有关如何解释这些信息的信息。
表 28.41. pg_stat_progress_copy
视图
列类型 描述 |
---|
后端的进程 ID。 |
此后端连接到的数据库的 OID。 |
此后端连接到的数据库的名称。 |
执行 |
正在运行的命令: |
数据读写时的 io 类型: |
|
|
|
由于被 |
每当运行 CREATE INDEX
或 REINDEX
时,pg_stat_progress_create_index
视图将为当前正在创建索引的每个后端包含一行。下表描述了将报告的信息,并提供了有关如何解释这些信息的信息。
表 28.42. pg_stat_progress_create_index
视图
列类型 描述 |
---|
创建索引的后端的进程 ID。 |
此后端连接到的数据库的 OID。 |
此后端连接到的数据库的名称。 |
正在创建索引的表的 OID。 |
正在创建或重新索引的索引的 OID。在非并发 |
特定命令类型: |
索引创建的当前处理阶段。请参见 表 28.43。 |
在适用时,要等待的总锁数。 |
已等待的锁数。 |
当前正在等待的锁的进程 ID。 |
当前阶段要处理的总块数。 |
当前阶段中已处理的块数。 |
当前阶段中要处理的元组总数。 |
当前阶段中已处理的元组数。 |
要在其上创建或附加索引的分区总数,包括直接分区和间接分区。在 |
已在其上创建或附加索引的分区数,包括直接分区和间接分区。在 |
表 28.43. CREATE INDEX 阶段
阶段 | 描述 |
---|---|
初始化 |
CREATE INDEX 或 REINDEX 正在准备创建索引。预计此阶段非常短暂。 |
正在等待生成之前的写入器 |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待可能看到表的具有写锁定的事务完成。在非并发模式下跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
正在生成索引 |
索引由特定于访问方法的代码生成。在此阶段,支持进度报告的访问方法会填写其自己的进度数据,并且子阶段在此列中指示。通常,blocks_total 和 blocks_done 将包含进度数据,以及潜在的 tuples_total 和 tuples_done 。 |
正在等待验证之前的写入器 |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待可能写入表的具有写锁定的事务完成。在非并发模式下跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
索引验证:正在扫描索引 |
CREATE INDEX CONCURRENTLY 正在扫描索引,搜索需要验证的元组。在非并发模式下跳过此阶段。列 blocks_total (设置为索引的总大小)和 blocks_done 包含此阶段的进度信息。 |
索引验证:排序元组 |
CREATE INDEX CONCURRENTLY 正在对索引扫描阶段的输出进行排序。 |
索引验证:扫描表 |
CREATE INDEX CONCURRENTLY 正在扫描表以验证在前两个阶段中收集的索引元组。在非并发模式下,将跳过此阶段。列 blocks_total (设置为表的总大小)和 blocks_done 包含此阶段的进度信息。 |
等待旧快照 |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待可能看到表的事务释放其快照。在非并发模式下,将跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
在标记为死之前等待读取器 |
REINDEX CONCURRENTLY 正在等待对表具有读锁的事务完成,然后才能将旧索引标记为死。在非并发模式下,将跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
在删除之前等待读取器 |
REINDEX CONCURRENTLY 正在等待对表具有读锁的事务完成,然后才能删除旧索引。在非并发模式下,将跳过此阶段。列 lockers_total 、lockers_done 和 current_locker_pid 包含此阶段的进度信息。 |
每当 VACUUM
正在运行时,pg_stat_progress_vacuum
视图将包含一行,用于当前正在执行 vacuum 的每个后端(包括自动 vacuum 工作进程)。下表描述了将报告的信息,并提供了有关如何解释这些信息的信息。对于 VACUUM FULL
命令的进度通过 pg_stat_progress_cluster
报告,因为 VACUUM FULL
和 CLUSTER
都重写了表,而常规 VACUUM
仅就地修改表。请参见 第 28.4.2 节。
表 28.44. pg_stat_progress_vacuum
视图
列类型 描述 |
---|
后端的进程 ID。 |
此后端连接到的数据库的 OID。 |
此后端连接到的数据库的名称。 |
正在清理的表的 OID。 |
清理的当前处理阶段。请参阅 表 28.45。 |
表中堆块的总数。此数字在扫描开始时报告;稍后添加的块不会(也不需要)由 |
已扫描的堆块数。由于 可见性映射 用于优化扫描,因此某些块将被跳过而不进行检查;已跳过的块包含在此总数中,因此当清理完成时,此数字最终将等于 |
已清理的堆块数。除非表没有索引,否则只有在阶段为 |
已完成的索引清理周期的数量。 |
在需要执行索引清理周期之前可以存储的死元组数,基于 maintenance_work_mem。 |
自上次索引清理周期以来收集的死元组数。 |
表 28.45. VACUUM 阶段
阶段 | 描述 |
---|---|
初始化 |
VACUUM 正在准备开始扫描堆。预计此阶段非常短暂。 |
scanning heap |
VACUUM 当前正在扫描堆。它将根据需要整理和整理每个页面,并可能执行冻结活动。可以使用 heap_blks_scanned 列来监视扫描的进度。 |
vacuuming indexes |
VACUUM 当前正在清理索引。如果表有任何索引,则在堆完全扫描后,每次清理都会发生至少一次。如果 maintenance_work_mem(或在自动清理的情况下,如果设置了 autovacuum_work_mem)不足以存储找到的死元组数,则每次清理可能会发生多次。 |
vacuuming heap |
VACUUM 当前正在清理堆。清理堆与扫描堆不同,并且在每次清理索引之后发生。如果 heap_blks_scanned 小于 heap_blks_total ,则系统将在此阶段完成后返回扫描堆;否则,它将在此阶段完成后开始清理索引。 |
cleaning up indexes |
VACUUM 当前正在清理索引。这发生在堆已被完全扫描且索引和堆的所有清理已完成之后。 |
截断堆 |
VACUUM 当前正在截断堆,以便在关系的末尾向操作系统返回空页面。这发生在清理索引之后。 |
performing final cleanup |
VACUUM 正在执行最终清理。在此阶段,VACUUM 将清理空闲空间映射,更新 pg_class 中的统计信息,并将统计信息报告给累积统计信息系统。当此阶段完成后,VACUUM 将结束。 |
每当 pg_basebackup 等应用程序正在进行基本备份时,pg_stat_progress_basebackup
视图将包含一行,用于当前正在运行 BASE_BACKUP
复制命令并流式传输备份的每个 WAL 发送器进程。下表描述了将报告的信息,并提供了有关如何解释该信息的信息。
表 28.46. pg_stat_progress_basebackup
视图
列类型 描述 |
---|
WAL 发送器进程的进程 ID。 |
当前处理阶段。请参见 表 28.47。 |
将流式传输的数据总量。这是估计值,并报告为 |
流式传输的数据量。此计数器仅在阶段为 |
将流式传输的表空间总数。 |
已流式传输的数据表空间数。此计数器仅在阶段为 |
表 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 归档完成 阶段之后。备份将在此阶段完成后结束。 |