2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不再支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0

9.28. 系統管理函式 #

本節介紹的函式用於控制和監視 PostgreSQL 安裝。

9.28.1. 配置設定函式 #

表 9.95 顯示了用於查詢和更改執行時配置引數的函式。

表 9.95. 配置設定函式

函式

描述

示例

current_setting ( setting_name text [, missing_ok boolean ] ) → text

返回設定 setting_name 的當前值。如果不存在此設定,則 current_setting 會丟擲錯誤,除非提供了 missing_ok 並且其值為 true(在這種情況下返回 NULL)。此函式對應於SQLSHOW 命令。

current_setting('datestyle')ISO, MDY

set_config ( setting_name text, new_value text, is_local boolean ) → text

將引數 setting_name 設定為 new_value,並返回該值。如果 is_localtrue,則新值僅在當前事務中生效。如果您希望新值在當前會話的剩餘時間內生效,請改用 false。此函式對應於 SQL 命令 SET

set_config 接受 NULL 值作為 new_value,但由於設定不能為 NULL,因此將其解釋為重置為預設值的請求。

set_config('log_statement_stats', 'off', false)off


9.28.2. 伺服器訊號函式 #

表 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. 伺服器訊號函式

函式

描述

pg_cancel_backend ( pid integer ) → boolean

取消具有指定程序 ID 的會話的當前查詢。如果呼叫角色是正在被取消的後端所屬角色的成員,或者呼叫角色具有 pg_signal_backend 的許可權,則也允許這樣做,但只有超級使用者可以取消超級使用者後端。作為例外,具有 pg_signal_autovacuum_worker 許可權的角色可以取消自動清理工作程序,而這些工作程序通常被視為超級使用者後端。

pg_log_backend_memory_contexts ( pid integer ) → boolean

請求記錄指定程序 ID 的後端記憶體上下文。此函式可以向除日誌記錄器以外的後端和輔助程序傳送請求。這些記憶體上下文將以 LOG 訊息級別記錄。它們將根據設定的日誌配置出現在伺服器日誌中(有關更多資訊,請參閱 Section 19.8),但無論 client_min_messages 設定如何,都不會發送給客戶端。

pg_reload_conf () → boolean

使 PostgreSQL 伺服器的所有程序重新載入其配置檔案。(這透過向 postmaster 程序傳送 SIGHUP 訊號來啟動,postmaster 程序再將 SIGHUP 傳送給其每個子程序。)在重新載入之前,您可以使用 pg_file_settingspg_hba_file_rulespg_ident_file_mappings 檢視來檢查配置檔案是否存在潛在錯誤。

pg_rotate_logfile () → boolean

指示日誌檔案管理器立即切換到新的輸出檔案。這僅在內建日誌收集器執行時才有效,否則不存在日誌檔案管理器子程序。

pg_terminate_backend ( pid integer, timeout bigint DEFAULT 0 ) → boolean

終止具有指定程序 ID 的後端程序的會話。如果呼叫角色是正在被終止的後端所屬角色的成員,或者呼叫角色具有 pg_signal_backend 的許可權,則也允許這樣做,但只有超級使用者可以終止超級使用者後端。作為例外,具有 pg_signal_autovacuum_worker 許可權的角色可以終止自動清理工作程序,而這些工作程序通常被視為超級使用者後端。

如果未指定 timeout 或其值為零,則無論程序是否實際終止,此函式都返回 true,僅表示傳送訊號成功。如果指定了 timeout(以毫秒為單位)且大於零,則函式將等待程序實際終止或直到給定的時間過去。如果程序終止,函式返回 true。超時時,會發出警告並返回 false


pg_cancel_backendpg_terminate_backend 向由程序 ID 標識的後端程序傳送訊號(分別為 SIGINTSIGTERM)。活動後端的程序 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.28.3. 備份控制函式 #

表 9.97 中顯示的函式有助於進行線上備份。這些函式不能在恢復期間執行(除了 pg_backup_startpg_backup_stoppg_wal_lsn_diff)。

