2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6

27.4. 進度報告 #

PostgreSQL 能夠報告某些命令在執行期間的進度。目前,唯一支援進度報告的命令是 ANALYZECLUSTERCREATE INDEXVACUUMCOPY 以及 BASE_BACKUP(即 pg_basebackup 用於建立基礎備份的複製命令)。未來可能會擴充套件此功能。

27.4.1. ANALYZE 進度報告 #

每當 ANALYZE 執行時,pg_stat_progress_analyze 檢視將包含一個行,對應一個當前正在執行該命令的後端。下表描述了將報告的資訊以及如何解釋這些資訊。

表 27.38. pg_stat_progress_analyze 檢視

列 型別

描述

pid integer

後端的程序 ID。

datid oid

此後端連線的資料庫的 OID。

datname name

此後端連線的資料庫的名稱。

relid oid

正在分析的表的 OID。

phase text

當前處理階段。請參見 表 27.39

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 時有效。

delay_time double precision

由於基於成本的延遲而花費的總睡眠時間(參見 第 19.10.2 節),以毫秒為單位(如果啟用了 track_cost_delay_timing,否則為零)。


表 27.39. ANALYZE 階段

階段 描述
initializing 命令正在準備開始掃描堆。此階段預計非常短暫。
acquiring sample rows 命令當前正在掃描由 relid 指定的表以獲取樣本行。
acquiring inherited sample rows 命令當前正在掃描子表以獲取樣本行。列 child_tables_totalchild_tables_donecurrent_child_table_relid 包含此階段的進度資訊。
computing statistics 命令正在根據在表掃描期間獲得的樣本行計算統計資訊。
computing extended statistics 命令正在根據在表掃描期間獲得的樣本行計算擴充套件統計資訊。
finalizing analyze 命令正在更新 pg_class。當此階段完成時,ANALYZE 將結束。

注意

請注意,當 ANALYZE 在沒有 ONLY 關鍵字的情況下應用於分割槽表時,其所有分割槽也將被遞迴分析。在這種情況下,ANALYZE 進度將首先報告給父表,收集其繼承統計資訊,然後報告給每個分割槽。

27.4.2. CLUSTER 進度報告 #

每當 CLUSTERVACUUM FULL 執行時,pg_stat_progress_cluster 檢視將包含一個行,對應一個當前正在執行其中一個命令的後端。下表描述了將報告的資訊以及如何解釋這些資訊。

表 27.40. pg_stat_progress_cluster 檢視

列 型別

描述

pid integer

後端的程序 ID。

datid oid

此後端連線的資料庫的 OID。

datname name

此後端連線的資料庫的名稱。

relid oid

正在聚類的表的 OID。

command text

正在執行的命令。可能是 CLUSTERVACUUM FULL

phase text

當前處理階段。請參見 表 27.41

cluster_index_relid oid

如果表正在使用索引進行掃描,則這是正在使用的索引的 OID;否則為零。

heap_tuples_scanned bigint

已掃描的堆元組數。此計數器僅在階段為 seq scanning heapindex scanning heapwriting new heap 時遞增。

heap_tuples_written bigint

已寫入的堆元組數。此計數器僅在階段為 seq scanning heapindex scanning heapwriting new heap 時遞增。

heap_blks_total bigint

表中堆塊的總數。此數字報告自 seq scanning heap 開始時的值。

heap_blks_scanned bigint

已掃描的堆塊數。此計數器僅在階段為 seq scanning heap 時遞增。

index_rebuild_count bigint

已重建的索引數。此計數器僅在階段為 rebuilding index 時遞增。


表 27.41. CLUSTER and 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 命令正在執行最終清理。當此階段完成後,CLUSTERVACUUM FULL 將結束。

27.4.3. COPY 進度報告 #

每當 COPY 執行時,pg_stat_progress_copy 檢視將包含一個行,對應一個當前正在執行 COPY 命令的後端。下表描述了將報告的資訊以及如何解釋這些資訊。

表 27.42. pg_stat_progress_copy 檢視

列 型別

描述

pid integer

後端的程序 ID。

datid oid

此後端連線的資料庫的 OID。

datname name

此後端連線的資料庫的名稱。

relid oid

COPY 命令執行所在表的 OID。如果從 SELECT 查詢複製,則設定為 0

command text

正在執行的命令:COPY FROMCOPY TO

type text

