codecamp

PostgreSQL Progress Reporting

27.4.1. ANALYZE Progress Reporting
27.4.2. CREATE INDEX Progress Reporting
27.4.3. VACUUM进度报告
27.4.4. CLUSTER进度报告
27.4.5. 基础备份进度报告

PostgreSQL具有在命令执行过程中报告某些命令进度的能力。 目前,支持进度报告的命令只有ANALYZE,CLUSTER,CREATE INDEX, VACUUM, 和 BASE_BACKUP(例如 pg_basebackup 发出的进行基础备份的复制命令。)。未来可能还会扩展。

27.4.1. ANALYZE Progress Reporting

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

表 27.32. pg_stat_progress_analyze 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

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

datname name

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

relid oid

被分析的表的OID。

phase text

当前处理阶段。参见 本文中的表 27.33。

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.33. ANALYZE phases

阶段 描述
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中曾提到过。 在这种情况下,首先报告父表的ANALYZE进度,收集它的继承统计信息,然后是每个分区的(继承统计信息)。

27.4.2. CREATE INDEX Progress Reporting

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

表 27.34. 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 INDEX,CREATE INDEX CONCURRENTLY, REINDEX, 或 REINDEX CONCURRENTLY.

phase text

索引创建的当前处理阶段。 参见本文中的表 27.35。

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

在分区表上创建索引时,该列被设置为要在其上创建索引的分区总数。

partitions_done bigint

当在分区表上创建索引时,该列被设置为在其上完成索引的分区数。


表 27.35. 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 列包含了这个阶段的进度信息。
标记 dead之前等待readers REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_totallockers_donecurrent_locker_pid 列包含了这个阶段的进度信息。
在 dropping之前等待readers REINDEX CONCURRENTLY等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_totallockers_donecurrent_locker_pid包含了这个阶段的进度信息。

27.4.3. VACUUM进度报告

只要VACUUM正在运行,每一个当前正在清理的后端(包括autovacuum工作者进程)在pg_stat_progress_vacuum视图中都会有一行。下面的表描述了将被报告的信息并且提供了如何解释它们的信息。VACUUM FULL命令的进度是通过pg_stat_progress_cluster报告的,因为 VACUUM FULLCLUSTER都是重写表,而普通的VACUUM只是原地修改表。见本文中的第 27.4.4 节.

表 27.36. pg_stat_progress_vacuum 视图

列类型

描述

pid integer

后端的进程ID。

datid oid

这个后端连接的数据库的OID。

datname name

这个后端连接的数据库的名称。

relid oid

被vacuum的表的OID。

phase text

vacuum的当前处理阶段。参见本文中的表 27.37。

heap_blks_total bigint

该表中堆块的总数。这个数字在扫描开始时报告,之后增加的块将不会(并且不需要)被这个VACUUM访问。

heap_blks_scanned bigint

被扫描的堆块数量。由于visibility map被用来优化扫描,一些块将被跳过而不做检查, 被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于heap_blks_total。 仅当处于扫描堆阶段时这个计数器才会前进。

heap_blks_vacuumed bigint

被清理的堆块数量。除非表没有索引,这个计数器仅在处于清理堆阶段时才会前进。 不包含死亡元组的块会被跳过,因此这个计数器可能有时会向前跳跃一个比较大的增量。

index_vacuum_count bigint

已完成的索引清理周期数。

max_dead_tuples bigint

在需要执行一个索引清理周期之前我们可以存储的死亡元组数,取决于maintenance_work_mem

num_dead_tuples bigint

从上一个索引清理周期以来收集的死亡元组数。


表 27.37. VACUUM的阶段

阶段 描述
初始化 VACUUM正在准备开始扫描堆。这个阶段应该很简短。
扫描堆 VACUUM正在扫描堆。如果需要,它将会对每个页面进行修建以及碎片整理,并且可能会执行冻结动作。heap_blks_scanned列可以用来监控扫描的进度。
清理索引 VACUUM当前正在清理索引。如果一个表拥有索引,那么每次清理时这个阶段会在堆扫描完成后至少发生一次。如果maintenance_work_mem不足以存放找到的死亡元组,则每次清理时会多次清理索引。
清理堆 VACUUM当前正在清理堆。清理堆与扫描堆不是同一个概念,清理堆发生在每一次清理索引的实例之后。如果heap_blks_scanned小于heap_blks_total,系统将在这个阶段完成之后回去扫描堆;否则,系统将在这个阶段完成后开始清理索引。
清除索引 VACUUM当前正在清除索引。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。
截断堆 VACUUM正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在清除完索引之后。
执行最后的清除 VACUUM在执行最终的清除。在这个阶段中,VACUUM将清理空闲空间映射、更新pg_class中的统计信息并且将统计信息报告给统计收集器。当这个阶段完成时,VACUUM也就结束了。