有關這些函式的正確用法,請參閱 Section 25.3

表 9.97. 備份控制函式

函式

描述

pg_create_restore_point ( name text ) → pg_lsn

在寫預日誌 (WAL) 中建立一個命名的標記記錄,該記錄以後可用作恢復目標,並返回相應的寫預日誌位置。然後可以使用給定的名稱與 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.97 中顯示的某些函式結合使用,以獲取複製延遲。


pg_current_wal_lsn 以與上述函式相同的格式顯示當前的寫預日誌寫入位置。類似地,pg_current_wal_insert_lsn 顯示當前的寫預日誌插入位置,pg_current_wal_flush_lsn 顯示當前的寫預日誌重新整理位置。插入位置是任何瞬時的寫預日誌的 邏輯 結尾,而寫入位置是已實際從伺服器內部緩衝區寫入的結尾,重新整理位置是已寫入持久儲存的最後一個已知位置。寫入位置是伺服器外部可檢查的結尾,通常是您在希望歸檔部分完成的寫預日誌檔案時想要使用的。插入位置和重新整理位置主要用於伺服器除錯目的。這些都是隻讀操作,不需要超級使用者許可權。

您可以使用 pg_walfile_name_offsetpg_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.28.4. 恢復控制函式 #

表 9.98 中顯示的函式提供有關備用伺服器當前狀態的資訊。這些函式可以在恢復期間和正常執行時執行。

表 9.98. 恢復資訊函式

函式

描述

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

返回恢復期間重放的最後一個事務的時間戳。這是該事務的提交或中止 WAL 記錄在主伺服器上生成的時間。如果恢復期間沒有事務被重放,則該函式返回 NULL。否則,如果恢復仍在進行中,此值將單調遞增。如果恢復已完成,則此值將保持靜態,停留在恢復期間應用的最後一個事務的時間。當伺服器正常啟動而無需恢復時,該函式返回 NULL

pg_get_wal_resource_managers () → setof record ( rm_id integer, rm_name text, rm_builtin boolean )

返回系統中當前載入的 WAL 資源管理器。 rm_builtin 列指示它是內建資源管理器還是由擴充套件載入的自定義資源管理器。


表 9.99 中顯示的函式控制恢復的進度。這些函式只能在恢復期間執行。

表 9.99. 恢復控制函式

函式

描述

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,則函式在傳送 SIGUSR1 訊號給 postmaster 以觸發提升後立即返回 true

預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。

pg_wal_replay_pause () → void

請求暫停恢復。請求並不意味著恢復立即停止。如果您想保證恢復實際已暫停,則需要檢查 pg_get_wal_replay_pause_state() 返回的恢復暫停狀態。注意 pg_is_wal_replay_paused() 返回是否已發出請求。恢復暫停期間,不會應用進一步的資料庫更改。如果熱備用處於活動狀態,所有新查詢都將看到相同的資料庫一致快照,並且在恢復恢復之前不會生成進一步的查詢衝突。

預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。

pg_wal_replay_resume () → void

如果恢復被暫停,則重新啟動恢復。

預設情況下,此函式限制為超級使用者,但可以授予其他使用者 EXECUTE 許可權來執行該函式。


pg_wal_replay_pausepg_wal_replay_resume 在提升進行期間無法執行。如果提升被觸發而恢復正在暫停,則暫停狀態結束,提升繼續。

如果流複製被停用,暫停狀態可能會無限期地持續而不會出現問題。如果流複製正在進行,WAL 記錄將繼續接收,這最終會填滿可用磁碟空間,具體取決於暫停時間、WAL 生成速率和可用磁碟空間。

9.28.5. 快照同步函式 #

PostgreSQL 允許資料庫會話同步其快照。一個 快照 決定了使用快照的事務可以看到哪些資料。當兩個或多個會話需要看到資料庫中完全相同的內容時,需要同步快照。如果兩個會話獨立開始事務,總有可能在執行兩個 START TRANSACTION 命令之間有第三個事務提交,這樣其中一個會話會看到該事務的影響而另一個不會。

