27.4. 进度报告 #
PostgreSQL 能够在某些命令执行期间报告其进度。目前,支持进度报告的命令只有 ANALYZE、COPY、CREATE INDEX、REPACK(以及其废弃拼写 CLUSTER)、VACUUM 和 BASE_BACKUP(即 pg_basebackup 用于创建基础备份的复制命令)。未来可能会扩展此功能。
27.4.1. ANALYZE 进度报告 #
每当 ANALYZE 运行时,pg_stat_progress_analyze 视图将包含当前运行该命令的每个后端的一行。下面的表描述了将要报告的信息,并提供了关于如何解释它们的信息。
表 27.41. pg_stat_progress_analyze 视图
列类型 描述 |
|---|
后端的进程 ID。 |
后端连接到的数据库的 OID。 |
后端连接到的数据库的名称。 |
被分析的表的 OID。 |
当前处理阶段。参见表 27.42。 |
将被采样的堆块的总数。 |
扫描的堆块数量。 |
扩展统计信息的数量。 |
已经计算的扩展统计信息数量。此计数器仅在 |
子表的数量。 |
扫描的子表数量。此计数器仅在 |
当前正在扫描的子表的 OID。此字段仅在 |
因基于代价的延迟而睡眠的总时间(参见第 19.10.2 节),以毫秒计(如果启用了 track_cost_delay_timing,否则为零)。 |
说明当前
|
表 27.42. 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 且未指定 ONLY 关键字时,其所有分区也会被递归分析。在这种情况下,会先报告父表的 ANALYZE 进度,并收集其继承统计信息,随后再报告每个分区的进度。
27.4.2. CLUSTER 进度报告 #
每当 REPACK、CLUSTER 或 VACUUM FULL 运行时,为向后兼容而保留的 pg_stat_progress_cluster 视图将为每个当前正在运行这些命令之一的后端包含一行。下面的表格描述了将被报告的信息,并提供了关于如何解释这些信息的信息。
表 27.43. pg_stat_progress_cluster 视图
列类型 描述 |
|---|
后端的进程 ID。 |
后端连接到的数据库的 OID。 |
后端连接到的数据库的名称。 |
正在聚簇的表的 OID。 |
正在运行的命令。 |
当前处理阶段。参见表 27.44。 |
定义重写后表的行顺序的索引 OID;如果未要求按索引排序,则为零。 |
扫描的堆元组数。该计数器仅在阶段为 |
写入的堆元组的数量。这个计数器只有在阶段为 |
表中的堆块总数。这个数字以 |
扫描的堆块数量。该计数器仅在阶段为 |
已重建的索引数。该计数器仅在 |
表 27.44. CLUSTER 和 VACUUM FULL 阶段
| 阶段 | 描述 |
|---|---|
initializing | 命令正在准备开始扫描堆。这个阶段预计会非常短暂。 |
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 将结束。
|
27.4.3. COPY 进度报告 #
当 COPY 正在运行时,pg_stat_progress_copy 视图会为每个当前正在执行 COPY 命令的后端包含一行。下表描述了会报告哪些信息,以及应如何解释这些信息。
表 27.45. pg_stat_progress_copy 视图
列类型 描述 |
|---|
后端的进程 ID。 |
后端连接到的数据库的 OID。 |
后端连接到的数据库的名称。 |
执行 |
正在运行的命令: |
读取或写入数据的 I/O 类型: |
已经被 |
|
已经被 |
没有处理的元组数,因为它们被 |
因包含格式错误的数据而被跳过的元组数。只有当 |
27.4.4. CREATE INDEX 进度报告 #
每当运行 CREATE INDEX 或 REINDEX 时,pg_stat_progress_create_index 视图将包含当前正在创建索引的每个后端的一行。下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。
表 27.46. pg_stat_progress_create_index 视图
列类型 描述 |
|---|
正在创建索引的后端的进程 ID。 |
后端连接到的数据库的 OID。 |
后端连接到的数据库的名称。 |
正在创建索引的表的 OID。 |
正在创建或重建索引的 OID。在非并发 |
具体命令类型: |
索引创建的当前处理阶段。参见表 27.47。 |
在适用的情况下,需要等待的持锁进程总数。 |
已完成等待的持锁进程数量。 |
当前正被等待的持锁进程的进程 ID。 |
本阶段要处理的块总数。 |
当前阶段已经处理的块数量。 |
当前阶段要处理的元组总数。 |
在当前阶段已经处理的元组数量。 |
要创建或附加索引的分区总数,包括直接分区和间接分区。在 |
已创建或附加索引的分区数量,包括直接分区和间接分区。在 |
表 27.47. CREATE INDEX 阶段
| 阶段 | 描述 |
|---|---|
initializing |
CREATE INDEX 或 REINDEX 正在准备创建索引。这个阶段预计会非常短暂。
|
waiting for writers before build |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待持有写锁且可能看到该表的事务结束。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
building index |
索引是由访问方法专用代码建立的。在这一阶段,支持进度报告的访问方法填写自己的进度数据,子阶段在这一栏中表示。通常情况下,blocks_total 和 blocks_done 将包含进度数据,tuples_total 和 tuples_done 也可能包含进度数据。
|
waiting for writers before validation |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待持有写锁且可能写入该表的事务结束。当不在并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
index validation: scanning index |
CREATE INDEX CONCURRENTLY 正在扫描索引,搜索需要验证的元组。如果不是并发模式,则会跳过此阶段。列 blocks_total(设为索引总大小)和 blocks_done 包含该阶段的进度信息。
|
index validation: sorting tuples |
CREATE INDEX CONCURRENTLY 正在对索引扫描阶段的输出进行排序。
|
index validation: scanning table |
CREATE INDEX CONCURRENTLY 正在扫描表,以验证前两个阶段收集的索引元组。如果不是并发模式,则会跳过此阶段。blocks_total 列(设为表总大小)和 blocks_done 列包含该阶段的进度信息。
|
waiting for old snapshots |
CREATE INDEX CONCURRENTLY 或 REINDEX CONCURRENTLY 正在等待可能看到表的事务释放快照。当不处于并发模式时,这个阶段会被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
waiting for readers before marking dead |
REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再将旧索引标记为死索引。当不在并发模式时,这个阶段被跳过。lockers_total、lockers_done 和 current_locker_pid 列包含了这个阶段的进度信息。
|
waiting for readers before dropping |
REINDEX CONCURRENTLY 等待表上有读锁的事务完成后,再丢弃旧索引。当不在并发模式时,这个阶段被跳过。列 lockers_total、lockers_done 和 current_locker_pid 包含了这个阶段的进度信息。
|
27.4.5. REPACK 进度报告 #
每当 REPACK、CLUSTER 或 VACUUM FULL 运行时,pg_stat_progress_repack 视图将为每个当前正在运行这些命令之一的后端包含一行。下面的表格描述了将要报告的信息,并提供了关于如何解释这些信息的信息。
表 27.48. pg_stat_progress_repack 视图
列类型 描述 |
|---|
后端的进程 ID。 |
后端连接到的数据库的 OID。 |
后端连接到的数据库的名称。 |
正在处理的表的 OID。 |
正在运行的命令。可以是 |
当前处理阶段。参见表 27.49。 |
定义重写后表的行顺序的索引 OID;如果未要求按索引排序,则为零。 |
扫描的堆元组数。该计数器仅在阶段为 |
插入的堆元组数。该计数器仅在 |
更新的堆元组数。该计数器仅在 |
删除的堆元组数。该计数器仅在 |
表中的堆块总数。这个数字以 |
扫描的堆块数量。该计数器仅在阶段为 |
已重建的索引数。该计数器仅在 |
表 27.49. REPACK 阶段
| 阶段 | 描述 |
|---|---|
initializing | 命令正在准备开始扫描堆。这个阶段预计会非常短暂。 |
seq scanning heap | 该命令目前采用顺序扫描的方式对表进行扫描。 |
index scanning heap |
REPACK 正在使用索引扫描表。
|
sorting tuples |
REPACK 正在对元组排序。
|
writing new heap |
REPACK 正在写入新的堆。
|
catch-up |
REPACK CONCURRENTLY 正在处理其他事务在前述任一阶段执行的 DML 命令。
|
swapping relation files | 目前,该命令正在将新建立的文件调换到位。 |
rebuilding index | 该命令目前正在重建一个索引。 |
performing final cleanup |
命令正在执行最终清理。当此阶段完成时,REPACK 将结束。
|
27.4.6. VACUUM 进度报告 #
只要 VACUUM 正在运行,pg_stat_progress_vacuum 视图就会为每个当前正在清理的后端(包括自动清理工作进程)包含一行。下表描述了将报告的信息,并说明如何解释这些信息。VACUUM FULL 命令的进度通过 pg_stat_progress_repack 报告,也可以通过为向后兼容而保留的 pg_stat_progress_cluster 查看,因为 VACUUM FULL 和 CLUSTER 都会重写表,而常规的 VACUUM 只会原地修改表。第 27.4.5 节和第 27.4.2 节对此有详细说明。
表 27.50. pg_stat_progress_vacuum 视图
列类型 描述 |
|---|
后端的进程 ID。 |
后端连接到的数据库的 OID。 |
后端连接到的数据库的名称。 |
正在清理的表的 OID。 |
清理的当前处理阶段。参见表 27.51。 |
该表中堆块的总数。这个数字以扫描开始时的数量为准,之后增加的块将不会(并且不需要)被这个 |
被扫描的堆块数量。由于可见性映射被用来优化扫描,一些块将被跳过而不做检查,被跳过的块会被包括在这个总数中,因此当清理完成时这个数字最终将会等于 |
被清理的堆块数量。除非表没有索引,这个计数器仅在处于 |
已完成的索引清理周期数。 |
在需要执行索引清理周期之前可存储的死亡元组数据量,取决于 maintenance_work_mem。 |
自上一个索引清理周期以来收集到的死亡元组数据量。 |
自上一个索引清理周期以来收集到的死项标识符数量。 |
将要执行清理或收尾清理的索引总数。该数字会在 |
已处理的索引数量。该计数器只会在 |
因基于代价的延迟而睡眠的总时间(参见第 19.10.2 节),以毫秒计(如果启用了 track_cost_delay_timing,否则为零)。这包括任何相关并行工作进程的睡眠时间;不过,并行工作进程最多每秒才会上报一次自己的睡眠时间,因此该值可能略有滞后。 |
当前
|
说明当前
|
表 27.51. VACUUM 阶段
| 阶段 | 描述 |
|---|---|
initializing |
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 当前正在进行索引收尾清理。这个阶段发生在堆被完全扫描并且对堆和索引的所有清理都已经完成以后。
|
truncating heap |
VACUUM 正在截断堆,以便把关系尾部的空页面返还给操作系统。这个阶段发生在索引收尾清理完成之后。
|
performing final cleanup |
VACUUM 正在执行最终清理。在此阶段,VACUUM 将清理空闲空间映射,更新 pg_class 中的统计信息,并向累积统计系统报告统计信息。当此阶段完成时,VACUUM 将结束。
|
27.4.7. 基础备份进度报告 #
每当像 pg_basebackup 这样的应用程序执行基础备份时,pg_stat_progress_basebackup 视图将包含当前运行 BASE_BACKUP 复制命令和流式传输备份的每个 WAL 发送进程的一行。下面的表描述了将要报告的信息,并提供了关于如何解释它的信息。
表 27.52. pg_stat_progress_basebackup 视图
列类型 描述 |
|---|
WAL 发送进程的进程 ID。 |
当前处理阶段。参见表 27.53。 |
将被流式传输的数据总量。该值在 |
已流式传输的数据量。该计数器仅在 |
将要流式传输的表空间总数。 |
已流式传输的表空间数量。此计数器仅在 |
备份类型。可以是 |
表 27.53. 基础备份阶段
| 阶段 | 描述 |
|---|---|
initializing | WAL 发送进程正在准备开始备份。这个阶段预计会非常短暂。 |
waiting for checkpoint to finish |
WAL 发送进程当前正在执行 pg_backup_start 以准备进行基础备份,并等待备份起始检查点完成。
|
estimating backup size | WAL 发送进程当前正在估算将作为基础备份流式传输的数据库文件总量。 |
streaming database files | WAL 发送进程当前正将数据库文件作为基础备份进行流式传输。 |
waiting for wal archiving to finish |
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 阶段之后。当此阶段完成时备份将结束。
|