PostgreSQL能够在某些命令执行期间报告其进度。目前,支持进度报告的命令只有ANALYZE、CLUSTER、CREATE INDEX、VACUUM、COPY以及BASE_BACKUP(即 pg_basebackup 用于创建基础备份的复制命令)。未来可能会扩展此功能。
每当ANALYZE运行时,pg_stat_progress_analyze视图将包含当前运行该命令的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它们的信息。
Table 27.37. pg_stat_progress_analyze 视图
|
列类型 描述 |
|---|
|
后端的进程ID。 |
|
后端连接到的数据库的OID。 |
|
后端连接到的数据库的名称。 |
|
被分析的表的OID。 |
|
当前处理阶段。参见 Table 27.38。 |
|
将被采样的堆块的总数。 |
|
扫描的堆块数量。 |
|
扩展统计信息的数量。 |
|
已经计算的扩展统计信息数量。此计数器仅在 |
|
子表的数量。 |
|
扫描的子表数量。此计数器仅在 |
|
当前正在扫描的子表的OID。此字段仅在 |
|
因基于成本的延迟而睡眠的总时间(参见Section 19.15.4),以毫秒计(如果启用了 track_cost_delay_timing,否则为零)。 |
Table 27.38. ANALYZE 阶段
| 阶段 | 描述 |
|---|---|
initializing |
命令正在准备开始扫描堆。这个阶段预计会非常短暂。 |
acquiring sample rows |
该命令当前正在扫描relid给出的表以获得样例行。 |
acquiring inherited sample rows |
该命令当前正在扫描子表以获得样例行。列child_tables_total,child_tables_done, 和current_child_table_relid包含此阶段的进度信息。 |
computing statistics |
该命令从表扫描期间获得的样例行计算统计信息。 |
computing extended statistics |
该命令从表扫描期间获得的样例行计算扩展统计信息。 |
finalizing analyze |
该命令在更新pg_class。当此阶段完成时,ANALYZE 将结束。 |
注意当在分区表上运行ANALYZE时,它的所有分区也会被递归分析。 在这种情况下,首先报告父表的ANALYZE进度,收集它的继承统计信息,然后是每个分区的(继承统计信息)。
每当运行CREATE INDEX或REINDEX时,pg_stat_progress_create_index视图将包含当前正在创建索引的每个后端的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。
Table 27.39. pg_stat_progress_create_index 视图
|
列类型 描述 |
|---|
|
后端的进程ID。 |
|
后端连接到的数据库的OID。 |
|
后端连接到的数据库的名称。 |
|
正在创建索引的表的OID。 |
|
正在创建或重建索引的OID。在非并发 |
|
在运行的命令: |
|
索引创建的当前处理阶段。 参见 Table 27.40。 |
|
在适用的情况下,需要等待的储物柜总数 |
|
已经等待的储物柜数量。 |
|
目前正在等待的储物柜的进程ID。 |
|
本阶段要处理的区块总数。 |
|
当前阶段已经处理的区块数量。 |
|
当前阶段要处理的元组总数。 |
|
在当前阶段已经处理的元组数量。 |
|
在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。 在 |
|
当在分区表上创建索引时,该列被设置为在其上建立索引的分区数。 在 |
Table 27.40. 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 列包含了这个阶段的进度信息。 |
标记 dead之前等待readers |
REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。 |
在 dropping之前等待readers |
REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_total、lockers_done 和 current_locker_pid包含了这个阶段的进度信息。 |
只要VACUUM正在运行,pg_stat_progress_vacuum视图就会为每个当前正在清理的后端(包括自动清理工作进程)包含一行。下表描述了将报告的信息,并说明如何解释这些信息。VACUUM FULL命令的进度通过pg_stat_progress_cluster报告,因为VACUUM FULL和CLUSTER都会重写表,而常规的VACUUM只会原地修改表。参见Section 27.4.4。
Table 27.41. pg_stat_progress_vacuum 视图
|
列类型 描述 |
|---|
|
后端的进程ID。 |
|
后端连接到的数据库的OID。 |
|
后端连接到的数据库的名称。 |
|
被vacuum的表的OID。 |
|
vacuum的当前处理阶段。参见 Table 27.42。 |
|
该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个 |
|
被扫描的堆块数量。由于visibility map被用来优化扫描,一些块将被跳过而不做检查, 被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于 |
|
被清理的堆块数量。除非表没有索引,这个计数器仅在处于 |
|
已完成的索引清理周期数。 |
|
在需要执行索引清理周期之前可存储的死亡元组数据量,取决于maintenance_work_mem。 |
|
自上一个索引清理周期以来收集到的死亡元组数据量。 |
|
自上一个索引清理周期以来收集到的死项标识符数量。 |
|
将要执行 vacuum 或清理的索引总数。该数字会在 |
|
已处理的索引数量。该计数器只会在 |
|
因基于成本的延迟而睡眠的总时间(参见Section 19.15.4),以毫秒计(如果启用了 track_cost_delay_timing,否则为零)。这包括任何相关并行工作进程的睡眠时间;不过,并行工作进程最多每秒才会上报一次自己的睡眠时间,因此该值可能略有滞后。 |
Table 27.42. VACUUM的阶段
| 阶段 | 描述 |
|---|---|
初始化 |
VACUUM正在准备开始扫描堆。这个阶段应该很简短。 |
扫描堆 |
VACUUM正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned列可以用来监控扫描的进度。 |
清理索引 |
VACUUM当前正在清理索引。 如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。 如果maintenance_work_mem不足以存放找到的死亡元组(或者, 在autovacuum情况下,如果设置了autovacuum_work_mem) ,则每次清理时会多次清理索引。 |
清理堆 |
VACUUM当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果heap_blks_scanned小于heap_blks_total,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。 |
清除索引 |
VACUUM当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。 |
截断堆 |
VACUUM正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。 |
执行最终清理 |
VACUUM正在执行最终清理。在此阶段,VACUUM将清理空闲空间映射, 更新pg_class中的统计信息,并向累积统计系统报告统计信息。当此阶段完成时, VACUUM将结束。 |
每当CLUSTER或VACUUM FULL运行时,pg_stat_progress_cluster视图将包含当前正在运行的每一个后台的记录。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。
Table 27.43. pg_stat_progress_cluster 视图
|
列类型 描述 |
|---|
|
后端的进程ID。 |
|
后端连接到的数据库的OID。 |
|
后端连接到的数据库的名称。 |
|
被集群的表的OID。 |
|
正在运行的命令。 |
|
当前处理阶段。参见Table 27.44。 |
|
如果正在使用索引对表进行扫描,这就是正在使用的索引的OID;否则为0。 |
|
扫描的堆元组数。 该计数器仅在阶段为 |
|
写入的堆元组的数量。这个计数器只有在阶段为 |
|
表中的堆块总数。 这个数字是在 |
|
扫描的堆块数量。该计数器仅在阶段为 |
|
已重建的索引数。该计数器仅在 |
Table 27.44. CLUSTER 和 VACUUM FULL 阶段
| 阶段 | 描述 |
|---|---|
初始化 |
该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。 |
seq扫描堆 |
该命令目前采用顺序扫描的方式对表进行扫描。 |
索引扫描堆 |
CLUSTER目前正在使用索引扫描表。 |
元组排序 |
CLUSTER目前正在对元组进行排序。 |
新写入堆 |
CLUSTER目前正在编写新的堆。 |
交换关系文件 |
目前,该命令正在将新建立的文件调换到位。 |
重建索引 |
该命令目前正在重建一个索引。 |
清理 |
该命令正在执行最后的清理工作。 当此阶段完成后,CLUSTER或VACUUM FULL将结束。 |
每当像pg_basebackup这样的应用程序执行基础备份时, pg_stat_progress_basebackup视图将包含当前运行BASE_BACKUP复制命令和流备份的每个WAL发送进程的一行。 下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。
Table 27.45. pg_stat_progress_basebackup 视图
|
列类型 描述 |
|---|
|
WAL 发送进程的进程 ID。 |
|
目前的处理阶段。 参见 Table 27.46。 |
|
将被流式传输的数据总量。该值在 |
|
已流式传输的数据量。该计数器仅在 |
|
将要流式传输的表空间总数。 |
|
已流式传输的表空间数量。此计数器仅在 |
Table 27.46. 基础备份阶段
| 阶段 | 描述 |
|---|---|
initializing |
WAL 发送进程正在准备开始备份。这个阶段预计会非常短暂。 |
等待检查点完成 |
WAL 发送进程当前正在执行pg_backup_start以准备进行基础备份,并等待备份起始检查点完成。 |
estimating backup size |
WAL 发送进程当前正在估算将作为基础备份流式传输的数据库文件总量。 |
streaming database files |
WAL 发送进程当前正将数据库文件作为基础备份进行流式传输。 |
等待wal归档完成 |
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阶段之后。当此阶段完成时备份将结束。 |
当COPY正在运行时,pg_stat_progress_copy视图会为每个当前正在执行COPY命令的后端包含一行。下表描述了会报告哪些信息,以及应如何解释这些信息。
Table 27.47. pg_stat_progress_copy 视图
|
列类型 描述 |
|---|
|
后端的进程ID。 |
|
后端连接到的数据库的OID。 |
|
后端连接到的数据库的名称。 |
|
执行 |
|
正在运行的命令: |
|
数据被读取或写入的io类型: |
|
已经被 |
|
|
|
已经被 |
|
没有处理的元组数,因为它们被 |
|
因包含格式错误的数据而被跳过的元组数。只有当 |
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。