為了解決這個問題,PostgreSQL 允許事務 匯出 它正在使用的快照。只要匯出事務保持開啟狀態,其他事務就可以 匯入 它的快照,從而保證它們看到與第一個事務完全相同的資料庫檢視。但請注意,這些事務中的任何一個所做的任何資料庫更改對其他事務仍然是不可見的,就像未提交事務所做的更改通常那樣。因此,事務在預先存在的資料方面是同步的,但在它們自己所做的更改方面則正常執行。

快照透過 pg_export_snapshot 函式匯出(見 表 9.100),並透過 SET TRANSACTION 命令匯入。

表 9.100. 快照同步函式

函式

描述

pg_export_snapshot () → text

儲存事務的當前快照,並返回一個標識該快照的 text 字串。此字串必須(在資料庫外部)傳遞給想要匯入該快照的客戶端。快照僅在匯出它的事務結束之前可供匯入。

如果需要,事務可以匯出多個快照。請注意,這樣做僅在 READ COMMITTED 事務中有用,因為在 REPEATABLE READ 和更高隔離級別下,事務在其整個生命週期內使用相同的快照。一旦事務匯出了任何快照,就不能使用 PREPARE TRANSACTION 來準備它。

pg_log_standby_snapshot () → pg_lsn

捕獲正在執行的事務的快照並將其寫入 WAL,而無需等待 bgwriter 或 checkpointer 寫入日誌。這對於備用伺服器上的邏輯解碼非常有用,因為邏輯槽的建立必須等到此類記錄在備用伺服器上重放。


9.28.6. 複製管理函式 #

表 9.101 中顯示的函式用於控制和互動複製功能。有關底層功能的資訊,請參閱 Section 26.2.5Section 26.2.6Chapter 48。預設情況下,僅允許超級使用者使用複製原點函式,但可以透過使用 GRANT 命令允許其他使用者使用。複製槽函式僅限於超級使用者和具有 REPLICATION 許可權的使用者。

這些函式中的許多都等效於複製協議中的命令;請參閱 Section 54.4

Section 9.28.3Section 9.28.4Section 9.28.5 中描述的函式也與複製相關。

表 9.101. 複製管理函式

函式

描述

pg_create_physical_replication_slot ( slot_name name [, immediately_reserve boolean, temporary boolean ] ) → record ( slot_name name, lsn pg_lsn )

建立一個名為 slot_name 的新的物理複製槽。可選的第二個引數(當為 true 時)指定了LSN此複製槽的立即預留;否則,LSN將在流複製客戶端首次連線時預留。只能使用流複製協議從物理槽流式傳輸更改 — 請參閱 第 54.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 的物理複製槽。複製的物理槽將從與源槽相同的LSNLSN 開始預留 WAL。 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 的邏輯複製槽,並可選擇更改輸出外掛和永續性。複製的邏輯槽將從與源邏輯槽相同的LSNLSN 開始。 temporaryplugin 都是可選的;如果省略它們,將使用源槽的值。源邏輯槽的 failover 選項不會被複制,並且預設設定為 false。這是為了避免在故障轉移到正在同步槽的備用伺服器時無法繼續邏輯複製的風險。不允許複製已失效的槽。

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_name 中的更改,從上次消耗更改的點開始。如果 upto_lsnupto_nchanges 為 NULL,則邏輯解碼將一直進行到 WAL 結束。如果 upto_lsn 非 NULL,則解碼將僅包括在指定 LSN 之前提交的事務。如果 upto_nchanges 非 NULL,則當解碼產生的行數超過指定值時,解碼將停止。但請注意,返回的實際行數可能會更多,因為此限制僅在新增解碼每個新事務提交產生的行之後進行檢查。如果指定的槽是邏輯故障轉移槽,則該函式將不會返回,直到 synchronized_standby_slots 中指定的所有物理槽都已確認收到 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 的複製槽的當前已確認位置。槽不會向後移動,也不會超出當前插入位置。返回槽的名稱以及它實際推進到的位置。更新後的槽位置資訊將在下一次檢查點時寫出(如果進行了任何推進)。因此,在發生崩潰時,槽可能會返回到較早的位置。如果指定的槽是邏輯故障轉移槽,則該函式將不會返回,直到 synchronized_standby_slots 中指定的所有物理槽都已確認收到 WAL。

