支援的版本:目前 (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

19.1. 設定參數 #

19.1.1. 參數名稱與值 #

所有參數名稱都不區分大小寫。每個參數都採用五種類型之一的值:布林值、字串、整數、浮點數或列舉(enum)。類型決定了設定參數的語法

  • 布林值: 值可以寫成 onofftruefalseyesno10(全部不區分大小寫)或其中一個的任何明確前綴。

  • 字串: 一般來說,將值用單引號括起來,並將值內的任何單引號加倍。但是,如果該值是一個簡單的數字或識別字,通常可以省略引號。(符合 SQL 關鍵字的值需要在某些情況下加上引號。)

  • 數值(整數和浮點數): 可以使用常用的整數和浮點數格式指定數值參數;如果參數是整數類型,則小數值將四捨五入到最接近的整數。整數參數另外接受十六進制輸入(以 0x 開頭)和八進制輸入(以 0 開頭),但這些格式不能有小數。不要使用千位分隔符號。除了十六進制輸入外,不需要引號。

  • 帶單位的數值: 某些數值參數具有隱含單位,因為它們描述記憶體或時間的數量。單位可能是位元組、千位元組、區塊(通常為八千位元組)、毫秒、秒或分鐘。其中一個設定的未修飾數值將使用該設定的預設單位,可以從 pg_settings.unit 獲知。為了方便起見,可以使用明確指定的單位給出設定,例如時間值的 '120 ms',它們將轉換為參數的實際單位。請注意,必須將該值寫成字串(帶引號)才能使用此功能。單位名稱區分大小寫,並且數值和單位之間可以有空白。

    • 有效的記憶體單位為 B(位元組)、kB(千位元組)、MB(百萬位元組)、GB(十億位元組)和 TB(兆位元組)。記憶體單位的乘數為 1024,而不是 1000。

    • 有效的時間單位為 us(微秒)、ms(毫秒)、s(秒)、min(分鐘)、h(小時)和 d(天)。

    如果使用單位指定小數值,如果存在較小的單位,它將四捨五入到下一個較小單位的倍數。例如,30.1 GB 將轉換為 30822 MB 而不是 32319628902 B。如果參數是整數類型,則在任何單位轉換後都會進行最終的四捨五入到整數。

  • 列舉: 列舉類型參數的寫入方式與字串參數相同,但僅限於具有一組有限的值。可以從 pg_settings.enumvals 找到此類參數允許的值。列舉參數值不區分大小寫。

19.1.2. 透過組態檔互動參數 #

設定這些參數最基本的方法是編輯檔案 postgresql.conf,該檔案通常保存在資料目錄中。初始化資料庫叢集目錄時,會安裝預設副本。以下是該檔案的外觀範例

# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB

每行指定一個參數。名稱和值之間的等號是可選的。空白無關緊要(除非在帶引號的參數值中),並且忽略空行。井字號 (#) 將該行的其餘部分指定為註解。不是簡單識別字或數字的參數值必須用單引號引起來。要在參數值中嵌入單引號,請寫兩個引號(首選)或反斜線引號。如果檔案包含同一參數的多個條目,則除最後一個之外的所有條目都會被忽略。

以這種方式設定的參數會為叢集提供預設值。除非被覆寫,否則作用中的連線所看到的設定將會是這些預設值。以下章節描述管理員或使用者可以覆寫這些預設值的方法。

每當主伺服器進程收到 SIGHUP 訊號時,就會重新讀取組態檔;這個訊號最容易從命令列執行 pg_ctl reload 或呼叫 SQL 函式 pg_reload_conf() 來傳送。主伺服器進程也會將此訊號傳播到所有目前正在執行的伺服器進程,以便現有的連線也採用新的值(這將在它們完成任何目前正在執行的用戶端命令之後發生)。或者,您可以直接將訊號傳送到單個伺服器進程。有些參數只能在伺服器啟動時設定;在伺服器重新啟動之前,對組態檔中這些條目的任何變更都將被忽略。組態檔中的無效參數設定在 SIGHUP 處理期間同樣會被忽略(但會記錄)。

除了 postgresql.conf 之外,PostgreSQL 資料目錄還包含一個檔案 postgresql.auto.conf,其格式與 postgresql.conf 相同,但旨在自動編輯,而不是手動編輯。此檔案保存透過 ALTER SYSTEM 指令提供的設定。每次讀取 postgresql.conf 時都會讀取此檔案,並且其設定以相同方式生效。postgresql.auto.conf 中的設定會覆寫 postgresql.conf 中的設定。

外部工具也可以修改 postgresql.auto.conf。除非 allow_alter_system 設定為 off,否則不建議在伺服器執行時執行此操作,因為同時執行的 ALTER SYSTEM 指令可能會覆寫這些變更。此類工具可能只是將新的設定附加到結尾,或者它們可能會選擇刪除重複的設定和/或註解(如同 ALTER SYSTEM 將會做的那樣)。

系統檢視表 pg_file_settings 有助於預先測試組態檔的變更,或者在 SIGHUP 訊號未產生預期效果時診斷問題。

19.1.3. 透過 SQL 進行參數互動 #

PostgreSQL 提供三個 SQL 指令來建立組態預設值。前面提到的 ALTER SYSTEM 指令提供了一種可透過 SQL 存取的方式來變更全域預設值;它在功能上等同於編輯 postgresql.conf。此外,還有兩個指令允許設定每個資料庫或每個角色的預設值。

  • ALTER DATABASE 指令允許在每個資料庫的基礎上覆寫全域設定。

  • ALTER ROLE 指令允許使用使用者特定的值來覆寫全域和每個資料庫的設定。

使用 ALTER DATABASEALTER ROLE 設定的值僅在啟動新的資料庫連線時才會套用。它們會覆寫從組態檔或伺服器命令列取得的值,並構成該連線其餘部分的預設值。請注意,有些設定在伺服器啟動後無法變更,因此無法使用這些指令(或下面列出的指令)來設定。

一旦用戶端連線到資料庫,PostgreSQL 會提供兩個額外的 SQL 指令(和等效的函式)來與連線本機組態設定互動。

  • SHOW 指令允許檢查任何參數的目前值。對應的 SQL 函式是 current_setting(setting_name text)(請參閱 第 9.28.1 節)。

  • SET 指令允許修改可以在本機設定為連線的那些參數的目前值;它對其他連線沒有影響。許多參數可以由任何使用者以這種方式設定,但有些參數只能由超級使用者和已被授予該參數的 SET 權限的使用者設定。對應的 SQL 函式是 set_config(setting_name, new_value, is_local)(請參閱 第 9.28.1 節)。

此外,系統檢視表 pg_settings 可用於檢視和變更連線本機值。

  • 查詢此檢視表類似於使用 SHOW ALL,但提供更多詳細資訊。它也更具彈性,因為可以指定篩選條件或與其他關係聯結。

  • 在此檢視表上使用 UPDATE,特別是更新 setting 欄位,等同於發出 SET 指令。例如,等同於

    SET configuration_parameter TO DEFAULT;
    

    UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter';
    

19.1.4. 透過 Shell 進行參數互動 #

除了設定全域預設值或在資料庫或角色層級附加覆寫之外,您還可以透過 shell 功能將設定傳遞給 PostgreSQL。伺服器和 libpq 用戶端程式庫都透過 shell 接受參數值。

  • 在伺服器啟動期間,可以使用 -c name=value 命令列參數或其等效的 --name=value 變體將參數設定傳遞給 postgres 指令。例如,

    postgres -c log_connections=yes --log-destination='syslog'
    

    以這種方式提供的設定會覆寫透過 postgresql.confALTER SYSTEM 設定的設定,因此如果不重新啟動伺服器,就無法全域變更它們。

  • 透過 libpq 啟動用戶端連線時,可以使用 PGOPTIONS 環境變數指定參數設定。以這種方式建立的設定構成連線生命週期的預設值,但不會影響其他連線。由於歷史原因,PGOPTIONS 的格式類似於啟動 postgres 指令時使用的格式;具體來說,必須指定名稱之前的 -c 或前置的 --。例如,

    env PGOPTIONS="-c geqo=off --statement-timeout=5min" psql
    

    其他用戶端和程式庫可能會提供自己的機制,透過 shell 或其他方式,允許使用者變更連線設定,而無需直接使用 SQL 指令。

19.1.5. 管理組態檔內容 #

PostgreSQL 提供了多種功能,可將複雜的 postgresql.conf 檔案分解為子檔案。這些功能在管理具有相關但不相同的組態的多個伺服器時特別有用。

除了個別參數設定外,postgresql.conf 檔案可以包含包含指示詞 (include directives),用於指定另一個檔案,並將其讀取和處理,如同它已插入到這個設定檔中。這個功能允許將設定檔劃分為物理上獨立的部分。包含指示詞看起來像這樣:

include 'filename'

如果檔案名稱不是絕對路徑,則會將其視為相對於包含參照設定檔的目錄。包含可以巢狀化。

還有一個 include_if_exists 指示詞,其作用與 include 指示詞相同,除非被參照的檔案不存在或無法讀取。 常規的 include 會將此視為錯誤情況,但 include_if_exists 只會記錄訊息並繼續處理參照設定檔。

postgresql.conf 檔案也可以包含 include_dir 指示詞,用於指定要包含的整個設定檔目錄。 它們看起來像這樣:

include_dir 'directory'

非絕對目錄名稱會被視為相對於包含參照設定檔的目錄。 在指定的目錄中,只會包含名稱以 .conf 後綴結尾的非目錄檔案。 以 . 字元開頭的檔案名稱也會被忽略,以避免錯誤,因為這些檔案在某些平台上是隱藏的。 包含目錄中的多個檔案會按照檔案名稱順序處理(根據 C 地區設定規則,即數字在字母之前,大寫字母在小寫字母之前)。

包含檔案或目錄可用於邏輯上分隔資料庫組態的部分,而不是使用單個大型的 postgresql.conf 檔案。 假設有一家公司有兩台資料庫伺服器,每台伺服器都有不同的記憶體容量。 可能會有組態的元素是兩者共享的,例如日誌記錄。 但是伺服器上的記憶體相關參數會因兩者而異。 也可能有伺服器特定的自訂設定。 管理這種情況的一種方法是將您網站的自訂組態變更分成三個檔案。 您可以將此新增到 postgresql.conf 檔案的末尾以包含它們:

include 'shared.conf'
include 'memory.conf'
include 'server.conf'

所有系統都將擁有相同的 shared.conf。 具有特定記憶體容量的每台伺服器都可以共享相同的 memory.conf; 您可能有一個用於所有具有 8GB RAM 的伺服器,另一個用於具有 16GB RAM 的伺服器。 最後,server.conf 可以在其中包含真正的伺服器特定組態資訊。

另一種可能性是建立組態檔案目錄,並將此資訊放入該目錄中的檔案中。 例如,可以在 postgresql.conf 的末尾參照 conf.d 目錄:

include_dir 'conf.d'

然後,您可以像這樣命名 conf.d 目錄中的檔案:

00shared.conf
01memory.conf
02server.conf

這種命名慣例建立了一個明確的順序,這些檔案將按照該順序載入。 這很重要,因為只有伺服器讀取組態檔案時遇到的特定參數的最後一個設定才會被使用。 在此範例中,在 conf.d/02server.conf 中設定的內容將覆蓋在 conf.d/01memory.conf 中設定的值。

您可以改為使用這種方法來描述性地命名檔案:

00shared.conf
01memory-8GB.conf
02server-foo.conf

這種安排為每個組態檔案變體提供了一個唯一的名稱。 這有助於消除歧義,當多個伺服器的組態都儲存在一個位置時,例如在版本控制儲存庫中。 (將資料庫組態檔案儲存在版本控制下是另一個值得考慮的好習慣。)

提交更正

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