PostgreSQL Progress Reporting

2021-09-01 17:15 更新
27.4.1. ANALYZE Progress Reporting
27.4.2. CREATE INDEX Progress Reporting
27.4.3. VACUUM進度報告
27.4.4. CLUSTER進度報告
27.4.5. 基礎(chǔ)備份進度報告

PostgreSQL具有在命令執(zhí)行過程中報告某些命令進度的能力。 目前,支持進度報告的命令只有ANALYZE,CLUSTER,CREATE INDEX, VACUUM, 和 BASE_BACKUP(例如 pg_basebackup 發(fā)出的進行基礎(chǔ)備份的復制命令。)。未來可能還會擴展。

27.4.1. ANALYZE Progress Reporting

每當ANALYZE運行時,pg_stat_progress_analyze視圖將包含當前運行該命令的每個后端的一行。 下面的表描述了將要報告的信息,并提供了關(guān)于如何解釋它們的信息。

表 27.32. pg_stat_progress_analyze 視圖

列類型

描述

pid integer

后端的進程ID。

datid oid

后端連接到的數(shù)據(jù)庫的OID。

datname name

后端連接到的數(shù)據(jù)庫的名稱。

relid oid

被分析的表的OID。

phase text

當前處理階段。參見 本文中的表 27.33。

sample_blks_total bigint

將被采樣的堆塊的總數(shù)。

sample_blks_scanned bigint

掃描的堆塊數(shù)量。

ext_stats_total bigint

擴展統(tǒng)計信息的數(shù)量。

ext_stats_computed bigint

已經(jīng)計算的擴展統(tǒng)計的數(shù)量. 此計數(shù)器僅在 computing extended statistics階段增進。

child_tables_total bigint

子表的數(shù)量。

child_tables_done bigint

掃描的子表數(shù)。此計數(shù)器只有在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 該命令從表掃描期間獲得的樣例行計算統(tǒng)計信息。
computing extended statistics 該命令從表掃描期間獲得的樣例行計算擴展統(tǒng)計信息。
finalizing analyze 該命令在更新pg_class。當此階段完成時,ANALYZE 將結(jié)束。

注意

注意當在分區(qū)表上運行ANALYZE時,它的所有分區(qū)也會被遞歸分析,如在ANALYZE中曾提到過。 在這種情況下,首先報告父表的ANALYZE進度,收集它的繼承統(tǒng)計信息,然后是每個分區(qū)的(繼承統(tǒng)計信息)。

27.4.2. CREATE INDEX Progress Reporting

每當運行CREATE INDEXREINDEX時,pg_stat_progress_create_index視圖將包含當前正在創(chuàng)建索引的每個后端的一行。 下面的表描述了將要報告的信息,并提供了關(guān)于如何解釋它的信息。

表 27.34. pg_stat_progress_create_index 視圖

列類型

描述

pid integer

后端的進程ID。

datid oid

后端連接到的數(shù)據(jù)庫的OID。

datname name

后端連接到的數(shù)據(jù)庫的名稱。

relid oid

正在創(chuàng)建索引的表的OID。

index_relid oid

正在創(chuàng)建或重建索引的OID。在非并發(fā) CREATE INDEX的時候,此為 0。

command text

在運行的命令: CREATE INDEX,CREATE INDEX CONCURRENTLY, REINDEX, 或 REINDEX CONCURRENTLY.

phase text

索引創(chuàng)建的當前處理階段。 參見本文中的表 27.35。

lockers_total bigint

在適用的情況下,需要等待的儲物柜總數(shù)

lockers_done bigint

已經(jīng)等待的儲物柜數(shù)量。

current_locker_pid bigint

目前正在等待的儲物柜的進程ID。

blocks_total bigint

本階段要處理的區(qū)塊總數(shù)。

blocks_done bigint

當前階段已經(jīng)處理的區(qū)塊數(shù)量。

tuples_total bigint

當前階段要處理的元組總數(shù)。

tuples_done bigint

在當前階段已經(jīng)處理的元組數(shù)量。

partitions_total bigint

在分區(qū)表上創(chuàng)建索引時,該列被設(shè)置為要在其上創(chuàng)建索引的分區(qū)總數(shù)。

partitions_done bigint

當在分區(qū)表上創(chuàng)建索引時,該列被設(shè)置為在其上完成索引的分區(qū)數(shù)。


表 27.35. CREATE INDEX 的階段

