本節描述的函數用於控制和監控 PostgreSQL 安裝。
表格 9.93 顯示可用於查詢和更改執行階段組態參數的函數。
表格 9.93. 組態設定函數
函數
描述
範例
|
current_setting ( setting_name text [, missing_ok boolean ] ) → text
傳回設定 setting_name 的目前值。 如果沒有此設定,current_setting 將會拋出錯誤,除非提供 missing_ok 且為 true (在這種情況下,將傳回 NULL)。 此函數對應於SQL指令 SHOW。
current_setting('datestyle') → ISO, MDY
|
set_config ( setting_name text , new_value text , is_local boolean ) → text
將參數 setting_name 設定為 new_value ,並傳回該值。 如果 is_local 為 true ,則新值僅在目前交易期間適用。 如果您希望新值適用於目前會期的其餘部分,請改用 false 。 此函數對應於 SQL 指令 SET。
set_config('log_statement_stats', 'off', false) → off
|
表格 9.94 中顯示的函數會將控制訊號傳送到其他伺服器程序。 預設情況下,這些函數的使用僅限於超級使用者,但可以使用 GRANT
將存取權授予其他人,但有註明的例外情況。
如果成功傳送訊號,則這些函數中的每一個都會傳回 true
,如果傳送訊號失敗,則傳回 false
。
表格 9.94. 伺服器訊號函數
函數
描述
|
pg_cancel_backend ( pid integer ) → boolean
取消後端程序具有指定程序 ID 的會期的目前查詢。 如果呼叫的角色是正在取消其後端的角色的成員,或者呼叫的角色具有 pg_signal_backend 的權限,也允許這樣做,但是只有超級使用者可以取消超級使用者後端。
|
pg_log_backend_memory_contexts ( pid integer ) → boolean
要求記錄具有指定程序 ID 的後端的記憶體環境。 此函數可以將請求傳送到後端和輔助程序,除了記錄器之外。 這些記憶體環境將以 LOG 訊息層級記錄。 它們將根據設定的記錄組態出現在伺服器記錄中 (有關詳細資訊,請參閱 第 19.8 節),但無論 client_min_messages 如何,都不會傳送到用戶端。
|
pg_reload_conf () → boolean
使 PostgreSQL 伺服器的所有程序重新載入它們的組態檔。(這是透過傳送 SIGHUP 訊號到 postmaster 程序來啟動的,postmaster 程序接著會傳送 SIGHUP 到其每個子程序。)您可以使用 pg_file_settings 、pg_hba_file_rules 以及 pg_ident_file_mappings 檢視來檢查組態檔是否有錯誤,然後再重新載入。
|
pg_rotate_logfile () → boolean
發出訊號給日誌檔管理員,要求立即切換到新的輸出檔。只有在內建的日誌收集器正在執行時才有效,否則沒有日誌檔管理員子程序。
|
pg_terminate_backend ( pid integer , timeout bigint DEFAULT 0 ) → boolean
終止後端程序擁有指定程序 ID 的會話。如果呼叫角色是正被終止後端的角色成員,或呼叫角色擁有 pg_signal_backend 的權限,也允許這樣做,但只有超級使用者可以終止超級使用者後端。
如果未指定 timeout 或為零,則無論程序是否實際終止,此函數都會傳回 true ,僅表示訊號已成功傳送。如果指定了 timeout (以毫秒為單位)且大於零,則該函數會等待直到程序實際終止或經過給定的時間。如果程序終止,該函數將傳回 true 。如果逾時,則會發出警告並傳回 false 。
|
pg_cancel_backend
和 pg_terminate_backend
會將訊號(分別為 SIGINT 或 SIGTERM)傳送到由程序 ID 識別的後端程序。活動後端的程序 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: 0; TopMemoryContext: 80800 total in 6 blocks; 14432 free (5 chunks); 66368 used
LOG: level: 1; pgstat TabStatusArray lookup hash table: 8192 total in 1 blocks; 1408 free (0 chunks); 6784 used
LOG: level: 1; TopTransactionContext: 8192 total in 1 blocks; 7720 free (1 chunks); 472 used
LOG: level: 1; RowDescriptionContext: 8192 total in 1 blocks; 6880 free (0 chunks); 1312 used
LOG: level: 1; MessageContext: 16384 total in 2 blocks; 5152 free (0 chunks); 11232 used
LOG: level: 1; Operator class cache: 8192 total in 1 blocks; 512 free (0 chunks); 7680 used
LOG: level: 1; smgr relation table: 16384 total in 2 blocks; 4544 free (3 chunks); 11840 used
LOG: level: 1; TransactionAbortContext: 32768 total in 1 blocks; 32504 free (0 chunks); 264 used
...
LOG: level: 1; 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.95 中顯示的函數有助於進行線上備份。這些函數無法在復原期間執行(除了 pg_backup_start
、pg_backup_stop
和 pg_wal_lsn_diff
)。
有關如何正確使用這些函數的詳細資訊,請參閱 第 25.3 節。
表 9.95. 備份控制函數
函數
描述
|
pg_create_restore_point ( name text ) → pg_lsn
在預寫式日誌中建立一個具名標記記錄,該記錄稍後可用作復原目標,並傳回相應的預寫式日誌位置。然後可以將給定的名稱與 recovery_target_name 一起使用,以指定復原將進行到的點。避免建立多個具有相同名稱的還原點,因為復原將停止在第一個名稱與復原目標相符的還原點。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_current_wal_flush_lsn () → pg_lsn
傳回目前的預寫式日誌刷新位置(請參閱下面的注意事項)。
|
pg_current_wal_insert_lsn () → pg_lsn
傳回目前的預寫式日誌插入位置(請參閱下面的注意事項)。
|
pg_current_wal_lsn () → pg_lsn
傳回目前的預寫式日誌寫入位置(請參閱下面的注意事項)。
|
pg_backup_start ( label text [, fast boolean ] ) → pg_lsn
準備伺服器以開始線上備份。唯一需要的參數是用戶定義的任意備份標籤。(通常這將是儲存備份轉儲檔案的名稱。)如果將可選的第二個參數指定為 true ,則表示以盡可能快的速度執行 pg_backup_start 。這會強制立即檢查點,這將導致 I/O 操作激增,從而減慢任何並行執行的查詢。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_backup_stop ( [wait_for_archive boolean ] ) → record ( lsn pg_lsn , labelfile text , spcmapfile text )
完成執行線上備份。備份標籤檔案和表空間對應檔案的所需內容會作為函數結果的一部分傳回,並且必須寫入備份區域中的檔案。這些檔案不得寫入到實時資料目錄中(這樣做會導致 PostgreSQL 在發生崩潰時無法重新啟動)。
有一個可選的參數,型別為 boolean 。如果為 false,則函數會在備份完成後立即返回,而無需等待 WAL 歸檔。只有在使用獨立監控 WAL 歸檔的備份軟體時,此行為才有用。否則,使備份一致所需的 WAL 可能會遺失,導致備份無效。預設情況下或當此參數為 true 時,pg_backup_stop 會在啟用歸檔時等待 WAL 被歸檔(在備用伺服器上,這表示只有在 archive_mode = always 時才會等待。如果主伺服器上的寫入活動較低,則在主伺服器上執行 pg_switch_wal 以觸發立即的區段切換可能很有用。)
在主伺服器上執行時,此函數還會在預寫式日誌歸檔區域中建立備份歷史記錄檔案。歷史記錄檔案包含給定給 pg_backup_start 的標籤、備份的起始和結束預寫式日誌位置,以及備份的起始和結束時間。在記錄結束位置後,當前的預寫式日誌插入點會自動前進到下一個預寫式日誌檔案,以便可以立即歸檔結束的預寫式日誌檔案以完成備份。
函數的結果是一個單一記錄。lsn 欄位保存備份的結束預寫式日誌位置(同樣可以忽略)。第二個欄位傳回備份標籤檔案的內容,第三個欄位傳回表格空間對應檔案的內容。這些必須儲存為備份的一部分,並且是還原過程的一部分。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_switch_wal () → pg_lsn
強制伺服器切換到新的預寫式日誌檔案,這允許歸檔當前檔案(假設您正在使用連續歸檔)。結果是剛剛完成的預寫式日誌檔案中結束預寫式日誌位置加 1。如果自上次預寫式日誌切換以來沒有預寫式日誌活動,pg_switch_wal 不會執行任何操作,並傳回目前使用的預寫式日誌檔案的起始位置。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_walfile_name ( lsn pg_lsn ) → text
將預寫式日誌位置轉換為保存該位置的 WAL 檔案名稱。
|
pg_walfile_name_offset ( lsn pg_lsn ) → record ( file_name text , file_offset integer )
將預寫式日誌位置轉換為 WAL 檔案名稱和該檔案中的位元組偏移。
|
pg_split_walfile_name ( file_name text ) → record ( segment_number numeric , timeline_id bigint )
從 WAL 檔案名稱中提取序號和時間軸 ID。
|
pg_wal_lsn_diff ( lsn1 pg_lsn , lsn2 pg_lsn ) → numeric
計算兩個預寫式日誌位置之間的位元組差異 (lsn1 - lsn2 )。這可以與 pg_stat_replication 或 表 9.95 中顯示的一些函數一起使用,以取得複寫延遲。
|
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.96 中顯示的函數提供有關備用伺服器目前狀態的資訊。這些函數可以在恢復期間和正常執行期間執行。
表 9.96. 恢復資訊函數
函數
描述
|
pg_is_in_recovery () → boolean
如果恢復仍在進行中,則傳回 true。
|
pg_last_wal_receive_lsn () → pg_lsn
傳回已由串流複寫接收並同步到磁碟的最後一個預寫式日誌位置。當串流複寫正在進行時,此值將單調遞增。如果恢復已完成,則此值將保持靜態,位於恢復期間接收並同步到磁碟的最後一個 WAL 記錄的位置。如果停用串流複寫,或者如果它尚未啟動,則函數傳回 NULL 。
|
pg_last_wal_replay_lsn () → pg_lsn
傳回恢復期間已重播的最後一個預寫式日誌位置。如果恢復仍在進行中,此值將單調遞增。如果恢復已完成,則此值將保持靜態,位於恢復期間套用的最後一個 WAL 記錄的位置。當伺服器已正常啟動而沒有恢復時,該函數傳回 NULL 。
|
pg_last_xact_replay_timestamp () → timestamp with time zone
傳回在復原期間重播的最後一個交易的時間戳記。這是主要伺服器上產生該交易的 commit 或 abort WAL 紀錄的時間。如果在復原期間沒有重播任何交易,則此函數傳回 NULL 。否則,如果復原仍在進行中,此值將單調遞增。如果復原已完成,則此值將保持靜態,為復原期間套用的最後一個交易的時間。如果伺服器在沒有復原的情況下正常啟動,則此函數傳回 NULL 。
|
pg_get_wal_resource_managers () → setof record ( rm_id integer , rm_name text , rm_builtin boolean )
傳回系統中目前載入的 WAL 資源管理器。欄位 rm_builtin 指示它是內建的資源管理器,還是由擴充功能載入的自訂資源管理器。
|
在表 9.97 中顯示的函數可控制復原的進度。這些函數只能在復原期間執行。
表 9.97. 復原控制函數
函數
描述
|
pg_is_wal_replay_paused () → boolean
如果已請求暫停復原,則傳回 true。
|
pg_get_wal_replay_pause_state () → text
傳回復原暫停狀態。如果未請求暫停,則傳回值為 not paused ;如果已請求暫停但尚未暫停復原,則傳回值為 pause requested ;如果復原實際上已暫停,則傳回值為 paused 。
|
pg_promote ( wait boolean DEFAULT true , wait_seconds integer DEFAULT 60 ) → boolean
將待機伺服器提升為主伺服器。如果 wait 設定為 true (預設值),則函數會等待直到提升完成或經過 wait_seconds 秒,如果提升成功則傳回 true ,否則傳回 false 。如果 wait 設定為 false ,則函數會在向 postmaster 發送 SIGUSR1 訊號以觸發提升後立即傳回 true 。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_wal_replay_pause () → void
請求暫停復原。請求並不意味著復原會立即停止。如果您想保證復原實際上已暫停,則需要檢查 pg_get_wal_replay_pause_state() 傳回的復原暫停狀態。請注意,pg_is_wal_replay_paused() 傳回是否已發出請求。在復原暫停期間,不會套用進一步的資料庫變更。如果 hot standby 處於活動狀態,則所有新查詢都將看到資料庫的相同一致快照,並且在恢復復原之前不會產生進一步的查詢衝突。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_wal_replay_resume () → void
如果已暫停,則重新啟動復原。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
在進行升級時,無法執行 pg_wal_replay_pause
和 pg_wal_replay_resume
。如果在復原暫停時觸發升級,則暫停狀態結束,並且升級繼續。
如果停用了串流複製,則暫停狀態可能會無限期地持續下去而沒有問題。如果串流複製正在進行中,則 WAL 紀錄將繼續接收,這最終將填滿可用的磁碟空間,具體取決於暫停的持續時間、WAL 產生速率和可用的磁碟空間。
PostgreSQL 允許資料庫會話同步它們的快照。快照決定了哪些資料對使用該快照的交易是可見的。當兩個或更多個會話需要查看資料庫中相同的內容時,需要同步快照。如果兩個會話只是獨立地開始它們的交易,那麼總是存在這樣一種可能性,即在兩個 START TRANSACTION
命令的執行之間,有某個第三個交易提交,這樣一個會話看到了該交易的效果,而另一個會話沒有看到。
為了解决這個問題,PostgreSQL 允許交易導出它正在使用的快照。只要導出交易保持開啟狀態,其他交易就可以導入它的快照,從而保證它們看到與第一個交易完全相同的資料庫視圖。但請注意,任何這些交易做出的任何資料庫更改對其他交易仍然是不可見的,這對於未提交交易做出的更改來說是正常的。因此,交易在預先存在的資料方面是同步的,但對於它們自己做出的更改,行為正常。
快照通過 pg_export_snapshot
函數導出,如 表 9.98 所示,並通過 SET TRANSACTION 命令導入。
表 9.98. 快照同步函數
函數
描述
|
pg_export_snapshot () → text
儲存交易的目前快照並傳回一個 text 字串,用於識別快照。此字串必須(在資料庫之外)傳遞給想要導入快照的客戶端。快照僅在導出它的交易結束之前可用於導入。
如果需要,一個交易可以導出多個快照。請注意,這樣做僅在 READ COMMITTED 交易中才有用,因為在 REPEATABLE READ 和更高的隔離級別中,交易在其整個生命週期中使用相同的快照。一旦交易導出任何快照,就不能使用 PREPARE TRANSACTION 準備它。
|
pg_log_standby_snapshot () → pg_lsn
擷取執行中交易的快照,並將其寫入 WAL,無需等待背景寫入程序 (bgwriter) 或檢查點程序 (checkpointer) 記錄。這對於待命伺服器上的邏輯解碼很有用,因為邏輯槽的建立必須等到這樣的記錄在待命伺服器上重新執行後才能進行。
|
表 9.99 中顯示的函式用於控制複製功能並與之互動。有關底層功能的資訊,請參閱第 26.2.5 節、第 26.2.6 節和第 48 章。預設情況下,只有超級使用者才能使用複製來源的函式,但可以使用 GRANT
命令授權給其他使用者。複製槽的函式使用僅限於超級使用者和擁有 REPLICATION
權限的使用者。
這些函式中的許多函式在複製協定中都有等效的命令;請參閱第 53.4 節。
第 9.28.3 節、第 9.28.4 節和第 9.28.5 節中描述的函式也與複製相關。
表 9.99. 複製管理函式
函數
描述
|
pg_create_physical_replication_slot ( slot_name name [, immediately_reserve boolean , temporary boolean ] ) → record ( slot_name name , lsn pg_lsn )
建立一個名為 slot_name 的新實體複製槽。可選的第二個參數,當為 true 時,指定LSN此複製槽的 WAL 應立即保留;否則LSNWAL 將在串流複製用戶端首次連線時保留。只有使用串流複製協定才能從實體槽串流變更—請參閱第 53.4 節。可選的第三個參數 temporary ,若設為 true,則指定該槽不應永久儲存到磁碟,僅供目前會話使用。臨時槽也會在發生任何錯誤時釋放。此函式對應於複製協定命令 CREATE_REPLICATION_SLOT ... PHYSICAL 。
|
pg_drop_replication_slot ( slot_name name ) → void
刪除名為 slot_name 的實體或邏輯複製槽。與複製協定命令 DROP_REPLICATION_SLOT 相同。對於邏輯槽,必須在連線到建立該槽的相同資料庫時呼叫此函式。
|
pg_create_logical_replication_slot ( slot_name name , plugin name [, temporary boolean , twophase boolean , failover boolean ] ) → record ( slot_name name , lsn pg_lsn )
使用輸出外掛程式 plugin 建立一個名為 slot_name 的新邏輯(解碼)複製槽。可選的第三個參數 temporary ,若設為 true,則指定該槽不應永久儲存到磁碟,僅供目前會話使用。臨時槽也會在發生任何錯誤時釋放。可選的第四個參數 twophase ,若設為 true,則指定為此槽啟用預備交易的解碼。可選的第五個參數 failover ,若設為 true,則指定啟用此槽以同步到待命伺服器,以便在容錯移轉後恢復邏輯複製。呼叫此函式的效果與複製協定命令 CREATE_REPLICATION_SLOT ... LOGICAL 相同。
|
pg_copy_physical_replication_slot ( src_slot_name name , dst_slot_name name [, temporary boolean ] ) → record ( slot_name name , lsn pg_lsn )
將現有的名為 src_slot_name 的實體複製槽複製到名為 dst_slot_name 的實體複製槽。複製的實體槽開始從相同的LSNWAL 保留空間作為來源槽。temporary 是可選的。如果省略 temporary ,則使用與來源槽相同的值。
|
pg_copy_logical_replication_slot ( src_slot_name name , dst_slot_name name [, temporary boolean [, plugin name ]] ) → record ( slot_name name , lsn pg_lsn )
將現有的名為 src_slot_name 的邏輯複製槽複製到名為 dst_slot_name 的邏輯複製槽,可以選擇變更輸出外掛程式和持久性。複製的邏輯槽從相同的LSN位置開始,與來源邏輯槽相同。temporary 和 plugin 都是可選的;如果省略它們,則使用來源槽的值。
|
pg_logical_slot_get_changes ( slot_name name , upto_lsn pg_lsn , upto_nchanges integer , VARIADIC options text[] ) → setof record ( lsn pg_lsn , xid xid , data text )
傳回 slot slot_name 中的變更,從上次消耗變更的點開始。如果 upto_lsn 和 upto_nchanges 為 NULL,邏輯解碼將持續到 WAL 結束。如果 upto_lsn 非 NULL,解碼將僅包含在指定 LSN 之前提交的事務。如果 upto_nchanges 非 NULL,當解碼產生的列數超過指定值時,解碼將停止。但是請注意,實際傳回的列數可能會更大,因為此限制僅在新增解碼每個新事務提交時產生的列之後檢查。如果指定的 slot 是一個邏輯容錯移轉 slot,則該函數將不會傳回,直到 synchronized_standby_slots 中指定的所有實體 slot 都已確認收到 WAL 為止。
|
pg_logical_slot_peek_changes ( slot_name name , upto_lsn pg_lsn , upto_nchanges integer , VARIADIC options text[] ) → setof record ( lsn pg_lsn , xid xid , data text )
行為與 pg_logical_slot_get_changes() 函數相同,不同之處在於變更不會被消耗;也就是說,它們將在未來的呼叫中再次傳回。
|
pg_logical_slot_get_binary_changes ( slot_name name , upto_lsn pg_lsn , upto_nchanges integer , VARIADIC options text[] ) → setof record ( lsn pg_lsn , xid xid , data bytea )
行為與 pg_logical_slot_get_changes() 函數相同,不同之處在於變更會以 bytea 傳回。
|
pg_logical_slot_peek_binary_changes ( slot_name name , upto_lsn pg_lsn , upto_nchanges integer , VARIADIC options text[] ) → setof record ( lsn pg_lsn , xid xid , data bytea )
行為與 pg_logical_slot_peek_changes() 函數相同,不同之處在於變更會以 bytea 傳回。
|
pg_replication_slot_advance ( slot_name name , upto_lsn pg_lsn ) → record ( slot_name name , end_lsn pg_lsn )
推進名為 slot_name 的複製 slot 目前已確認的位置。該 slot 不會向後移動,也不會移動超過目前插入的位置。傳回 slot 的名稱以及它實際推進到的位置。如果進行任何推進,更新後的 slot 位置資訊會在下一個檢查點寫出。因此,在發生崩潰的情況下,slot 可能會回到較早的位置。如果指定的 slot 是一個邏輯容錯移轉 slot,則該函數將不會傳回,直到 synchronized_standby_slots 中指定的所有實體 slot 都已確認收到 WAL 為止。
|
pg_replication_origin_create ( node_name text ) → oid
建立具有給定外部名稱的複製來源,並傳回分配給它的內部 ID。
|
pg_replication_origin_drop ( node_name text ) → void
刪除先前建立的複製來源,包括任何相關的重播進度。
|
pg_replication_origin_oid ( node_name text ) → oid
依名稱查找複製來源,並傳回內部 ID。如果找不到此類複製來源,則傳回 NULL 。
|
pg_replication_origin_session_setup ( node_name text ) → void
將目前的工作階段標記為從給定的來源重播,允許追蹤重播進度。僅當目前未選取任何來源時才可以使用。使用 pg_replication_origin_session_reset 來還原。
|
pg_replication_origin_session_reset () → void
取消 pg_replication_origin_session_setup() 的效果。
|
pg_replication_origin_session_is_setup () → boolean
如果目前工作階段中已選取複製來源,則傳回 true。
|
pg_replication_origin_session_progress ( flush boolean ) → pg_lsn
傳回目前工作階段中選取的複製來源的重播位置。參數 flush 決定是否保證相應的本機事務已整理到磁碟。
|
pg_replication_origin_xact_setup ( origin_lsn pg_lsn , origin_timestamp timestamp with time zone ) → void
將目前的事務標記為重播在給定LSN和時間戳記提交的事務。僅當使用 pg_replication_origin_session_setup 選取複製來源時才可以呼叫。
|
pg_replication_origin_xact_reset () → void
取消 pg_replication_origin_xact_setup() 的效果。
|
pg_replication_origin_advance ( node_name text , lsn pg_lsn ) → void
將給定節點的複製進度設定為給定的位置。這主要用於設定初始位置,或在組態變更後設定新位置。請注意,不小心使用此函數可能會導致複製資料不一致。
|
pg_replication_origin_progress ( node_name text , flush boolean ) → pg_lsn
傳回指定複製來源的重播位置。參數 flush 決定相應的本機交易是否保證已刷新到磁碟。
|
pg_logical_emit_message ( transactional boolean , prefix text , content text [, flush boolean DEFAULT false ] ) → pg_lsn
pg_logical_emit_message ( transactional boolean , prefix text , content bytea [, flush boolean DEFAULT false ] ) → pg_lsn
發出邏輯解碼訊息。這可用於透過 WAL 將一般訊息傳遞到邏輯解碼外掛程式。transactional 參數指定訊息是否應為目前交易的一部分,或者是否應立即寫入並在邏輯解碼器讀取記錄後立即解碼。prefix 參數是一個文字前綴,邏輯解碼外掛程式可用於輕鬆識別它們感興趣的訊息。content 參數是訊息的內容,以文字或二進位形式給定。flush 參數(預設設定為 false )控制訊息是否立即刷新到 WAL。 flush 對 transactional 沒有影響,因為訊息的 WAL 記錄會隨著其交易一起刷新。
|
pg_sync_replication_slots () → void
將邏輯容錯移轉複製槽從主要伺服器同步到備用伺服器。此函數只能在備用伺服器上執行。臨時同步的槽(如果有的話)不能用於邏輯解碼,必須在升級後刪除。詳情請參閱 第 47.2.3 節。請注意,如果啟用 sync_replication_slots 並且 slotsync 工作程序已經在執行以執行槽的同步,則無法執行此函數。
|
表 9.100 中顯示的函數會計算資料庫物件的磁碟空間使用量,或協助呈現或理解使用量結果。bigint
結果以位元組為單位測量。如果將不代表現有物件的 OID 傳遞給這些函數之一,則會傳回 NULL
。
表 9.100. 資料庫物件大小函數
函數
描述
|
pg_column_size ( "any" ) → integer
顯示用於儲存任何個別資料值的位元組數。如果直接應用於資料表欄位值,則會反映已完成的任何壓縮。
|
pg_column_compression ( "any" ) → text
顯示用於壓縮個別變數長度值的壓縮演算法。如果該值未壓縮,則傳回 NULL 。
|
pg_column_toast_chunk_id ( "any" ) → oid
顯示磁碟上TOAST值的 chunk_id 。如果該值未TOAST處理或不在磁碟上,則傳回 NULL 。有關的更多資訊,請參閱 第 65.2 節TOAST.
|
pg_database_size ( name ) → bigint
pg_database_size ( oid ) → bigint
計算具有指定名稱或 OID 的資料庫所使用的磁碟空間總量。要使用此函數,您必須擁有指定資料庫上的 CONNECT 權限(預設授予),或擁有 pg_read_all_stats 角色的權限。
|
pg_indexes_size ( regclass ) → bigint
計算連接到指定資料表的索引所使用的磁碟空間總量。
|
pg_relation_size ( relation regclass [, fork text ] ) → bigint
計算指定關聯的其中一個「fork」所使用的磁碟空間。(請注意,對於大多數用途,使用更高等級的函數 pg_total_relation_size 或 pg_table_size 會更方便,它們會將所有 fork 的大小加總。)使用一個參數時,這會傳回關聯的主要資料 fork 的大小。可以提供第二個參數來指定要檢查哪個 fork
-
main 傳回關聯的主要資料 fork 的大小。
-
fsm 傳回與關聯關聯的可用空間地圖 (Free Space Map) 的大小 (請參閱 第 65.3 節)。
-
vm 傳回與關聯相關聯的可見性映射表的大小(請參閱第 65.4 節)。
-
init 傳回與關聯相關聯的初始化分支的大小(如果有的話)。
|
pg_size_bytes ( text ) → bigint
將人類可讀格式的大小(如 pg_size_pretty 傳回的格式)轉換為位元組。有效的單位為 bytes 、B 、kB 、MB 、GB 、TB 和 PB 。
|
pg_size_pretty ( bigint ) → text
pg_size_pretty ( numeric ) → text
將以位元組為單位的大小轉換為更容易讓人讀懂的格式,並帶有大小單位(位元組、kB、MB、GB、TB 或 PB,視情況而定)。請注意,單位是 2 的冪,而不是 10 的冪,因此 1kB 是 1024 位元組,1MB 是 10242 = 1048576 位元組,依此類推。
|
pg_table_size ( regclass ) → bigint
計算指定表格使用的磁碟空間,不包括索引(但包括其 TOAST 表格(如果有的話)、可用空間映射表和可見性映射表)。
|
pg_tablespace_size ( name ) → bigint
pg_tablespace_size ( oid ) → bigint
計算具有指定名稱或 OID 的表格空間中使用的總磁碟空間。若要使用此函數,您必須對指定的表格空間具有 CREATE 權限,或者具有 pg_read_all_stats 角色的權限,除非它是目前資料庫的預設表格空間。
|
pg_total_relation_size ( regclass ) → bigint
計算指定表格使用的總磁碟空間,包括所有索引和TOAST資料。結果等同於 pg_table_size + pg_indexes_size 。
|
上面操作表格或索引的函數接受 regclass
引數,它只是 pg_class
系統目錄中表格或索引的 OID。但是,您不必手動查詢 OID,因為 regclass
資料類型的輸入轉換器會為您完成這項工作。有關詳細信息,請參閱第 8.19 節。
表 9.101 中顯示的函數有助於識別與資料庫物件相關聯的特定磁碟檔案。
表 9.101. 資料庫物件位置函數
函數
描述
|
pg_relation_filenode ( relation regclass ) → oid
傳回目前指派給指定關聯的 「filenode」 編號。filenode 是用於關聯的檔案名稱的基本元件(有關詳細信息,請參閱第 65.1 節)。對於大多數關聯,結果與 pg_class .relfilenode 相同,但對於某些系統目錄,relfilenode 為零,並且必須使用此函數才能取得正確的值。如果傳遞給不具有儲存體的關聯(例如檢視表),則該函數傳回 NULL。
|
pg_relation_filepath ( relation regclass ) → text
傳回關聯的整個檔案路徑名稱(相對於資料庫叢集的資料目錄,PGDATA )。
|
pg_filenode_relation ( tablespace oid , filenode oid ) → regclass
傳回給定表格空間 OID 和儲存的 filenode 的關聯 OID。這本質上是 pg_relation_filepath 的反向對應。對於資料庫預設表格空間中的關聯,表格空間可以指定為零。如果目前資料庫中沒有關聯與給定的值相關聯,則傳回 NULL 。
|
表 9.102 列出了用於管理定序的函數。
表 9.102. 定序管理函數
函數
描述
|
pg_collation_actual_version ( oid ) → text
傳回定序物件的實際版本,因為它目前安裝在作業系統中。如果這與 pg_collation .collversion 中的值不同,則可能需要重建依賴於定序的物件。另請參閱ALTER COLLATION。
|
pg_database_collation_actual_version ( oid ) → text
傳回資料庫定序的實際版本,因為它目前安裝在作業系統中。如果這與 pg_database .datcollversion 中的值不同,則可能需要重建依賴於定序的物件。另請參閱ALTER DATABASE。
|
pg_import_system_collations ( schema regnamespace ) → integer
根據在作業系統中找到的所有地區設定,將定序新增至系統目錄 pg_collation 。這就是 initdb 使用的;有關更多詳細資訊,請參閱第 23.2.2 節。如果稍後在作業系統中安裝了其他地區設定,則可以再次執行此函數以新增新地區設定的定序。將跳過與 pg_collation 中現有項目相符的地區設定。(但是,此函數不會移除基於不再存在於作業系統中的地區設定的定序物件。)schema 參數通常為 pg_catalog ,但這不是強制性的;定序也可以安裝到其他結構描述中。該函數傳回它建立的新定序物件的數量。此函數的使用僅限於超級使用者。
|
表 9.103 列出了提供有關分割表格結構資訊的函數。
表 9.103. 分割區資訊函數
函數
描述
|
pg_partition_tree ( regclass ) → setof record ( relid regclass , parentrelid regclass , isleaf boolean , level integer )
列出指定分割資料表或分割索引之分割區樹狀結構中的資料表或索引,每個分割區對應一行。提供的資訊包括分割區的 OID、其直接父代的 OID、一個布林值,指出該分割區是否為葉節點,以及一個整數,指出其在階層中的層級。輸入資料表或索引的層級值為 0,其直接子分割區的層級值為 1,依此類推。如果關係不存在或不是分割區或分割資料表,則不傳回任何列。
|
pg_partition_ancestors ( regclass ) → setof regclass
列出給定分割區的祖先關係,包括關係本身。如果關係不存在或不是分割區或分割資料表,則不傳回任何列。
|
pg_partition_root ( regclass ) → regclass
傳回給定關係所屬的分割區樹狀結構的最頂層父代。如果關係不存在或不是分割區或分割資料表,則傳回 NULL 。
|
例如,要檢查分割資料表 measurement
中包含的資料總大小,可以使用以下查詢
SELECT pg_size_pretty(sum(pg_relation_size(relid))) AS total_size
FROM pg_partition_tree('measurement');
表 9.104 顯示了可用於索引維護工作的函式。(請注意,這些維護工作通常由自動清理程式自動完成;只有在特殊情況下才需要使用這些函式。)這些函式無法在復原期間執行。這些函式的使用僅限於超級使用者和給定索引的所有者。
表 9.104. 索引維護函式
函數
描述
|
brin_summarize_new_values ( index regclass ) → integer
掃描指定的 BRIN 索引,以尋找基礎資料表中目前未由索引摘要的頁面範圍;對於任何此類範圍,它會透過掃描這些資料表頁面來建立新的摘要索引元組。傳回插入到索引中的新頁面範圍摘要的數量。
|
brin_summarize_range ( index regclass , blockNumber bigint ) → integer
如果尚未摘要,則摘要涵蓋給定區塊的頁面範圍。這就像 brin_summarize_new_values 一樣,不同之處在於它只處理涵蓋給定資料表區塊編號的頁面範圍。
|
brin_desummarize_range ( index regclass , blockNumber bigint ) → void
如果存在,則移除摘要涵蓋給定資料表區塊的頁面範圍的 BRIN 索引元組。
|
gin_clean_pending_list ( index regclass ) → bigint
透過將條目大量移動到主要的 GIN 資料結構中,來清理指定 GIN 索引的「pending(待處理)」清單。傳回從待處理清單中移除的頁面數。如果參數是使用 fastupdate 選項停用建置的 GIN 索引,則不會發生清理,結果為零,因為索引沒有待處理清單。請參閱 章節 64.4.4.1 和 章節 64.4.5,以取得有關待處理清單和 fastupdate 選項的詳細資訊。
|
表 9.105 中顯示的函式提供對伺服器主機上檔案的本機存取。只能存取資料庫叢集目錄和 log_directory
中的檔案,除非使用者是超級使用者或被授予角色 pg_read_server_files
。使用叢集目錄中檔案的相對路徑,以及符合 log_directory
組態設定的記錄檔路徑。
請注意,授予使用者對 pg_read_file()
或相關函式的 EXECUTE 權限,會讓他們能夠讀取資料庫伺服器程序可以讀取的伺服器上的任何檔案;這些函式會繞過所有資料庫內權限檢查。這表示,例如,具有此類存取權的使用者能夠讀取儲存驗證資訊的 pg_authid
資料表內容,以及讀取資料庫中的任何資料表資料。因此,應仔細考慮授予對這些函式的存取權。
在授予這些函式的權限時,請注意,顯示選用參數的資料表條目主要實作為具有不同參數清單的多個實體函式。如果要使用每個此類函式,則必須分別授予每個此類函式的權限。psql 的 \df
指令可用於檢查實際的函式簽章是什麼。
其中一些函式採用選用的 missing_ok
參數,該參數指定檔案或目錄不存在時的行為。如果 true
,則函式會傳回 NULL
或一個空的結果集,視情況而定。如果 false
,則會引發錯誤。(除了「找不到檔案」之外的失敗情況,無論如何都會回報為錯誤。)預設值為 false
。
表 9.105. 通用檔案存取函式
函數
描述
|
pg_ls_dir ( dirname text [, missing_ok boolean , include_dot_dirs boolean ] ) → setof text
傳回指定目錄中所有檔案(以及目錄和其他特殊檔案)的名稱。include_dot_dirs 參數表示是否要在結果集中包含「.」和「..」;預設值為排除它們。當 missing_ok 為 true 時,包含它們對於區分空目錄和不存在的目錄可能很有用。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_ls_logdir () → setof record ( name text , size bigint , modification timestamp with time zone )
傳回伺服器記錄檔目錄中每個普通檔案的名稱、大小和上次修改時間 (mtime)。以點開頭的檔案名稱、目錄和其他特殊檔案都會被排除。
預設情況下,此函式僅限於超級使用者和具有 pg_monitor 角色權限的角色,但可以授予其他使用者 EXECUTE 權限來執行該函式。
|
pg_ls_waldir () → setof record ( name text , size bigint , modification timestamp with time zone )
傳回伺服器預寫式日誌 (WAL) 目錄中,每個普通檔案的名稱、大小和上次修改時間 (mtime)。名稱開頭為點號的檔案、目錄和其他特殊檔案將被排除。
預設情況下,此函式僅限於超級使用者和具有 pg_monitor 角色權限的角色,但可以授予其他使用者 EXECUTE 權限來執行該函式。
|
pg_ls_logicalmapdir () → setof record ( name text , size bigint , modification timestamp with time zone )
傳回伺服器的 pg_logical/mappings 目錄中,每個普通檔案的名稱、大小和上次修改時間 (mtime)。名稱開頭為點號的檔案、目錄和其他特殊檔案將被排除。
預設情況下,此函數僅限超級使用者和 pg_monitor 角色的成員使用,但可以授予其他使用者 EXECUTE 權限來執行此函數。
|
pg_ls_logicalsnapdir () → setof record ( name text , size bigint , modification timestamp with time zone )
傳回伺服器的 pg_logical/snapshots 目錄中,每個普通檔案的名稱、大小和上次修改時間 (mtime)。名稱開頭為點號的檔案、目錄和其他特殊檔案將被排除。
預設情況下,此函數僅限超級使用者和 pg_monitor 角色的成員使用,但可以授予其他使用者 EXECUTE 權限來執行此函數。
|
pg_ls_replslotdir ( slot_name text ) → setof record ( name text , size bigint , modification timestamp with time zone )
傳回伺服器的 pg_replslot/slot_name 目錄中,每個普通檔案的名稱、大小和上次修改時間 (mtime),其中 slot_name 是作為函數輸入提供的複寫槽名稱。名稱開頭為點號的檔案、目錄和其他特殊檔案將被排除。
預設情況下,此函數僅限超級使用者和 pg_monitor 角色的成員使用,但可以授予其他使用者 EXECUTE 權限來執行此函數。
|
pg_ls_archive_statusdir () → setof record ( name text , size bigint , modification timestamp with time zone )
傳回伺服器的 WAL 封存狀態目錄 (pg_wal/archive_status ) 中,每個普通檔案的名稱、大小和上次修改時間 (mtime)。名稱開頭為點號的檔案、目錄和其他特殊檔案將被排除。
預設情況下,此函數僅限超級使用者和 pg_monitor 角色的成員使用,但可以授予其他使用者 EXECUTE 權限來執行此函數。
|
pg_ls_tmpdir ( [ tablespace oid ] ) → setof record ( name text , size bigint , modification timestamp with time zone )
傳回指定 tablespace 的暫存檔案目錄中,每個普通檔案的名稱、大小和上次修改時間 (mtime)。如果未提供 tablespace ,則檢查 pg_default 表空間。名稱開頭為點號的檔案、目錄和其他特殊檔案將被排除。
預設情況下,此函數僅限超級使用者和 pg_monitor 角色的成員使用,但可以授予其他使用者 EXECUTE 權限來執行此函數。
|
pg_read_file ( filename text [, offset bigint , length bigint ] [, missing_ok boolean ] ) → text
傳回文字檔案的全部或部分內容,從給定的位元組 offset 開始,最多傳回 length 個位元組(如果先到達檔案結尾,則更少)。如果 offset 為負數,則相對於檔案結尾。如果省略 offset 和 length ,則傳回整個檔案。從檔案讀取的位元組將被解釋為資料庫編碼中的字串;如果它們在該編碼中無效,則會拋出錯誤。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
pg_read_binary_file ( filename text [, offset bigint , length bigint ] [, missing_ok boolean ] ) → bytea
傳回檔案的全部或部分內容。此函數與 pg_read_file 相同,只是它可以讀取任意二進制資料,並將結果作為 bytea 而不是 text 傳回;因此,不執行任何編碼檢查。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
與 convert_from 函數結合使用,此函數可用於讀取指定編碼的文字檔案,並轉換為資料庫的編碼
SELECT convert_from(pg_read_binary_file('file_in_utf8.txt'), 'UTF8');
|
pg_stat_file ( filename text [, missing_ok boolean ] ) → record ( size bigint , access timestamp with time zone , modification timestamp with time zone , change timestamp with time zone , creation timestamp with time zone , isdir boolean )
傳回一個記錄,其中包含檔案的大小、上次存取時間戳記、上次修改時間戳記、上次檔案狀態變更時間戳記 (僅限 Unix 平台)、檔案建立時間戳記 (僅限 Windows 平台) 以及一個指示其是否為目錄的標誌。
預設情況下,此函數僅限於超級使用者使用,但可以授予其他使用者 EXECUTE 權限來執行該函數。
|
顯示在表格 9.106中的函數用於管理建議鎖定。 有關正確使用這些函數的詳細資訊,請參閱章節 13.3.5。
所有這些函數都旨在用於鎖定應用程式定義的資源,這些資源可以通過單個 64 位元金鑰值或兩個 32 位元金鑰值來識別(請注意,這兩個金鑰空間不重疊)。 如果另一個會話已在相同的資源識別碼上持有衝突鎖定,則這些函數將等待直到資源可用,或傳回 false
結果,視函數而定。 鎖定可以是共享的或獨佔的:共享鎖定不會與同一資源上的其他共享鎖定衝突,僅與獨佔鎖定衝突。 可以在會話層級取得鎖定(以便它們在釋放或會話結束之前保持),或在交易層級取得鎖定(以便它們在目前交易結束之前保持;沒有手動釋放的規定)。 多個會話層級的鎖定請求會堆疊,因此如果同一個資源識別碼被鎖定三次,則必須有三個解鎖請求才能在會話結束之前釋放該資源。
表 9.106. 建議鎖定函數
函數
描述
|
pg_advisory_lock ( key bigint ) → void
pg_advisory_lock ( key1 integer , key2 integer ) → void
取得一個獨佔的會話層級建議鎖定,必要時會等待。
|
pg_advisory_lock_shared ( key bigint ) → void
pg_advisory_lock_shared ( key1 integer , key2 integer ) → void
取得一個共享的會話層級建議鎖定,必要時會等待。
|
pg_advisory_unlock ( key bigint ) → boolean
pg_advisory_unlock ( key1 integer , key2 integer ) → boolean
釋放先前取得的獨佔會話層級建議鎖定。如果鎖定成功釋放,則傳回 true 。如果未持有鎖定,則傳回 false ,此外,伺服器會報告一個 SQL 警告。
|
pg_advisory_unlock_all () → void
釋放目前會話所持有的所有會話層級建議鎖定。(即使客戶端異常斷線,也會在會話結束時隱含地呼叫此函數。)
|
pg_advisory_unlock_shared ( key bigint ) → boolean
pg_advisory_unlock_shared ( key1 integer , key2 integer ) → boolean
釋放先前取得的共享會話層級建議鎖定。如果鎖定成功釋放,則傳回 true 。如果未持有鎖定,則傳回 false ,此外,伺服器會報告一個 SQL 警告。
|
pg_advisory_xact_lock ( key bigint ) → void
pg_advisory_xact_lock ( key1 integer , key2 integer ) → void
取得一個獨佔的交易層級建議鎖定,必要時會等待。
|
pg_advisory_xact_lock_shared ( key bigint ) → void
pg_advisory_xact_lock_shared ( key1 integer , key2 integer ) → void
取得一個共享的交易層級建議鎖定,必要時會等待。
|
pg_try_advisory_lock ( key bigint ) → boolean
pg_try_advisory_lock ( key1 integer , key2 integer ) → boolean
如果可用,則取得一個獨佔的會話層級建議鎖定。如果立即取得鎖定,則會立即傳回 true ;如果無法立即取得鎖定,則會傳回 false 而不等待。
|
pg_try_advisory_lock_shared ( key bigint ) → boolean
pg_try_advisory_lock_shared ( key1 integer , key2 integer ) → boolean
如果可用,則取得一個共享的會話層級建議鎖定。如果立即取得鎖定,則會立即傳回 true ;如果無法立即取得鎖定,則會傳回 false 而不等待。
|
pg_try_advisory_xact_lock ( key bigint ) → boolean
pg_try_advisory_xact_lock ( key1 integer , key2 integer ) → boolean
如果可用,則取得一個獨佔的交易層級建議鎖定。如果立即取得鎖定,則會立即傳回 true ;如果無法立即取得鎖定,則會傳回 false 而不等待。
|
pg_try_advisory_xact_lock_shared ( key bigint ) → boolean
pg_try_advisory_xact_lock_shared ( key1 integer , key2 integer ) → boolean
如果可用,則取得一個共享的交易層級建議鎖定。如果立即取得鎖定,則會立即傳回 true ;如果無法立即取得鎖定,則會傳回 false 而不等待。
|