pg_replication_origin_create ( node_name text ) → oid

使用給定的外部名稱建立複製源,並返回分配給它的內部 ID。名稱的最大長度為 512 位元組。

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 還是不重新整理。 flushtransactional 沒有影響,因為訊息的 WAL 記錄會隨著事務一起重新整理。

pg_sync_replication_slots () → void

將邏輯故障轉移複製槽從主伺服器同步到備用伺服器。此函式只能在備用伺服器上執行。臨時的同步槽(如果存在)不能用於邏輯解碼,並且必須在升級後刪除。有關詳細資訊,請參閱 第 47.2.3 節。請注意,此函式主要用於測試和除錯目的,應謹慎使用。此外,如果啟用了 sync_replication_slots 並且 slotsync 工作程序已在執行以執行槽同步,則無法執行此函式。

注意

如果在執行函式後,備用伺服器上的 hot_standby_feedback 被停用,或者在 primary_slot_name 中配置的物理槽被移除,則主伺服器上的 VACUUM 程序可能會刪除同步槽的必要行,導致同步槽失效。


9.28.7. 資料庫物件管理函式 #

表中顯示的函式(表 9.102)計算資料庫物件的磁碟空間使用情況,或輔助呈現或理解使用情況的結果。bigint 結果以位元組為單位。如果將 OID 傳遞給其中一個函式,而該 OID 不代表現有物件,則返回 NULL

表 9.102. 資料庫物件大小函式

函式

描述

pg_column_size ( "any" ) → integer

顯示儲存任何單個數據值所使用的位元組數。如果直接應用於表列值,則反映了所進行的任何壓縮。

pg_column_compression ( "any" ) → text

顯示用於壓縮單個可變長度值的壓縮演算法。如果值未壓縮,則返回 NULL

pg_column_toast_chunk_id ( "any" ) → oid

顯示已壓縮到磁碟的值的 chunk_idTOAST如果值未壓縮或不在磁碟上,則返回 NULLTOAST有關壓縮的更多資訊,請參閱 第 66.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_sizepg_table_size 更方便,它們會彙總所有 fork 的大小。)當只有一個引數時,此函式返回關係主資料 fork 的大小。第二個引數可用於指定要檢查的 fork:

  • main 返回關係主資料 fork 的大小。

  • fsm 返回與關係關聯的空閒空間對映(Free Space Map)的大小(請參閱 第 66.3 節)。

  • vm 返回與關係關聯的可視性對映(Visibility Map)的大小(請參閱 第 66.4 節)。

  • init 返回與關係關聯的初始化 fork 的大小(如果存在)。

pg_size_bytes ( text ) → bigint

將人類可讀格式的大小(由 pg_size_pretty 返回)轉換為位元組。有效單位包括 bytesBkBMBGBTBPB

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.103)有助於識別與資料庫物件關聯的特定磁碟檔案。

表 9.103. 資料庫物件位置函式

函式

描述

pg_relation_filenode ( relation regclass ) → oid