資料讀取或寫入的 I/O 型別:FILEPROGRAMPIPE(用於 COPY FROM STDINCOPY TO STDOUT)或 CALLBACK(例如,在邏輯複製的初始表同步期間使用)。

bytes_processed bigint

COPY 命令已處理的位元組數。

bytes_total bigint

對於 COPY FROM 命令,原始檔的大小(以位元組為單位)。如果不可用,則設定為 0

tuples_processed bigint

COPY 命令已處理的元組數。

tuples_excluded bigint

由於 COPY 命令的 WHERE 子句而被排除,因此未處理的元組數。

tuples_skipped bigint

由於包含格式錯誤的資料而跳過的元組數。此計數器僅在 ON_ERROR 選項指定的值不是 stop 時遞增。


27.4.4. CREATE INDEX 進度報告 #

每當 CREATE INDEXREINDEX 執行時,pg_stat_progress_create_index 檢視將包含一個行,對應一個當前正在建立索引的後端。下表描述了將報告的資訊以及如何解釋這些資訊。

表 27.43. 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 INDEXCREATE INDEX CONCURRENTLYREINDEXREINDEX CONCURRENTLY

phase text

索引建立的當前處理階段。請參見 表 27.44

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

需要建立或附加索引的總分割槽數,包括直接和間接分割槽。REINDEX 期間或索引未分割槽時為 0

partitions_done bigint

已建立或附加索引的分割槽數,包括直接和間接分割槽。REINDEX 期間或索引未分割槽時為 0


表 27.44. CREATE INDEX 階段

階段 描述
initializing CREATE INDEXREINDEX 正在準備建立索引。此階段預計非常短暫。
waiting for writers before build CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY 正在等待可能可以看到該表的具有寫鎖的事務完成。在此非併發模式下,此階段將被跳過。列 lockers_totallockers_donecurrent_locker_pid 包含此階段的進度資訊。
building index 索引正在透過特定於訪問方法的程式碼進行構建。在此階段,支援進度報告的訪問方法會填充其自己的進度資料,並且此列會指示子階段。通常,blocks_totalblocks_done 將包含進度資料,並且可能還包括 tuples_totaltuples_done
waiting for writers before validation CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY 正在等待可能寫入該表的具有寫鎖的事務完成。在此非併發模式下,此階段將被跳過。列 lockers_totallockers_donecurrent_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 CONCURRENTLYREINDEX CONCURRENTLY 正在等待可能看到該表的事務釋放其快照。在此非併發模式下,此階段將被跳過。列 lockers_totallockers_donecurrent_locker_pid 包含此階段的進度資訊。
waiting for readers before marking dead REINDEX CONCURRENTLY 正在等待具有表讀鎖的事務完成,然後才將舊索引標記為無效。在此非併發模式下,此階段將被跳過。列 lockers_totallockers_donecurrent_locker_pid 包含此階段的進度資訊。
waiting for readers before dropping REINDEX CONCURRENTLY 正在等待具有表讀鎖的事務完成,然後才刪除舊索引。在此非併發模式下,此階段將被跳過。列 lockers_totallockers_donecurrent_locker_pid 包含此階段的進度資訊。

27.4.5. VACUUM 進度報告 #

每當 VACUUM 執行時,pg_stat_progress_vacuum 檢視將包含一個行,對應一個當前正在 vacuuming 的後端(包括 autovacuum 工作程序)。下表描述了將報告的資訊以及如何解釋這些資訊。 VACUUM FULL 命令的進度透過 pg_stat_progress_cluster 報告,因為 VACUUM FULLCLUSTER 都會重寫表,而常規的 VACUUM 只會就地修改它。請參見 第 27.4.2 節

表 27.45. pg_stat_progress_vacuum 檢視

列 型別

描述

pid integer

後端的程序 ID。

datid oid

此後端連線的資料庫的 OID。

datname name

此後端連線的資料庫的名稱。

relid oid

正在 vacuuming 的表的 OID。

phase text

vacuum 的當前處理階段。請參見 表 27.46

heap_blks_total bigint

表中堆塊的總數。此數字報告自掃描開始時的值;稍後新增的塊不會(也不需要)被此 VACUUM 訪問。

heap_blks_scanned bigint

已掃描的堆塊數。由於使用 可見性圖 來最佳化掃描,因此一些塊會被跳過而無需檢查;跳過的塊包含在此總數中,因此當 vacuum 完成時,此數字最終將等於 heap_blks_total。此計數器僅在階段為 scanning heap 時遞增。