階段 描述
初始化 CREATE INDEXREINDEX正在準備創(chuàng)建索引。 這個階段預計會非常短暫。
構(gòu)建前等待讀寫器 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待有可能看到表的寫鎖的事務(wù)完成。 當不在并發(fā)模式時,這個階段會被跳過。lockers_total、 lockers_donecurrent_locker_pid 列包含了這個階段的進度信息。
新建索引 索引是由訪問方法專用代碼建立的。 在這一階段,支持進度報告的訪問方法填寫自己的進度數(shù)據(jù),子階段在這一欄中表示。 通常情況下,blocks_totalblocks_done將包含進度數(shù)據(jù),也可能包含tuples_totaltuples_done。
在驗證前等待讀寫器 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待有可能寫入表的事務(wù)完成寫鎖的事務(wù)。當不在并發(fā)模式時,這個階段會被跳過。lockers_total、 lockers_donecurrent_locker_pid 列包含了這個階段的進度信息。
索引驗證:掃描索引 CREATE INDEX CONCURRENTLY正在掃描索引,搜索需要驗證的圖元組。如果不是在并發(fā)模式下,這個階段會被跳過。列 blocks_total(設(shè)置為索引的總大?。┖?blocks_done包含了這個階段的進度信息。
指數(shù)驗證:排序元組 CREATE INDEX CONCURRENTLY正在對索引掃描階段的輸出進行排序。
索引驗證:掃描表 CREATE INDEX CONCURRENTLY正在掃描表,以驗證前兩個階段收集的索引圖元。當不在并發(fā)模式時,這個階段被跳過。blocks_total列(設(shè)置為表的總大小)和blocks_done列包含這個階段的進度信息。
等待舊照 CREATE INDEX CONCURRENTLYREINDEX CONCURRENTLY正在等待可能看到表的事務(wù)釋放快照。 當不處于并發(fā)模式時,這個階段會被跳過。 lockers_total、lockers_donecurrent_locker_pid 列包含了這個階段的進度信息。
標記 dead之前等待readers REINDEX CONCURRENTLY等待表上有讀鎖的事務(wù)完成后,再將舊索引標記為死索引。當不在并發(fā)模式時,這個階段被跳過。lockers_total、lockers_donecurrent_locker_pid 列包含了這個階段的進度信息。
在 dropping之前等待readers REINDEX CONCURRENTLY等待表上有讀鎖的事務(wù)完成后,再丟棄舊索引。當不在并發(fā)模式時,這個階段被跳過。列 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 節(jié).

表 27.36. pg_stat_progress_vacuum 視圖

列類型

描述

pid integer

后端的進程ID。

datid oid

這個后端連接的數(shù)據(jù)庫的OID。

datname name

這個后端連接的數(shù)據(jù)庫的名稱。

relid oid

被vacuum的表的OID。

phase text

vacuum的當前處理階段。參見本文中的表 27.37。

heap_blks_total bigint

該表中堆塊的總數(shù)。這個數(shù)字在掃描開始時報告,之后增加的塊將不會(并且不需要)被這個VACUUM訪問。

heap_blks_scanned bigint

被掃描的堆塊數(shù)量。由于visibility map被用來優(yōu)化掃描,一些塊將被跳過而不做檢查, 被跳過的塊會被包括在這個總數(shù)中,因此當清理完成時這個數(shù)字最終將會等于heap_blks_total。 僅當處于掃描堆階段時這個計數(shù)器才會前進。

heap_blks_vacuumed bigint

被清理的堆塊數(shù)量。除非表沒有索引,這個計數(shù)器僅在處于清理堆階段時才會前進。 不包含死亡元組的塊會被跳過,因此這個計數(shù)器可能有時會向前跳躍一個比較大的增量。

index_vacuum_count bigint

已完成的索引清理周期數(shù)。

max_dead_tuples bigint

在需要執(zhí)行一個索引清理周期之前我們可以存儲的死亡元組數(shù),取決于maintenance_work_mem。

num_dead_tuples bigint

從上一個索引清理周期以來收集的死亡元組數(shù)。


表 27.37. VACUUM的階段

階段 描述
初始化 VACUUM正在準備開始掃描堆。這個階段應(yīng)該很簡短。
掃描堆 VACUUM正在掃描堆。如果需要,它將會對每個頁面進行修建以及碎片整理,并且可能會執(zhí)行凍結(jié)動作。heap_blks_scanned列可以用來監(jiān)控掃描的進度。
清理索引 VACUUM當前正在清理索引。如果一個表擁有索引,那么每次清理時這個階段會在堆掃描完成后至少發(fā)生一次。如果maintenance_work_mem不足以存放找到的死亡元組,則每次清理時會多次清理索引。
清理堆 VACUUM當前正在清理堆。清理堆與掃描堆不是同一個概念,清理堆發(fā)生在每一次清理索引的實例之后。如果heap_blks_scanned小于heap_blks_total,系統(tǒng)將在這個階段完成之后回去掃描堆;否則,系統(tǒng)將在這個階段完成后開始清理索引。
清除索引 VACUUM當前正在清除索引。這個階段發(fā)生在堆被完全掃描并且對堆和索引的所有清理都已經(jīng)完成以后。
截斷堆 VACUUM正在截斷堆,以便把關(guān)系尾部的空頁面返還給操作系統(tǒng)。這個階段發(fā)生在清除完索引之后。
執(zhí)行最后的清除 VACUUM在執(zhí)行最終的清除。在這個階段中,VACUUM將清理空閑空間映射、更新pg_class中的統(tǒng)計信息并且將統(tǒng)計信息報告給統(tǒng)計收集器。當這個階段完成時,VACUUM也就結(jié)束了。

27.4.4. CLUSTER進度報告

每當CLUSTERVACUUM FULL運行時,pg_stat_progress_cluster視圖將包含當前正在運行的每一個后臺的記錄。下面的表格描述了將被報告的信息,并提供了關(guān)于如何解釋這些信息的信息。

表 27.38. pg_stat_progress_cluster 視圖

列類型

描述

pid integer

后臺的進程ID。

datid oid

該后端連接的數(shù)據(jù)庫的OID。

datname name

與此后端連接的數(shù)據(jù)庫的名稱。

relid oid

被集群的表的OID。

command text

正在運行的命令。CLUSTERVACUUM FULL。

phase text

當前處理階段。參見本文中的表 27.39。

cluster_index_relid oid

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

heap_tuples_scanned bigint

掃描的堆元組數(shù)。 這個計數(shù)器只有在階段為seq scanning heap,index scanning heapwriting new heap時才會增進。

heap_tuples_written bigint

寫入的堆元組的數(shù)量。這個計數(shù)器只有在階段為seq scanning heap,index scanning heapwriting new heap時才會前進。

heap_blks_total bigint

表中的堆塊總數(shù)。 這個數(shù)字是在seq scanning heap的開始時報告的。

heap_blks_scanned bigint

掃描的堆塊數(shù)量。 這個計數(shù)器只有在階段為seq scanning heap時才會增進。

index_rebuild_count bigint

重建的索引數(shù)。 該計數(shù)器僅在重建索引階段時才會增進。


表 27.39. CLUSTER 和 VACUUM FULL 階段

階段 描述
初始化 該命令準備開始掃描堆棧。 這個階段預計會非常短暫。
seq掃描堆 該命令目前采用順序掃描的方式對表進行掃描。
索引掃描堆 CLUSTER目前正在使用索引掃描表。
元組排序 CLUSTER目前正在對元組進行排序。
新寫入堆 CLUSTER目前正在編寫新的堆。
交換關(guān)系文件 目前,該命令正在將新建立的文件調(diào)換到位。
重建索引 該命令目前正在重建一個索引。
清理 該命令正在執(zhí)行最后的清理工作。 當此階段完成后,CLUSTERVACUUM FULL將結(jié)束。

27.4.5. 基礎(chǔ)備份進度報告

每當像pg_basebackup這樣的應(yīng)用程序進行基本備份時, pg_stat_progress_basebackup視圖將包含當前運行BASE_BACKUP復制命令和流備份的每個WAL發(fā)送進程的一行。 下面的表描述了將要報告的信息,并提供了關(guān)于如何解釋它的信息。

表 27.40. pg_stat_progress_basebackup 視圖

列類型

描述

pid integer

WAL發(fā)送方進程ID。

phase text

目前的處理階段。 參見本文中表 27.41。

backup_total bigint

將被流輸送的數(shù)據(jù)總量。這是在streaming database files階段開始時的估計和報告。 注意,這只是一個近似值,因為在streaming database files階段,數(shù)據(jù)庫可能會改變,而WAL日志可能會在稍后的備份中包含。 一旦流數(shù)據(jù)量超過了估計的總大小,該值始終與backup_streamed相同。 如果在pg_basebackup中禁用估算(也就是說,指定了--no-estimate-size選項),這為NULL。

backup_streamed bigint

數(shù)據(jù)流的總量。這個計數(shù)器只在streaming database files階段或transferring wal files時增進。

tablespaces_total bigint

要流輸送的表空間總數(shù)。

tablespaces_streamed bigint

流輸送的表空間數(shù)。此計數(shù)器僅在streaming database files階段增進。


表 27.41. 基礎(chǔ)備份階段

階段 描述
initializing WAL發(fā)送器進程正在準備開始備份。這個階段預計會非常短暫。
waiting for checkpoint to finish WAL發(fā)送器進程目前正在執(zhí)行pg_start_backup以準備進行基礎(chǔ)備份,并等待啟動備份檢查點完成。
estimating backup size WAL發(fā)送程序目前正在估計將作為基礎(chǔ)備份流傳輸?shù)臄?shù)據(jù)庫文件的總量。
streaming database files WAL發(fā)送器當前正在流數(shù)據(jù)庫文件作為基礎(chǔ)備份。
waiting for wal archiving to finish WAL發(fā)送方進程目前正在執(zhí)行pg_stop_backup以完成備份,并等待基礎(chǔ)備份所需的所有WAL文件成功存檔。 如果在pg_basebackup中指定了--wal-method=none--wal-method=stream,則備份將在此階段完成后結(jié)束。
transferring wal files WAL發(fā)送器進程正在傳輸備份過程中產(chǎn)生的所有WAL日志。 如果pg_basebackup中指定了--wal-method=fetch, 則該階段發(fā)生在waiting for wal archiving to finish階段之后。當此階段完成時備份將結(jié)束。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號