Postgresql 中文操作指南
28.4. Progress Reporting #
PostgreSQL 能够在命令执行期间报告特定命令的进度。目前,支持进度报告的唯一命令是 ANALYZE 、 CLUSTER 、 CREATE INDEX 、 VACUUM 、 COPY 和 BASE_BACKUP (即 pg_basebackup 发出以获取基本备份的复制命令)。这可能会在未来得到扩展。
28.4.1. ANALYZE Progress Reporting #
每当 ANALYZE 正在运行时,pg_stat_progress_analyze 视图将包含一行,针对当前正在运行该命令的每个后端。以下表格描述了将报告的信息,并提供有关如何解释该信息的信息。
Table 28.37. pg_stat_progress_analyze View
Column Type Description |
pid integer 后端的进程 ID。 |
datid oid 此后端已连接到的数据库的 OID。 |
datname name 此后端已连接到的数据库的名称。 |
relid oid 正在分析的表的 OID。 |
phase text 当前处理阶段。请参阅 Table 28.38 。 |
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 时有效。 |
Table 28.38. ANALYZE Phases
Phase |
Description |
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 将结束。 |
28.4.2. CLUSTER Progress Reporting #
无论何时运行 CLUSTER 或 VACUUM FULL,pg_stat_progress_cluster 视图都将包含一行,用于每个当前正在运行任一命令的后端。下表描述了将报告的信息,并提供有关如何解释该信息的信息。
Table 28.39. pg_stat_progress_cluster View
Column Type Description |
pid integer 后端的进程 ID。 |
datid oid 此后端已连接到的数据库的 OID。 |
datname name 此后端已连接到的数据库的名称。 |
relid oid 要聚集的表的 OID。 |
command text 正在运行的命令。可能是 CLUSTER 或 VACUUM FULL 。 |
phase text 当前的处理阶段。参见 Table 28.40 。 |
cluster_index_relid oid 如果使用索引扫描表,这是所用索引的 OID;否则为零。 |
heap_tuples_scanned bigint 扫描的堆元组数。此计数器仅在阶段为 seq scanning heap 、 index scanning heap 或 writing new heap 时才会增加。 |
heap_tuples_written bigint 写入的堆元组数。此计数器仅在阶段为 seq scanning heap 、 index scanning heap 或 writing new heap 时才会增加。 |
heap_blks_total bigint 表中的堆块总数。此数字报告自 seq scanning heap 开始。 |
heap_blks_scanned bigint 扫描的堆块数。此计数器仅在阶段为 seq scanning heap 时才会增加。 |
index_rebuild_count bigint 重建的索引数。此计数器仅在阶段为 rebuilding index 时才会增加。 |
Table 28.40. CLUSTER and VACUUM FULL Phases
Phase |
Description |
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 将结束。 |
28.4.3. COPY Progress Reporting #
每当 COPY 运行时,pg_stat_progress_copy 视图将为当前运行 COPY 命令的每个后端包含一行。下表描述了将报告的信息,并提供了如何解释这些信息的信息。
Table 28.41. pg_stat_progress_copy View
Column Type Description |
pid integer 后端的进程 ID。 |
datid oid 此后端已连接到的数据库的 OID。 |
datname name 此后端已连接到的数据库的名称。 |
relid oid 执行 COPY 命令时所用的表的 OID。如果从一个 SELECT 查询中复制,则将其设置为 0 。 |
command text 正在运行的命令: COPY FROM 或 COPY TO 。 |
type text 数据从中读取或写入到的 IO 类型: FILE 、 PROGRAM 、 PIPE (用于 COPY FROM STDIN 和 COPY 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 Progress Reporting #
每当 CREATE INDEX 或 REINDEX 正在运行时,pg_stat_progress_create_index 视图将为当前正在创建索引的每个后端包含一行。下表描述将报告的信息,并提供有关如何解释该信息的信息。
Table 28.42. pg_stat_progress_create_index View
Column Type Description |
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 当适用时,当前正在处理的索引创建阶段。请参阅 Table 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 要在其上创建或附加索引的分区总数,包括直接分区和间接分区。在 0 期间,或当索引未分区时。 |
partitions_done bigint 已创建或附加索引的分区数,包括直接分区和间接分区。在 REINDEX 期间,或当索引未分区时。 |
Table 28.43. CREATE INDEX Phases
Phase |
Description |
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 包含此阶段的进度信息。 |
28.4.5. VACUUM Progress Reporting #
只要_VACUUM_正在运行,_pg_stat_progress_vacuum_视图就会为每个后端(包括自动清理工作进程)包含一行,这些后端当前正在清理。下表描述了将报告的信息,并提供了有关如何解释该信息的说明。_VACUUM FULL_命令的进度通过_pg_stat_progress_cluster_报告,因为_VACUUM FULL_和_CLUSTER_都会重写该表,而常规_VACUUM_仅对其进行就地修改。请参阅 Section 28.4.2。
Table 28.44. pg_stat_progress_vacuum View
Column Type Description |
pid integer 后端的进程 ID。 |
datid oid 此后端已连接到的数据库的 OID。 |
datname name 此后端已连接到的数据库的名称。 |
relid oid 要清理的表的 OID。 |
phase text 清理的当前处理阶段。请参阅 Table 28.45 。 |
heap_blks_total bigint 表中堆块的总数。此数字在扫描开始时报告;稍后添加的块不会由这个 VACUUM 访问(也不需要访问)。 |
heap_blks_scanned bigint 已扫描的堆块数量。因为 visibility map 用来优化扫描,所以某些块将被跳过而不检查;跳过的块包含在此总数中,因此当清理完成时,此数字最终将等于 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 自上次索引清理周期以来收集的无效元组的数量。 |
Table 28.45. VACUUM Phases
Phase |
Description |
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 将结束。 |
28.4.6. Base Backup Progress Reporting #
每当 pg_basebackup 等应用程序进行基础备份时, pg_stat_progress_basebackup 视图将包含针对每个当前正在运行 BASE_BACKUP 复制命令并流传输备份的 WAL 发送器进程的一行。下表将介绍将报告的信息,并提供有关如何解释该信息的信息。
Table 28.46. pg_stat_progress_basebackup View
Column Type Description |
pid integer WAL 发送器进程进程 ID。 |
phase text 当前处理阶段。参见 Table 28.47 。 |
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 时才会增加。 |
Table 28.47. Base Backup Phases
Phase |
Description |
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 阶段之后发生。此阶段完成后备份将结束。 |