返回當前分配給指定關係的 filenode 號。filenode 是用於關係的(檔案)名稱的基本組成部分(有關更多資訊,請參閱 第 66.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.104 列出了用於管理排序規則的函式。

表 9.104. 排序規則管理函式

函式

描述

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.105 列出了用於操作統計資訊的函式。這些函式不能在恢復期間執行。

警告

對這些統計資訊操作函式所做的更改很可能被 autovacuum(或手動 VACUUMANALYZE)覆蓋,應視為臨時性的。

表 9.105. 資料庫物件統計資訊操作函式

函式

描述

pg_restore_relation_stats ( VARIADIC kwargs "any" ) → boolean

更新表級統計資訊。通常,這些統計資訊會在 VACUUMANALYZE 中自動收集或更新,因此無需呼叫此函式。但是,在恢復後,如果尚未執行 ANALYZE,則此函式有助於最佳化器選擇更好的計劃。

跟蹤的統計資訊可能因版本而異,因此引數以 argnameargvalue 對的形式傳遞,格式為

SELECT pg_restore_relation_stats(
    'arg1name', 'arg1value'::arg1type,
    'arg2name', 'arg2value'::arg2type,
    'arg3name', 'arg3value'::arg3type);

例如,要為表 mytable 設定 relpagesreltuples

SELECT pg_restore_relation_stats(
    'schemaname', 'myschema',
    'relname',    'mytable',
    'relpages',   173::integer,
    'reltuples',  10000::real);

引數 schemanamerelname 是必需的,用於指定表。其他引數是與 pg_class 中某些列對應的統計資訊的名稱和值。當前支援的關係統計資訊包括 relpages(型別為 integer)、reltuples(型別為 real)、relallvisible(型別為 integer)和 relallfrozen(型別為 integer)。

此外,此函式接受引數名稱 version,型別為 integer,指定統計資訊來源的伺服器版本。這有望有助於將統計資訊從舊版本的 PostgreSQL 移植。

次要錯誤將報告為 WARNING 並被忽略,其餘統計資訊仍將被恢復。如果所有指定的統計資訊都成功恢復,則返回 true,否則返回 false

呼叫者必須擁有表上的 MAINTAIN 許可權,或者擁有資料庫的所有權。

pg_clear_relation_stats ( schemaname text, relname text ) → void

清除給定關係的表級統計資訊,就像表是新建立的一樣。

呼叫者必須擁有表上的 MAINTAIN 許可權,或者擁有資料庫的所有權。

pg_restore_attribute_stats ( VARIADIC kwargs "any" ) → boolean

建立或更新列級統計資訊。通常,這些統計資訊會在 VACUUMANALYZE 中自動收集或更新,因此無需呼叫此函式。但是,在恢復後,如果尚未執行 ANALYZE,則此函式有助於最佳化器選擇更好的計劃。

跟蹤的統計資訊可能因版本而異,因此引數以 argnameargvalue 對的形式傳遞,格式為

SELECT pg_restore_attribute_stats(
    'arg1name', 'arg1value'::arg1type,
    'arg2name', 'arg2value'::arg2type,
    'arg3name', 'arg3value'::arg3type);

例如,要為表 mytable 的屬性 col1 設定 avg_widthnull_frac

SELECT pg_restore_attribute_stats(
    'schemaname', 'myschema',
    'relname',    'mytable',
    'attname',    'col1',
    'inherited',  false,
    'avg_width',  125::integer,
    'null_frac',  0.5::real);

必需的引數是 schemanamerelname(型別為 text),用於指定表;attname(型別為 text)或 attnum(型別為 smallint),用於指定列;以及 inherited,用於指定統計資訊是否包含子表的值。其他引數是與 pg_stats 中的列對應的統計資訊的名稱和值。

此外,此函式接受引數名稱 version,型別為 integer,指定統計資訊來源的伺服器版本。這有望有助於將統計資訊從舊版本的 PostgreSQL 移植。

次要錯誤將報告為 WARNING 並被忽略,其餘統計資訊仍將被恢復。如果所有指定的統計資訊都成功恢復,則返回 true,否則返回 false

呼叫者必須擁有表上的 MAINTAIN 許可權,或者擁有資料庫的所有權。

pg_clear_attribute_stats ( schemaname text, relname text, attname text, inherited boolean ) → void

清除給定關係和屬性的列級統計資訊,就像表是新建立的一樣。

呼叫者必須擁有表上的 MAINTAIN 許可權,或者擁有資料庫的所有權。


表 9.106 列出了提供分割槽表結構資訊的函式。

表 9.106. 分割槽資訊函式

函式

描述

pg_partition_tree ( regclass ) → setof record ( relid regclass, parentrelid regclass, isleaf boolean, level integer )

列出給定分割槽表或分割槽索引的分割槽樹中的表或索引,每個分割槽一行。提供的資訊包括分割槽的 OID、其直接父級的 OID、一個指示分割槽是否為葉分割槽的布林值,以及一個表示其在層級結構中級別的整數。級別值為 0 表示輸入表或索引,1 表示其直接子分割槽,2 表示它們的子分割槽,依此類推。如果關係不存在或不是分割槽表或分割槽索引,則不返回任何行。

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.28.8. 索引維護函式 #

表 9.107 顯示了可用於索引維護任務的函式。(請注意,這些維護任務通常由 autovacuum 自動完成;只有在特殊情況下才需要使用這些函式。)這些函式不能在恢復期間執行。這些函式的用法僅限於超級使用者和給定索引的所有者。

表 9.107. 索引維護函式

函式

描述

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 資料結構來清理它。返回從待處理列表中移除的頁面數。如果引數是使用 fastupdate 選項停用的 GIN 索引,則不會發生清理,並且結果為零,因為索引沒有待處理列表。有關待處理列表和 fastupdate 選項的詳細資訊,請參閱第 65.4.4.1 節第 65.4.5 節


9.28.9. 通用檔案訪問函式 #

表 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. 通用檔案訪問函式

函式

描述

pg_ls_dir ( dirname text [, missing_ok boolean, include_dot_dirs boolean ] ) → setof text

返回指定目錄中的所有檔案(以及目錄和其他特殊檔案)的名稱。include_dot_dirs 引數指示是否將“.”和“..”包含在結果集中;預設是排除它們。當 missing_oktrue 時,包含它們可能有助於區分空目錄和不存在的目錄。

預設情況下,此函式限制為超級使用者,但可以授予其他使用者 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_summariesdir () → setof record ( name text, size bigint, modification timestamp with time zone )

返回伺服器的 WAL 摘要目錄(pg_wal/summaries)中每個普通檔案的名稱、大小和最後修改時間(mtime)。以點開頭的檔名、目錄和其他特殊檔案將被排除。

預設情況下,此函式僅限於超級使用者和 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 為負數,則相對於檔案末尾。如果省略 offsetlength,則返回整個檔案。從檔案中讀取的位元組被解釋為資料庫編碼的字串;如果它們在該編碼中無效,則會引發錯誤。

預設情況下,此函式限制為超級使用者,但可以授予其他使用者 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.28.10. 勸告性鎖函式 #

表 9.109 中顯示的函式用於管理勸告性鎖。有關這些函式的正確使用方法的詳細資訊,請參閱第 13.3.5 節

所有這些函式都旨在用於鎖定應用程式定義的資源,這些資源可以透過單個 64 位鍵值或兩個 32 位鍵值來標識(請注意,這兩個鍵空間不重疊)。如果另一個會話已經持有同一資源識別符號上的衝突鎖,則這些函式將根據函式的適用性,要麼等待資源可用,要麼返回 false 結果。鎖可以是共享的或排他的:共享鎖與同一資源上的其他共享鎖不衝突,只與排他鎖衝突。鎖可以是會話級別的(因此它們會一直持有到釋放或會話結束),也可以是事務級別的(因此它們會一直持有到當前事務結束;沒有手動釋放的機制)。多個會話級鎖請求會堆疊,因此如果同一資源識別符號被鎖定三次,則必須有三個解鎖請求才能在會話結束前釋放該資源。

表 9.109. 勸告性鎖函式

函式

描述

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 而不等待。


提交更正

如果您在文件中看到任何不正確、與您對特定功能的使用經驗不符或需要進一步澄清的內容,請使用此表格報告文件問題。