heap_blks_vacuumed bigint

已 vacuumed 的堆塊數。除非表沒有任何索引,否則此計數器僅在階段為 vacuuming heap 時遞增。包含沒有死元組的塊將被跳過,因此計數器有時會以大增量向前跳躍。

index_vacuum_count bigint

已完成的索引 vacuum 迴圈次數。

max_dead_tuple_bytes bigint

在我們能夠儲存的死元組資料量,在需要執行索引 vacuum 迴圈之前,基於 maintenance_work_mem

dead_tuple_bytes bigint

自上一個索引 vacuum 迴圈以來收集的死元組資料量。

num_dead_item_ids bigint

自上一個索引 vacuum 迴圈以來收集的死項識別符號數量。

indexes_total bigint

將要 vacuumed 或清理的總索引數。此數字在 vacuuming indexes 階段或 cleaning up indexes 階段開始時報告。

indexes_processed bigint

已處理的索引數。此計數器僅在階段為 vacuuming indexescleaning up indexes 時遞增。

delay_time double precision

由於基於成本的延遲而花費的總睡眠時間(參見 第 19.10.2 節),以毫秒為單位(如果啟用了 track_cost_delay_timing,否則為零)。這包括任何關聯的並行工作程序睡眠的時間。但是,並行工作程序報告其睡眠時間不頻繁於每秒一次,因此報告的值可能略有滯後。


表 27.46. VACUUM 階段

階段 描述
initializing VACUUM 正在準備開始掃描堆。此階段預計非常短暫。
scanning heap VACUUM 當前正在掃描堆。它將根據需要進行修剪和碎片整理,並可能執行凍結活動。heap_blks_scanned 列可用於監視掃描進度。
vacuuming indexes VACUUM 當前正在 vacuuming 索引。如果表有任何索引,這至少會發生一次 vacuum,在堆完全掃描之後。如果 maintenance_work_mem(或 autovacuum 的情況下,如果設定了 autovacuum_work_mem)不足以儲存找到的死元組數量,則每次 vacuum 可能會發生多次。
vacuuming heap VACUUM 當前正在 vacuuming 堆。堆的 vacuuming 與掃描堆不同,發生在每次索引 vacuum 之後。如果 heap_blks_scanned 小於 heap_blks_total,則在此階段完成後,系統將返回到掃描堆;否則,它將在該階段完成後開始清理索引。
cleaning up indexes VACUUM 當前正在清理索引。這發生在堆完全掃描以及所有索引和堆的 vacuuming 完成之後。
truncating heap VACUUM 當前正在截斷堆,以便將關係末尾的空頁返回給作業系統。這發生在清理索引之後。
performing final cleanup VACUUM 正在執行最終清理。在此階段,VACUUM 將 vacuum 空閒空間圖,更新 pg_class 中的統計資訊,並將統計資訊報告給累積統計系統。當此階段完成時,VACUUM 將結束。

27.4.6. Base Backup 進度報告 #

每當像 pg_basebackup 這樣的應用程式正在進行基礎備份時,pg_stat_progress_basebackup 檢視將包含一個行,對應一個當前正在執行 BASE_BACKUP 複製命令並流式傳輸備份的 WAL 傳送程序。下表描述了將報告的資訊以及如何解釋這些資訊。

表 27.47. pg_stat_progress_basebackup 檢視

列 型別

描述

pid integer

WAL 傳送程序的程序 ID。

phase text

當前處理階段。請參見 表 27.48

backup_total bigint

將要流式傳輸的資料總量。這是在 streaming database files 階段開始時估計和報告的。請注意,這只是一個近似值,因為資料庫在 streaming database files 階段可能會發生變化,WAL 日誌稍後可能會包含在備份中。一旦流式傳輸的資料量超過估計的總大小,此值始終與 backup_streamed 相同。如果在 pg_basebackup 中停用了估算(即,指定了 --no-estimate-size 選項),則此值為 NULL

backup_streamed bigint

已流式傳輸的資料量。此計數器僅在階段為 streaming database filestransferring wal files 時遞增。

tablespaces_total bigint

將要流式傳輸的表空間總數。

tablespaces_streamed bigint

已流式傳輸的表空間數。此計數器僅在階段為 streaming database files 時遞增。


表 27.48. Base Backup 階段

階段 描述
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 階段之後。備份將在該階段完成後結束。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步說明的內容,請使用 此表單 報告文件問題。