本節介紹的函式用於控制和監視 PostgreSQL 安裝。
表 9.95 顯示了用於查詢和更改執行時配置引數的函式。
表 9.95. 配置設定函式
函式 描述 示例 |
---|
返回設定
|
將引數
|
表 9.96 中顯示的函式向其他伺服器程序傳送控制訊號。預設情況下,這些函式的使用僅限於超級使用者,但可以透過 GRANT
將訪問許可權授予其他人,並附帶注意事項。 Table 9.96 shows the functions available to send control signals to other server processes. Use of these functions is restricted to superusers by default but access may be granted to others using GRANT
, with noted exceptions.
如果訊號成功傳送,則每個函式返回 true
,如果傳送訊號失敗,則返回 false
。
表 9.96. 伺服器訊號函式
函式 描述 |
---|
取消具有指定程序 ID 的會話的當前查詢。如果呼叫角色是正在被取消的後端所屬角色的成員,或者呼叫角色具有 |
請求記錄指定程序 ID 的後端記憶體上下文。此函式可以向除日誌記錄器以外的後端和輔助程序傳送請求。這些記憶體上下文將以 |
使 PostgreSQL 伺服器的所有程序重新載入其配置檔案。(這透過向 postmaster 程序傳送 SIGHUP 訊號來啟動,postmaster 程序再將 SIGHUP 傳送給其每個子程序。)在重新載入之前,您可以使用 |
指示日誌檔案管理器立即切換到新的輸出檔案。這僅在內建日誌收集器執行時才有效,否則不存在日誌檔案管理器子程序。 |
終止具有指定程序 ID 的後端程序的會話。如果呼叫角色是正在被終止的後端所屬角色的成員,或者呼叫角色具有 如果未指定 |
pg_cancel_backend
和 pg_terminate_backend
向由程序 ID 標識的後端程序傳送訊號(分別為 SIGINT 或 SIGTERM)。活動後端的程序 ID 可以從 pg_stat_activity
檢視的 pid
列中找到,或者透過列出伺服器上的 postgres
程序(在 Unix 上使用 ps,在 Windows 上使用 任務管理器)來找到。活動後端的角色可以從 pg_stat_activity
檢視的 usename
列中找到。
pg_log_backend_memory_contexts
可用於記錄後端程序的記憶體上下文。例如
postgres=# SELECT pg_log_backend_memory_contexts(pg_backend_pid()); pg_log_backend_memory_contexts -------------------------------- t (1 row)
將為每個記憶體上下文記錄一條訊息。例如
LOG: logging memory contexts of PID 10377 STATEMENT: SELECT pg_log_backend_memory_contexts(pg_backend_pid()); LOG: level: 1; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used LOG: level: 2; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used LOG: level: 2; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used LOG: level: 2; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used LOG: level: 2; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used LOG: level: 2; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used LOG: level: 2; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used LOG: level: 2; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used ... LOG: level: 2; ErrorContext: 8192 total in 1 blocks; 7928 free (3 chunks); 264 used LOG: Grand total: 1651920 bytes in 201 blocks; 622360 free (88 chunks); 1029560 used
如果同一父級下有超過 100 個子上下文,則會記錄前 100 個子上下文,並附帶剩餘上下文的摘要。請注意,頻繁呼叫此函式可能會帶來顯著的開銷,因為它可能會生成大量日誌訊息。
表 9.97 中顯示的函式有助於進行線上備份。這些函式不能在恢復期間執行(除了 pg_backup_start
、pg_backup_stop
和 pg_wal_lsn_diff
)。
有關這些函式的正確用法,請參閱 Section 25.3。
表 9.97. 備份控制函式
函式 描述 |
---|
在寫預日誌 (WAL) 中建立一個命名的標記記錄,該記錄以後可用作恢復目標,並返回相應的寫預日誌位置。然後可以使用給定的名稱與 recovery_target_name 一起指定恢復將進行到的點。避免建立具有相同名稱的多個還原點,因為恢復將在第一個名稱與恢復目標匹配的位置停止。 預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。 |
返回當前的寫預日誌重新整理位置(請參閱下面的註釋)。 |
返回當前的寫預日誌插入位置(請參閱下面的註釋)。 |
返回當前的寫預日誌寫入位置(請參閱下面的註釋)。 |
準備伺服器開始線上備份。唯一必需的引數是備份的使用者自定義標籤。(通常這是備份轉儲檔案將儲存的名稱。)如果提供了可選的第二個引數 預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。 |
完成線上備份。備份標籤檔案和表空間對映檔案的所需內容作為函式結果的一部分返回,並且必須寫入備份區域的檔案中。這些檔案不得寫入即時資料目錄(這樣做會導致 PostgreSQL 在發生崩潰時無法重新啟動)。 有一個可選的 在主伺服器上執行時,此函式還會在寫預日誌歸檔區域建立一個備份歷史檔案。歷史檔案包括傳遞給 函式的結果是一個記錄。 預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。 |
強制伺服器切換到新的寫預日誌檔案,這允許當前檔案被歸檔(假定您正在使用連續歸檔)。結果是剛剛完成的寫預日誌檔案中的結束寫預日誌位置加 1。如果自上次寫預日誌切換以來沒有寫預日誌活動,則 預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。 |
將寫預日誌位置轉換為包含該位置的 WAL 檔案的名稱。 |
將寫預日誌位置轉換為 WAL 檔名以及該檔案中的位元組偏移量。 |
從 WAL 檔名中提取序列號和時間線 ID。 |
計算兩個寫預日誌位置之間的位元組差( |
pg_current_wal_lsn
以與上述函式相同的格式顯示當前的寫預日誌寫入位置。類似地,pg_current_wal_insert_lsn
顯示當前的寫預日誌插入位置,pg_current_wal_flush_lsn
顯示當前的寫預日誌重新整理位置。插入位置是任何瞬時的寫預日誌的 “邏輯” 結尾,而寫入位置是已實際從伺服器內部緩衝區寫入的結尾,重新整理位置是已寫入持久儲存的最後一個已知位置。寫入位置是伺服器外部可檢查的結尾,通常是您在希望歸檔部分完成的寫預日誌檔案時想要使用的。插入位置和重新整理位置主要用於伺服器除錯目的。這些都是隻讀操作,不需要超級使用者許可權。
您可以使用 pg_walfile_name_offset
從 pg_lsn
值中提取相應的寫預日誌檔名和位元組偏移量。例如
postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn); file_name | file_offset --------------------------+------------- 00000001000000000000000D | 4039624 (1 row)
類似地,pg_walfile_name
僅提取寫預日誌檔名。
pg_split_walfile_name
對於計算一個LSN從檔案偏移量和 WAL 檔名中,例如
postgres=# \set file_name '000000010000000100C000AB' postgres=# \set offset 256 postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset AS lsn FROM pg_split_walfile_name(:'file_name') pd, pg_show_all_settings() ps WHERE ps.name = 'wal_segment_size'; lsn --------------- C001/AB000100 (1 row)
表 9.98 中顯示的函式提供有關備用伺服器當前狀態的資訊。這些函式可以在恢復期間和正常執行時執行。
表 9.98. 恢復資訊函式
表 9.99 中顯示的函式控制恢復的進度。這些函式只能在恢復期間執行。
表 9.99. 恢復控制函式
pg_wal_replay_pause
和 pg_wal_replay_resume
在提升進行期間無法執行。如果提升被觸發而恢復正在暫停,則暫停狀態結束,提升繼續。
如果流複製被停用,暫停狀態可能會無限期地持續而不會出現問題。如果流複製正在進行,WAL 記錄將繼續接收,這最終會填滿可用磁碟空間,具體取決於暫停時間、WAL 生成速率和可用磁碟空間。
PostgreSQL 允許資料庫會話同步其快照。一個 快照 決定了使用快照的事務可以看到哪些資料。當兩個或多個會話需要看到資料庫中完全相同的內容時,需要同步快照。如果兩個會話獨立開始事務,總有可能在執行兩個 START TRANSACTION
命令之間有第三個事務提交,這樣其中一個會話會看到該事務的影響而另一個不會。
為了解決這個問題,PostgreSQL 允許事務 匯出 它正在使用的快照。只要匯出事務保持開啟狀態,其他事務就可以 匯入 它的快照,從而保證它們看到與第一個事務完全相同的資料庫檢視。但請注意,這些事務中的任何一個所做的任何資料庫更改對其他事務仍然是不可見的,就像未提交事務所做的更改通常那樣。因此,事務在預先存在的資料方面是同步的,但在它們自己所做的更改方面則正常執行。
快照透過 pg_export_snapshot
函式匯出(見 表 9.100),並透過 SET TRANSACTION 命令匯入。
表 9.100. 快照同步函式
函式 描述 |
---|
儲存事務的當前快照,並返回一個標識該快照的 如果需要,事務可以匯出多個快照。請注意,這樣做僅在 |
捕獲正在執行的事務的快照並將其寫入 WAL,而無需等待 bgwriter 或 checkpointer 寫入日誌。這對於備用伺服器上的邏輯解碼非常有用,因為邏輯槽的建立必須等到此類記錄在備用伺服器上重放。 |
表 9.101 中顯示的函式用於控制和互動複製功能。有關底層功能的資訊,請參閱 Section 26.2.5、Section 26.2.6 和 Chapter 48。預設情況下,僅允許超級使用者使用複製原點函式,但可以透過使用 GRANT
命令允許其他使用者使用。複製槽函式僅限於超級使用者和具有 REPLICATION
許可權的使用者。
這些函式中的許多都等效於複製協議中的命令;請參閱 Section 54.4。
Section 9.28.3、Section 9.28.4 和 Section 9.28.5 中描述的函式也與複製相關。
表 9.101. 複製管理函式
函式 描述 |
---|
建立一個名為 |
刪除名為 |
使用輸出外掛 |
將名為 |
將名為 |
返回槽 |
行為與 |
行為與 |
行為與 |
推進名為 |
使用給定的外部名稱建立複製源,並返回分配給它的內部 ID。名稱的最大長度為 512 位元組。 |
刪除先前建立的複製源,包括任何相關的重放進度。 |
根據名稱查詢複製源並返回內部 ID。如果找不到這樣的複製源,則返回 |
將當前會話標記為從給定的源進行重放,從而允許跟蹤重放進度。只能在未選擇任何源時使用。使用 |
取消 |
如果當前會話中已選擇複製源,則返回 true。 |
返回當前會話中選擇的複製源的重放位置。引數 |
將當前事務標記為重放一個在給定LSN時間戳提交的事務。只能在已使用 |
取消 |
將給定節點的複製進度設定為給定位置。這主要用於設定初始位置,或在配置更改後設置新位置。請注意,粗心地使用此函式可能會導致資料複製不一致。 |
返回給定複製源的重放位置。引數 |
發出邏輯解碼訊息。這可以用來透過 WAL 將通用訊息傳遞給邏輯解碼外掛。 |
將邏輯故障轉移複製槽從主伺服器同步到備用伺服器。此函式只能在備用伺服器上執行。臨時的同步槽(如果存在)不能用於邏輯解碼,並且必須在升級後刪除。有關詳細資訊,請參閱 第 47.2.3 節。請注意,此函式主要用於測試和除錯目的,應謹慎使用。此外,如果啟用了 注意如果在執行函式後,備用伺服器上的 |
表中顯示的函式(表 9.102)計算資料庫物件的磁碟空間使用情況,或輔助呈現或理解使用情況的結果。bigint
結果以位元組為單位。如果將 OID 傳遞給其中一個函式,而該 OID 不代表現有物件,則返回 NULL
。
表 9.102. 資料庫物件大小函式
函式 描述 |
---|
顯示儲存任何單個數據值所使用的位元組數。如果直接應用於表列值,則反映了所進行的任何壓縮。 |
顯示用於壓縮單個可變長度值的壓縮演算法。如果值未壓縮,則返回 |
顯示已壓縮到磁碟的值的 |
計算指定名稱或 OID 的資料庫使用的總磁碟空間。要使用此函式,您必須對指定的資料庫擁有 |
計算附加到指定表的索引使用的總磁碟空間。 |
計算指定關係的一個 “fork” 使用的磁碟空間。(請注意,在大多數情況下,使用更高級別的函式 |
將人類可讀格式的大小(由 |
將位元組大小轉換為更易於人類閱讀的格式,並附帶大小單位(根據需要為位元組、kB、MB、GB、TB 或 PB)。請注意,單位是 2 的冪而不是 10 的冪,因此 1kB 是 1024 位元組,1MB 是 10242 = 1048576 位元組,以此類推。 |
計算指定表使用的磁碟空間,不包括索引(但包括其 TOAST 表(如果存在)、空閒空間對映和視覺化對映)。 |
計算指定名稱或 OID 的表空間使用的總磁碟空間。要使用此函式,您必須對指定的表空間擁有 |
計算指定表使用的總磁碟空間,包括所有索引和TOAST資料。結果等同於 |
上述操作表或索引的函式接受 regclass
引數,該引數只是 pg_class
系統目錄中的表或索引的 OID。但是,您不必手動查詢 OID,因為 regclass
資料型別的輸入轉換器會為您完成這項工作。有關詳細資訊,請參閱 第 8.19 節。
表中顯示的函式(表 9.103)有助於識別與資料庫物件關聯的特定磁碟檔案。
表 9.103. 資料庫物件位置函式
函式 描述 |
---|
返回當前分配給指定關係的 “filenode” 號。filenode 是用於關係的(檔案)名稱的基本組成部分(有關更多資訊,請參閱 第 66.1 節)。對於大多數關係,結果與 |
返回關係的完整檔案路徑名(相對於資料庫叢集的資料目錄 |
給定表空間 OID 和儲存它的 filenode,返回關係的 OID。這基本上是 |
表 9.104 列出了用於管理排序規則的函式。
表 9.104. 排序規則管理函式
函式 描述 |
---|
返回排序規則物件在作業系統中當前安裝的實際版本。如果此版本與 |
返回資料庫排序規則在作業系統中當前安裝的實際版本。如果此版本與 |
基於作業系統中找到的所有區域設定,將排序規則新增到系統目錄 |
表 9.105 列出了用於操作統計資訊的函式。這些函式不能在恢復期間執行。
對這些統計資訊操作函式所做的更改很可能被 autovacuum(或手動 VACUUM
或 ANALYZE
)覆蓋,應視為臨時性的。
表 9.105. 資料庫物件統計資訊操作函式
函式 描述 |
---|
更新表級統計資訊。通常,這些統計資訊會在 VACUUM 或 ANALYZE 中自動收集或更新,因此無需呼叫此函式。但是,在恢復後,如果尚未執行 跟蹤的統計資訊可能因版本而異,因此引數以 SELECT pg_restore_relation_stats( ' 例如,要為表 SELECT pg_restore_relation_stats( 'schemaname', 'myschema', 'relname', 'mytable', 'relpages', 173::integer, 'reltuples', 10000::real); 引數 此外,此函式接受引數名稱 次要錯誤將報告為 呼叫者必須擁有表上的 |
清除給定關係的表級統計資訊,就像表是新建立的一樣。 呼叫者必須擁有表上的 |
建立或更新列級統計資訊。通常,這些統計資訊會在 VACUUM 或 ANALYZE 中自動收集或更新,因此無需呼叫此函式。但是,在恢復後,如果尚未執行 跟蹤的統計資訊可能因版本而異,因此引數以 SELECT pg_restore_attribute_stats( ' 例如,要為表 SELECT pg_restore_attribute_stats( 'schemaname', 'myschema', 'relname', 'mytable', 'attname', 'col1', 'inherited', false, 'avg_width', 125::integer, 'null_frac', 0.5::real); 必需的引數是 此外,此函式接受引數名稱 次要錯誤將報告為 呼叫者必須擁有表上的 |
清除給定關係和屬性的列級統計資訊,就像表是新建立的一樣。 呼叫者必須擁有表上的 |
表 9.106 列出了提供分割槽表結構資訊的函式。
表 9.106. 分割槽資訊函式
例如,要檢查分割槽表 measurement
中包含的資料的總大小,可以使用以下查詢
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size FROM pg_partition_tree('measurement');
表 9.107 顯示了可用於索引維護任務的函式。(請注意,這些維護任務通常由 autovacuum 自動完成;只有在特殊情況下才需要使用這些函式。)這些函式不能在恢復期間執行。這些函式的用法僅限於超級使用者和給定索引的所有者。
表 9.107. 索引維護函式
函式 描述 |
---|
掃描指定的 BRIN 索引以查詢基表中的頁面範圍,這些頁面範圍當前未被索引摘要;對於任何此類範圍,它透過掃描這些表頁面來建立一個新的摘要索引元組。返回插入到索引中的新頁面範圍摘要的數量。 |
如果尚未摘要,則摘要覆蓋給定塊的頁面範圍。這類似於 |
如果存在,則刪除摘要覆蓋給定表塊的頁面範圍的 BRIN 索引元組。 |
透過將指定 GIN 索引的“待處理”列表中的條目批次移動到主 GIN 資料結構來清理它。返回從待處理列表中移除的頁面數。如果引數是使用 |
表 9.108 中顯示的函式提供了對託管伺服器的機器上的檔案的本機訪問。除非使用者是超級使用者或被授予 pg_read_server_files
角色,否則只能訪問資料庫叢集目錄和 log_directory
內的檔案。對於叢集目錄中的檔案,請使用相對路徑;對於日誌檔案,請使用與 log_directory
配置設定匹配的路徑。
請注意,授予使用者對 pg_read_file()
或相關函式的 EXECUTE 許可權,允許他們讀取資料庫伺服器程序可以讀取的伺服器上的任何檔案;這些函式會繞過所有資料庫內的許可權檢查。這意味著,例如,具有此類訪問許可權的使用者可以讀取儲存身份驗證資訊的 pg_authid
表的內容,以及讀取資料庫中的任何表資料。因此,應仔細考慮授予對這些函式的訪問許可權。
在授予這些函式的許可權時,請注意,顯示可選引數的表條目大多實現為具有不同引數列表的多個物理函式。如果需要使用,則必須分別授予對每個此類函式的許可權。psql 的 \df
命令可以幫助檢查實際的函式簽名。
其中一些函式接受一個可選的 missing_ok
引數,該引數指定檔案或目錄不存在時的行為。如果為 true
,則函式將返回 NULL
或適當的空結果集。如果為 false
,則會引發錯誤。(任何其他非“檔案未找到”的失敗條件都會被報告為錯誤。)預設值為 false
。
表 9.108. 通用檔案訪問函式
表 9.109 中顯示的函式用於管理勸告性鎖。有關這些函式的正確使用方法的詳細資訊,請參閱第 13.3.5 節。
所有這些函式都旨在用於鎖定應用程式定義的資源,這些資源可以透過單個 64 位鍵值或兩個 32 位鍵值來標識(請注意,這兩個鍵空間不重疊)。如果另一個會話已經持有同一資源識別符號上的衝突鎖,則這些函式將根據函式的適用性,要麼等待資源可用,要麼返回 false
結果。鎖可以是共享的或排他的:共享鎖與同一資源上的其他共享鎖不衝突,只與排他鎖衝突。鎖可以是會話級別的(因此它們會一直持有到釋放或會話結束),也可以是事務級別的(因此它們會一直持有到當前事務結束;沒有手動釋放的機制)。多個會話級鎖請求會堆疊,因此如果同一資源識別符號被鎖定三次,則必須有三個解鎖請求才能在會話結束前釋放該資源。
表 9.109. 勸告性鎖函式
如果您在文件中看到任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。