27.4.4. CLUSTER进度报告

每当CLUSTERVACUUM FULL运行时,pg_stat_progress_cluster视图将包含当前正在运行的每一个后台的记录。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。

表 27.38. pg_stat_progress_cluster 视图

列类型

描述

pid integer

后台的进程ID。

datid oid

该后端连接的数据库的OID。

datname name

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

relid oid

被集群的表的OID。

command text

正在运行的命令。CLUSTERVACUUM FULL

phase text

当前处理阶段。参见本文中的表 27.39。

cluster_index_relid oid

如果正在使用索引对表进行扫描,这就是正在使用的索引的OID;否则为0。

heap_tuples_scanned bigint

扫描的堆元组数。 这个计数器只有在阶段为seq scanning heap,index scanning heapwriting new heap时才会增进。

heap_tuples_written bigint

写入的堆元组的数量。这个计数器只有在阶段为seq scanning heap,index scanning heapwriting new heap时才会前进。

heap_blks_total bigint

表中的堆块总数。 这个数字是在seq scanning heap的开始时报告的。

heap_blks_scanned bigint

扫描的堆块数量。 这个计数器只有在阶段为seq scanning heap时才会增进。

index_rebuild_count bigint

重建的索引数。 该计数器仅在重建索引阶段时才会增进。


表 27.39. CLUSTER 和 VACUUM FULL 阶段

阶段 描述
初始化 该命令准备开始扫描堆栈。 这个阶段预计会非常短暂。
seq扫描堆 该命令目前采用顺序扫描的方式对表进行扫描。
索引扫描堆 CLUSTER目前正在使用索引扫描表。
元组排序 CLUSTER目前正在对元组进行排序。
新写入堆 CLUSTER目前正在编写新的堆。
交换关系文件 目前,该命令正在将新建立的文件调换到位。
重建索引 该命令目前正在重建一个索引。
清理 该命令正在执行最后的清理工作。 当此阶段完成后,CLUSTERVACUUM FULL将结束。

27.4.5. 基础备份进度报告

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

表 27.40. pg_stat_progress_basebackup 视图

列类型

描述

pid integer

WAL发送方进程ID。

phase text

目前的处理阶段。 参见本文中表 27.41。

backup_total bigint

将被流输送的数据总量。这是在streaming database files阶段开始时的估计和报告。 注意,这只是一个近似值,因为在streaming database files阶段,数据库可能会改变,而WAL日志可能会在稍后的备份中包含。 一旦流数据量超过了估计的总大小,该值始终与backup_streamed相同。 如果在pg_basebackup中禁用估算(也就是说,指定了--no-estimate-size选项),这为NULL

backup_streamed bigint

数据流的总量。这个计数器只在streaming database files阶段或transferring wal files时增进。

tablespaces_total bigint

要流输送的表空间总数。

tablespaces_streamed bigint

流输送的表空间数。此计数器仅在streaming database files阶段增进。


表 27.41. 基础备份阶段

阶段 描述
initializing WAL发送器进程正在准备开始备份。这个阶段预计会非常短暂。
waiting for checkpoint to finish WAL发送器进程目前正在执行pg_start_backup以准备进行基础备份,并等待启动备份检查点完成。
estimating backup size WAL发送程序目前正在估计将作为基础备份流传输的数据库文件的总量。
streaming database files WAL发送器当前正在流数据库文件作为基础备份。
waiting for wal archiving to finish WAL发送方进程目前正在执行pg_stop_backup以完成备份,并等待基础备份所需的所有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阶段之后。当此阶段完成时备份将结束。


PostgreSQL 查看锁
PostgreSQL 动态追踪
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }