16.4. 執行時配置

有一堆配置參數可以影響資料庫系統的行為。 我們在這裡描述一下如何設置它們,然後在下一章我們將逐個討論它們。

所有參數名都是大小寫不敏感的。每個參數都可以接受四種類型之一:布爾, 整數,浮點數和字元串。布爾值可以是 ONOFFTRUEFALSEYESNO10 (都是大小寫無關)或這些東西的任意清晰無歧義的前綴。

設置這些選項的一個方法是編輯文件 postgresql.conf, 這個文件通常在資料目錄裡。(initdb 在那裡安裝一個預設的拷貝。) 比如,下面是一個該文件的例子:

# 這是一個註釋
log_connections = yes
log_destination = 'syslog'
search_path = '$user, public'

像您看到的那樣,選項是每條一行。選項名和值之間的等號是可選的。 空白和空行被忽略。井號(#)用做任何地方引入註釋。 非簡單標識符或者數字必須用單引號包圍。

每次postmaster收到SIGHUP(最簡單的發送方法就是使用 pg_ctl reload)。 信號後都會重新讀取這個配置文件。 postmaster同時也將這個信號廣播給所有正在執行的伺服器進程,這樣現有會話也能得到新的預設。 另外,您可以只向一個伺服器進程直接發送信號。 有些參數只能在伺服器啟動的時候設置;對這些條目中的任何進行修改都將忽略,直到下次伺服器重啟。

第二種設置這些配置參數的方法是把它們作為命令行參數傳遞給postmaster, 比如:

postmaster -c log_connections=yes -c log_destination='syslog'

命令行選項覆蓋任何與 postgresql.conf 衝突的選項。請注意,這意味著您不能透過編輯 postgresql.conf, 在執行時改變其數值,因此,雖然命令行方法很方便,但您在以後可能會付出靈活性的代價。

有時候,給某一個特定會話一個命令行參數也是很有用的。 可以在客戶端使用環境變量 PGOPTIONS 來實現這個目的:

env PGOPTIONS='-c geqo=off' psql

(這個選項可以用於任何基於libpq的客戶端應用,不光是 psql。) 請注意,這個變量對那些需要在伺服器啟動後固定的選項或者必須在 postgresql.conf 裡聲明的選項是無效的。

並且,我們可以給一個用戶或者一個資料庫賦予一套選項設置。 在一個會話開始的時候,裝載所涉及到的用戶和資料庫的預設設置。 命令 ALTER USERALTER DATABASE 分別用於配置這些設置。 每資料庫的設置覆蓋任何從 postmaster 命令行或者配置文件收到的設置, 然後接著又被每用戶的設置覆蓋;最後又會都被每會話的選項覆蓋。

一些選項可以用 SET 在獨立的 SQL 會話中修改, 方法是使用 SET 命令, 比如:

SET ENABLE_SEQSCAN TO OFF;

如果允許用 SET 設置,這種每資料庫的設置覆蓋任何來自 postmaster 命令行選項或者配置文件的設置。有些參數不能透過SET改變:比如, 如果這些選項不重啟動PostgreSQL就無法合理控制其行為。 同樣,有些參數是由超級用戶透過 SETALTER 修改,而普通用戶不能修改。

SHOW 命令允許檢查所有參數的目前值。

我們也可以用虛資料表 pg_settings 來顯示和更新目前會話的執行時參數。 (在 Section 41.35 裡描述)。 它等效於 SHOWSET,但是用起來更方便,因為它可以和其它資料表連接起來使用, 或者用任意用戶需要的選擇條件來查詢。

16.4.1. 文件位置

除了已經提到過的 postgresql.conf 文件之外, PostgreSQL 還使用另外兩個手工編輯的配置文件, 它們控制客戶端認證(它們的使用在 Chapter 19 裡討論)。 預設時,所有三個配置文件都存放在資料庫集群的資料目錄裡。 本節描述的選項允許配置文件放在別的地方。 (這麼做可以簡化管理,特別是如果配置文件獨立放置,通常可以很容易保證它得到恰當的備份。)

data_directory (string)

聲明為資料儲存使用的目錄。這個選項只能在伺服器啟動的時候設置。

config_file (string)

聲明主伺服器配置文件(通常叫做 postgresql.conf)。 這個選項只能在 postmaster 命令行上設置。

hba_file (string)

聲明用於主機為基礎的認證(HBA)配置文件的文件名。 (通常叫做 pg_hba.conf)。 這個選項只能在伺服器啟動的時候設置。

ident_file (string)

聲明用於 ident (身份)認證的配置文件 (通常叫做pg_ident.conf)。 這個選項只能在伺服器啟動的時候設置。

external_pid_file (string)

聲明伺服器管理程序使用的一個附加的 postmaster 進程號(PID)文件的位置。 這個選項只能在伺服器啟動的時候設置。

在預設安裝裡,不會明確設置這些參數。 取而代之的是用命令行參數 -D 或者環境變量 PGDATA 聲明資料目錄,而配置文件都放在資料目錄裡。

如果您想把配置文件放在別的地方,那麼 postmaster 的命令行參數 -D 或者環境變量 PGDATA 必須指向包含配置文件的目錄,而 postgresql.conf 裡(或者命令行上)的 data_directory 選項必須設置為資料表示資料目錄實際存放的地方。 請注意 data_directory 覆蓋 -D 上的資料目錄的設置, 但是不覆蓋配置文件的目錄。

如果您願意,您可以使用選項 config_filehba_file 和/或 ident_file 分別聲明配置文件的名字。 config_file 只能在 postmaster 命令行上設置, 但是其他的可以在主配置文件裡設置。如果明確設置了所有三個選項和 data_directory, 那麼我們必須聲明 -D 或者 PGDATA

在設置任何這些選項的時候,一個相對路徑將被解釋為與 postmaster 啟動的時候相對的路徑。

16.4.2. 連接和認證

16.4.2.1. 連接設置

listen_addresses (string)

聲明伺服器監聽客戶端應用連接的 TCP/IP 地址。 數值是從一個逗號分隔的主機名和/或數字IP地址獲取的。 特殊的條目 * 對應所有可用 IP 接口。 如果這個列資料表是空的,那麼伺服器不會監聽任何 IP 接口,這種情況下, 只有 Unix 域套接字可以用於連接資料庫。 預設值是 localhost, 它只允許進行本地 "loopback" 連接。這個參數只能在伺服器啟動的時候設置。

port (integer)

伺服器監聽的 TCP 連接埠;預設是 5432。請注意同一個連接埠號用於伺服器監聽的所有 IP 地址。 這個參數只能在伺服器啟動的時候設置。

max_connections (integer)

決定和資料庫連接的並發連接數目的最大值。 預設通常是 100,但是如果您的內核設置不支援這麼大(在 initdb 的時候判斷), 可能會比這個數少。這個參數只能在伺服器啟動的時候設置。

增大這個參數可能導致 PostgreSQL 要求更多的 System V 共享內存或者信號燈, 可能超過您的操作系統預設配置的許可值。必要的話,參閱 Section 16.5.1 獲取有關如何調節這個參數的訊息。

superuser_reserved_connections (integer)

決定為 PostgreSQL 超級用戶連接而保留的連接"槽位"。 一次最多可以同時激活 max_connections 個連接。 在活躍的並發連接到了 max_connections 減去 superuser_reserved_connections 的時候, 新的連接就只能由超級用戶發起了。

預設值是 2。這個值必須小於 max_connections 的值。 這個參數只能在伺服器啟動的時候設置。

unix_socket_directory (string)

聲明伺服器監聽客戶端應用連接來臨的 Unix 域套接字的目錄。 預設通常是 /tmp,但是預設值可以在製作的時候修改。 這個值只能在伺服器啟動的時候設置。

unix_socket_group (string)

設置 Unix 域套接字的組所有者。(套接字的所屬用戶總是啟動伺服器的用戶。) 與選項 unix_socket_permissions 一起,就可以用於控制套接字類型的附加的訪問控制。 預設的時候,這是一個空字串,資料表示使用目前用戶的預設組。這個選項只能在伺服器啟動的時候設置。

unix_socket_permissions (integer)

設置 Unix 域套接字的訪問權限。Unix 域套接字使用普通的 Unix 文件系統權限集。 這個選項值應該是數值的形式,也就是那種 Unix 域套接字調用 chmodumask 接受的形式。(要使用客戶化的八進制格式,數字必須以0 (零)開頭。)

預設的權限是 0777,意思是任何人都可以連接。 合理的候選是 0770(只有用戶和同組的人可以訪問, 又見 unix_socket_group)和 0700 (只有用戶)。(請注意,對於 Unix 域套接字,只有寫權限有意義,設置或者撤銷讀和執行權限沒有任何意義。)

這個訪問控制機制與 Chapter 19 裡描述的獨立。

這個選項只能在伺服器啟動的時候設置。

rendezvous_name (string)

聲明 Rendezvous 廣播地址。預設的時候,使用計算機名,聲明是 ''。 如果編譯時沒有打開 Rendezvous 那麼忽略這個參數。 這個選項只能在伺服器啟動的時候設置。

16.4.2.2. 安全和認證

authentication_timeout (integer)

完成客戶端認證的最長時間,以秒計。如果一個客戶端沒有在這段時間裡完成認證協議, 伺服器將中斷連接。這樣就避免了出問題的客戶端無限制地佔據連接資源。 這個選項只能在伺服器啟動的時候設置或者在 postgresql.conf 裡設置。 預設是 60。

ssl (boolean)

打開 SSL 連接。請在使用這個選項之前閱讀 Section 16.7。 預設是關。這個參數只能在伺服器啟動的時候設置。

password_encryption (boolean)

CREATE USER 或者 ALTER USER 裡聲明一個指令, 而又沒有寫 ENCRYPTED 或者 UNENCRYPTED 的時候,這個選項決定指令是否要加密。 預設是打開(加密指令)。

krb_server_keyfile (string)

設置 Kerberos 伺服器鍵字文件的位置。參閱 Section 19.2.3 獲取細節。

db_user_namespace (boolean)

這樣就允許每個資料庫的用戶名。預設是關閉的。

如果這是打開的,您應該像 username@dbname 這樣建立用戶。 在給一個正在連接的客戶端傳遞 username 的時候,必須給用戶名附加 @ 和資料庫名字, 然後伺服器查找該資料庫相關的用戶名字。請注意,如果您在 SQL 環境裡建立包含 @ 的名字時, 您需要引起用戶名。

打開這個選項之後,您還是能夠建立普通的全局用戶。 只要在客戶端聲明用戶的時候附加一個 @ 即可。 在伺服器查找這個用戶名之前,這個 @ 會被剝除。

注意: 這個特性只是臨時試驗用途,直到找到一個完全的解決方案。 那個時候,這個選項將被刪除。

16.4.3. 資源消耗

16.4.3.1. 內存

shared_buffers (integer)

設置資料庫伺服器將使用的共享內存緩衝區數量。預設通常是 1000, 如果您的內核設置不支援這麼大,那麼可以少些(在 initdb 的時候決定)。 每個緩衝區大小的典型值是 8192 字元,除非您在編譯的時候修改了 BLCKSZ 的值。這個數值必須大於 16, 並且至少是 max_connections 數值的兩倍;不過,這個數值大一些通常可以改進性能。 對於生產安裝,我們通常建議是幾千。 這個選項只能在伺服器啟動的時候設置。

增大這個參數可能導致 PostgreSQL 要求更多 System V 的共享內存, 超出您的操作系統配置許可的範圍。必要時請參閱 Section 16.5.1 獲取如何調整這些參數的訊息。

work_mem (integer)

聲明內部排序操作和散列資料表在開始使用臨時磁盤文件之前使用的內存數目。 數值是以千字元為單位的,預設是 1024 千字元(1 MB)。 請注意對於複雜的查詢,可能會同時並發執行好幾個排序或者散列操作; 每個都會被批准使用這個參數聲明的這麼多內存,然後才會開始求助於臨時文件。 同樣,好幾個正在執行的會話可能會同時進行排序操作。因此使用的總內存可能是 work_mem 的好幾倍。 在 ORDER BY,融合連接,以及 CREATE INDEX 裡都要用到排序操作。 散列資料表在散列連接,散列為基礎的聚集,以及散列為基礎的 IN 子查詢處理中都要用到。

maintenance_work_mem (integer)

聲明在維護性操作中使用的最大的內存數,比如 VACUUMCREATE INDEX,和 ALTER TABLE ADD FOREIGN KEY 等。 數值是用千字元計的,預設是 16384 千字元(16 MB)。因為在一個資料庫會話裡,任意時刻只有一個這樣的操作可以執行, 並且一個資料庫安裝通常不會有太多這樣的工作並發執行,把這個數值設置得比 work_mem 更大是安全的。 更大的設置可以改進清理和恢復資料庫轉儲的速度。

max_stack_depth (integer)

聲明伺服器的執行堆棧的最大安全深度。為此設置一個參數的原因是內核強制的實際堆棧尺寸(就是 ulimit -s 或者局部等效物的設置),小於一個安全的一兆字元左右的範圍。 需要這麼一個安全的界限是因為在伺服器裡,並非所有過程都檢查了堆棧深度, 兒只是在可能遞規的過程,比如資料表達式計算這樣的過程裡面進行檢查。 把這個參數設置得大於實際的內核限制講意味著一個正在跑的遞歸函數可能會導致一個獨立伺服器進程的崩潰。 預設設置是 2048 KB (兩兆),這個值相對比較小,不容易導致崩潰。 但是,這個值可能太小了,以至於無法執行複雜的函數。

16.4.3.2. 自由空間映射

max_fsm_pages (integer)

設置在共享的自由空間映射資料表裡自由空間會跟蹤的最大數目的磁盤頁面數。 每個頁面槽位需要消耗六個字元的共享內存。這個設置必須大於 16 * max_fsm_relations。 預設是 20000。這個選項只能在伺服器啟動的時候設置。

max_fsm_relations (integer)

設置自由空間將在共享地自由空間映射裡跟蹤的最大數目的關係(資料表和索引)。 每個槽位大概要使用五十字元左右。預設是 1000。這個選項只能在伺服器啟動的時候設置。

16.4.3.3. 內核資源使用

max_files_per_process (integer)

設置每個伺服器進程允許同時打開的最大的文件數目。預設是 1000。 如果內核強制一個合理的每進程限制, 那麼您不用操心這個設置。但是在一些平台上(特別指出的是,大多數 BSD 系統), sysconf 返回一個系統真正可以支援的數目大的多的數值。 如果您發現有 "Too many open files" 這樣的失敗現象,那麼就嘗試縮小這個設置。 這個選項只能在伺服器啟動時設置。

preload_libraries (string)

這個變量聲明一個或者多個在伺服器啟動的時候預先裝載的共享庫。 可以選擇在裝載每個庫的時候調用一個無參數的初始化函數。 要聲明這個函數,可以在庫名字後面加一個冒號,然後增加一個初始化函數名字。 比如 '$libdir/mylib:mylib_init' 會預先裝載 mylib 並且執行 mylib_init。 如果裝載了多過一個庫,用逗號分隔它們。

如果沒有找到聲明的庫或者沒有找到初始化函數,那麼伺服器將啟動失敗。

可以用這個方法預先裝載 PostgreSQL 的過程語言庫, 通常是使用 '$libdir/plXXX:plXXX_init' 語法,這裡的 XXXpgsqlperltcl,或者 python

透過預先裝載一個共享庫(以及在需要的時候初始化它), 我們就可以避免第一次使用這個庫的那些啟動時間。不過,啟動每個伺服器進程的時間可能會增加, 即使進程從來沒有使用過這些庫也這樣。因此我們只是建議對那些將被大多數會話使用的庫才使用這個選項。

16.4.3.4. 基於開銷的清理延遲

VACUUMANALYZE 命令執行過程中, 系統維護一個內部的指針,這個指針跟蹤所執行的各種 I/O 操作的近似開銷。 如果積累的開銷達到了一個限制(透過 vacuum_cost_limit 聲明), 那麼執行這個操作的進程將睡眠一會兒(用 vacuum_cost_delay 聲明)。 然後它會重置指針然後繼續執行。

這個特性的目的時允許管理員減少這些命令在並發活動的資料庫上的 I/O 影響。 有些情況下,像 VACUUMANALYZE 這樣的維護命令並不需要迅速完成; 但是,通常都不希望這些命令會嚴重干擾系統執行其它資料庫操作的響應能力。 基於開銷的清理延遲為管理員提供了一個實現這個目的的手段。

預設的時候,這個特性是關閉的。要想打開它,把 vacuum_cost_delay 變量設置為一個非零值。

vacuum_cost_delay (integer)

以毫秒計的時間長度,如果超過了開銷限制,那麼進程將睡眠一會兒。 預設值是 0,它關閉基於開銷的清理延遲特性。正數值打開基於開銷的清理。 不過,要注意在許多系統上,sleep 延遲的有效分辨率是 10 毫秒; 把 vacuum_cost_delay 設置為一個不是 10 的整數倍的數值與將它設置為下一個 10 的整數倍作用相同。

vacuum_cost_page_hit (integer)

清理一個在共享緩存裡找到的緩衝區的開銷。它代資料表鎖住緩衝池,查找共享的散列資料表以及掃瞄頁面的內容的開銷。 預設值是 1。

vacuum_cost_page_miss (integer)

清理一個要從磁盤上讀取的緩衝區的估計開銷。 這個行為代資料表鎖住緩衝池,查找共享散列資料表,從磁盤讀取需要的資料塊以及掃瞄它的內容的開銷。 預設值是 10。

vacuum_cost_page_dirty (integer)

如果清理修改一個原先是乾淨的塊的預計開銷。它需要一個把髒的磁盤塊再次沖刷到磁盤上的額外開銷。 預設值是 20。

vacuum_cost_limit (integer)

導致清理進程休眠的積累開銷。預設是 200。

注意: 有些操作會持有關鍵的鎖,並且應該盡快結束。 在這樣的操作過程中,基於開銷的清理延遲不會發生作用。 為了避免在這種情況下的長延時,實際的延遲是這樣計算的: vacuum_cost_delay * accumulated_balance / vacuum_cost_limitvacuum_cost_delay * 4 之間的最大值。

16.4.3.5. 後端寫進程

PostgreSQL 8.0 開始,就有一個獨立的伺服器進程,叫做後端寫進程, 它唯一的功能就是發出寫"髒"共享緩衝區的命令。 這麼做的目的是讓持有用戶查詢的伺服器進程應該很少或者幾乎不等待寫動作的發生, 因為後端寫進程會做這件事情。這樣的安排同樣也減少了檢查點造成的性能下降。 後端寫進程將持續的把髒頁面刷新到磁盤上,所以再檢查點到來的時候,只有幾個頁面需要刷新到磁盤上。 但是這樣還是增加了 I/O 的總淨負荷,因為以前的檢查點間隔裡,一個重複弄髒的頁面可能只會沖刷一次, 而同一個間隔裡,後端寫進程可能會寫好幾次。在大多數情況下,連續的低負荷要比週期性的尖峰負荷好, 但是在本節討論的參數可以用於為本地需要調節其行為。

bgwriter_delay (integer)

聲明後端寫進程活躍回合之間的延遲。在每個回合裡,寫進程都會為一些髒的緩衝區發出寫操作 (可以用下面的參數控制)。選取的緩衝區總是那些在目前的髒緩衝區裡目前最少使用的。 然後它就休眠 bgwriter_delay 毫秒,然後重複動作。預設值是 200。 請注意在許多系統上,休眠延時的有效分辨率是 10 毫秒;因此,設置 bgwriter_delay 為一個不是 10 的倍數的數值與把它設置為下一個 10 的倍數是一樣的效果。 這個選項只能在伺服器啟動的時候或者 postgresql.conf 文件裡設置。

bgwriter_percent (integer)

在每個回合裡,目前的髒緩衝區中不超過這個百分比的量將被寫到磁盤上 (把小數圓整為下一個整數緩衝區的數值)。 這個選項只能在伺服器啟動的時候或者 postgresql.conf 文件裡設置。

bgwriter_maxpages (integer)

在每個回合裡,不超過這個數值的髒緩衝區寫入。預設值是 100。 這個選項只能在伺服器啟動的時候或者 postgresql.conf 文件裡設置。

小的 bgwriter_percentbgwriter_maxpages 減少後端寫進程導致的額外 I/O 負荷, 但是會導致在檢查點的時候的更多工作。要降低檢查點時的峰值負荷,增加這些值。 要想完全關閉後台寫進程,可以把 bgwriter_percent 和/或 bgwriter_maxpages 設置為零。

16.4.4. 預寫式日誌

又見 Section 25.2 獲取 WAL 調節的細節。

16.4.4.1. 設置

fsync (boolean)

如果這個選項是打開,那麼 PostgreSQL 伺服器將在好幾個地方使用 fsync() 系統調用來確保更新已經實際上寫到磁盤中。 這樣就保證了資料庫集群將在操作系統或者硬件崩潰的情況下恢復到一個一致的狀態。

不過,使用 fsync() 會對性能有影響: 在交易提交的時候,PostgreSQL 必須等待操作系統您預寫日誌刷新到磁盤上。 在關閉 fsync 的時候,操作系統可以盡可能優化緩衝,排序和推遲寫動作。 這樣可以顯著提高性能。不過,如果系統崩潰,最後提交的幾個交易的結果可能部分或者全部丟失。 最糟糕的情況是可能出現不可恢復的崩潰。 (資料庫伺服器本身並不是這裡的風險因素。 只有一個操作系統級別的崩潰會導致毀壞資料的風險。)

因為涉及的風險太高,fsync 的設置沒有普適的原則。 有些管理員總是關閉 fsync,而其它一些只是在批量裝載的時候關閉它, 因為這個時候,如果出現了錯誤,那麼就有個明確的重新開始的點, 而另外一些管理員總是打開 fsync。 預設是打開fsync,目的是最大限度的可靠性。 如果您信任您的操作系統,您的硬件,以及您的工具公司(或者您的備份電池), 您可以考慮關閉 fsync

這個選項只能在伺服器啟動或者 postgresql.conf 文件裡設置。

wal_sync_method (string)

用來向磁盤強制更新 WAL 資料的方法。可能的值是 fsync(每次提交的時候調用 fsync()), fdatasync(每次提交的時候調用 fdatasync()), open_sync(帶著 open() 選項 O_SYNC 寫 WAL 文件),以及 open_datasync(帶著 open() 選項 O_DSYNC 寫 WAL 文件)。 不是在所有系統上都能使用上面四種選項。如果 fsync 關閉,那麼這個設置無關。 這個選項只能在伺服器啟動的時候和在postgresql.conf文件裡設置。

wal_buffers (integer)

放在共享內存裡用於 WAL 資料的磁盤頁面緩衝區的數目。 這個設置只需要大到能保存下一次交易生成的 WAL 資料即可。 這個選項只能在伺服器啟動的時候設置。

commit_delay (integer)

向 WAL 緩衝區寫入記錄和將緩衝區刷新到磁盤上之間的時間延遲,以微秒計。 一個非零的延遲允許多個交易共用一個 fsync() 系統調用提交, 如果系統負載足夠搞,那麼在給出的間隔裡,其它的交易可能已經準備好提交了。 但是如果沒有其它交易準備提交,那麼這個間隔就是在浪費時間。 因此,這個延遲只是在一個伺服器進程寫其提交日誌時,至少 commit_siblings 個其它交易在活躍的情況下執行。 預設是零(無延遲)。

commit_siblings (integer)

在執行 commit_delay 延遲的時候,要求的最少的打開的並發交易數目。 大一些的數值會導致在延遲期間另外一個交易準備好提交的可能性增大。預設是五。

16.4.4.2. 檢查點

checkpoint_segments (integer)

在自動的 WAL 檢查點之間的最大距離,以日誌文件段(每個段通常 16 兆大)計。 預設是三。這個選項只能在伺服器啟動或者在 postgresql.conf 文件裡設置。

checkpoint_timeout (integer)

在自動 WAL 檢查點之間的最長時間,以秒計。預設是 300 秒。 這個選項只能在伺服器啟動的時候或者在 postgresql.conf 文件裡設置。

checkpoint_warning (integer)

如果因為填充檢查點段文件發生的檢查點的間隔比這個數值資料表示的秒數更多, 那麼向伺服器日誌發送一個消息。預設是 30 秒。零則關閉警告。

16.4.4.3. 歸檔

archive_command (string)

用來將一個完整的 WAL 文件序列歸檔執行的 shell 命令。 如果這是一個空字串(預設),那麼 WAL 歸檔就關閉。字串中任何 %p 都被要歸檔的文件的絕對路徑代替, 而任何 %f 都只被該文件名代替。如果您需要在命令裡嵌入真正的 %,寫 %%。 有關更多的訊息,參閱 Section 22.3.1。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

有一點很重要:這個命令必須是當且僅當成功的時候才返回零。比如:

archive_command = 'cp "%p" /mnt/server/archivedir/"%f"'
archive_command = 'copy "%p" /mnt/server/archivedir/"%f"'  # Windows

16.4.5. 查詢規劃

16.4.5.1. 規劃器方法配置

這些配置參數提供了一個用於影響查詢優化器選擇的查詢規劃的原始的方法。 如果優化器為特定的查詢選擇的預設規劃並不是最優, 那麼我們就可以透過使用這些配置參數強制優化器選擇一個更好的規劃來臨時解決這個問題。 不過,永久地關閉這些設置幾乎從不是個好主意。 更好的改善優化器選擇的規劃的方法包括配置 規劃器開銷常量, 更頻繁執行 ANALYZE, 增大配置參數 default_statistics_target 的值, 以及使用 ALTER TABLE SET STATISTICS 為某個字串增加蒐集的統計訊息。

enable_hashagg (boolean)

打開或者關閉查詢規劃器對散列聚集規劃類型的時候。預設是打開。

enable_hashjoin (boolean)

打開或者關閉查詢規劃器對散列連接規劃類型的使用。 預設是打開。

enable_indexscan (boolean)

打開或者關閉查詢規劃期對索引掃瞄規劃類型的使用。 預設是打開。

enable_mergejoin (boolean)

打開或者關閉查詢規劃器對融合連接規劃類型的使用。 預設是打開。

enable_nestloop (boolean)

打開或者關閉查詢規劃器對嵌套循環連接規劃類型的使用。 我們不可能完全消除嵌套循環連接,但是把這個變量關閉就會讓規劃器在存在其它方法的時候優先選擇其他的。 預設是打開。

enable_seqscan (boolean)

打開或者關閉查詢規劃器對順序掃瞄規劃類型的使用。 我們不可能完全消除順序掃瞄,但是把這個變量關閉會讓規劃器在存在其它方法的時候優先選擇其它的。 預設是打開。

enable_sort (boolean)

打開或者關閉查詢規劃器使用明確的排序步驟。我們不可能完全消除明確的排序, 但是把這個變量關閉可以讓規劃器在存在其它方法的時候優先選擇其它方法。 預設是打開。

enable_tidscan (boolean)

打開或者關閉查詢規劃器對 TID 掃瞄規劃類型的使用。 預設是打開。

16.4.5.2. 規劃器開銷常量

注意: 糟糕的是,現在還沒有定義得很合理的方法來判斷下面出現的"開銷"變量族的理想數值。 我們鼓勵您做各種試驗並分享您的發現。

effective_cache_size (floating point)

為規劃器設置在一次索引掃瞄中可用的磁盤緩衝區的有效大小。 這個參數在計算一個索引的開銷的預計值的時候會加以考慮; 一個更高的數值會導致很可能使用索引掃瞄,數值低了會更有可能選擇順序掃瞄。 在設置這個參數的時候,您還應該考慮 PostgreSQL 的資料文件會使用的的共享緩衝區和內核的磁盤緩衝。 還有,還要考慮預計會有的使用不同索引的並發查詢數目, 因為它們必須共享可用的內存空間。這個參數對 PostgreSQL 分配的共享內存大小沒有影響, 它也不會使用內核磁盤緩衝;它只用於估算。數值是用磁盤頁來計算的, 通常每個頁面是 8192 字元。預設是 1000。

random_page_cost (floating point)

設置規劃器計算的一次非順序磁盤頁面抓取的開銷。 這是以順序磁盤頁面抓取的開銷的倍數計量的。 更高的數值令優化器更傾向於選擇一次順序掃瞄,低數值的時候則傾向於使用索引掃瞄。 預設是四。

cpu_tuple_cost (floating point)

設置規劃器預計在一次查詢中處理一個資料行的開銷。 這是以一次順序頁面抓取的開銷的分數來計量的。 預設是 0.01。

cpu_index_tuple_cost (floating point)

設置在一次索引掃瞄中規劃器計算出來的處理每條索引行的開銷。 這是以一次順序頁面抓取的開銷的分數來計量的。預設是 0.001。

cpu_operator_cost (floating point)

設置規劃器計算出來的處理一條WHERE子句中的每個操作符的開銷。 這是以一次順序頁面抓取的開銷的分數來計量的。預設是 0.0025。

16.4.5.3. 基因查詢優化器

geqo (boolean)

允許或禁止基因查詢優化,這是一種試圖不透過窮舉搜索來實現查詢規劃的算法。預設是允許。 geqo_threshold 變量提供了一種為特定類別的查詢關閉 GEQO 的粒度更好的方法。

geqo_threshold (integer)

只有當涉及的FROM關係數量至少有這麼多個的時候,才使用基因查詢優化。 (請注意一個外JOIN構造只算做一個FROM項。) 預設是 12,對於數量小於此數的查詢,也許使用判定性的窮舉搜索更有效。 但是對於有許多資料表的查詢,規劃器做判斷要花很多時間。

geqo_effort (integer)

控制 GEQO 裡規劃時間和查詢規劃的有效性之間的平衡。 這個變量必須事一個範圍從 1 到 10 的整數。預設值是 5。 大的數值增加花在進行查詢規劃上面的時間,但是也很可能會提高選中更有效的查詢規劃的幾率。

geqo_effort 實際上並沒有直接幹什麼事情; 只是用於計算其它那些影響 GEQO 行為的變量的預設值(在下面描述)。 如果您願意,您可以手工設置其它參數。

geqo_pool_size (integer)

控制 GEQ0 使用的池大小。池大小是一個全體中的個體的數量。 它必須至少是二,並且有用的數值通常在 100 和 1000 之間。 如果把它設置為零(預設設置),那麼就會基於 geqo_effort 和查詢中資料表的數量選取一個合適的預設。

geqo_generations (integer)

控制 GEQO 使用的子代的數目。子代聲明算法的迭代的數目。 它必須至少是一,有用的值範圍和池的大小相同。如果設置為零(預設),那麼將基於 geqo_pool_size 選取合適的預設。

geqo_selection_bias (floating point)

控制 GEQO 使用的選擇性偏好。選擇性偏好是在一個種群中的選擇性壓力。 數值可以是 1.5 到 2.0 之間;後者是預設。

16.4.5.4. 其它規劃器選項

default_statistics_target (integer)

為沒有用 ALTER TABLE SET STATISTICS 設置字串相關目標的資料表中其它字串設置預設統計目標。 更大的數值增加了 ANALYZE 所需要的時間,但是可能會改善規劃器的估計質量。預設值是 10。 有關 PostgreSQL 的查詢規劃器使用的統計的更多訊息,請參考 Section 13.2

from_collapse_limit (integer)

如果生成的 FROM 列資料表不超過這個限制的項數,規劃器將把子查詢融合到上層查詢。 小的數值降低規劃的時間,但是可能會生成差些的查詢計劃。 預設是 8。通常,把它限制在小於 geqo_threshold 的數值是比較明智的。

join_collapse_limit (integer)

如果得出的列資料表不超過這個數目的項,那麼規劃器將把明確的內 JOIN 構造抹平到 FROM 列資料表項中。 PostgreSQL 7.4 以前,透過 JOIN 構造聲明的連接絕對不會被查詢規劃期重排。 現在的查詢規劃器已經改進過了,這樣,用這種形式寫出來的內層連接就可以重排了; 這個配置參數控制這種重排的程度。

注意: 目前,用 JOIN 構造聲明的外連線的順序從來不會查詢規劃器被調整; 因此,join_collapse_limit 在這個行為上沒有效果。 在未來的 PostgreSQL 版本裡,規劃器可能會改進某些外連線類型的重排。

預設時,這個值設置為和 from_collapse_limit 相同, 這個值適合大多數場合。把它設置為 1 則避免任何內 JOIN 的融合,就可以使用明確的 JOIN 語法來控制連接順序。查詢優化器並不是總能選取最優的連線順序;高級用戶可以選擇暫時把這個變量設置為 1, 然後明確地聲明他們需要的連線順序。把這個變量設置為 1 的另外一個後果是查詢規劃器會資料表現得更像 PostgreSQL 7.3 查詢規劃器,可能對一些用戶做向下兼容很有用。

把這個數值設置為 1 和 from_collapse_limit 之間可能對於在規劃時間和選取的規劃的質量之間有個平衡 (越高的數值生成越好的規劃)。

16.4.6. 錯誤報告和日誌

16.4.6.1. 在哪裡記錄日誌

log_destination (string)

PostgreSQL 支援多種記錄伺服器日誌的方法, 包括 stderrsyslog。 在 Windows 裡,還支援 eventlog。 允許把 syslog 作為日誌系統。 把這個選項設置為一個逗號分隔的日誌目標的列資料表。預設是只記錄到 stderr。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

redirect_stderr (boolean)

這個選項允許把那些發送到 stderr 的消息捕獲下來, 然後把它們重定向到日誌文件裡。這個選項,加上日誌記錄到 stderr 裡的組合, 通常比記錄到 syslog 更有用, 因為有些消息類型不出現在 syslog 輸出(一個常見的例子是動態連接失敗消息)。 這個選項只能在伺服器啟動的時候設置。

log_directory (string)

在打開了 redirect_stderr 的時候, 這個選項判斷日誌文件在哪個目錄裡建立。 它可以聲明成絕對路徑,或者是與集群的資料目錄相對的路徑。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

log_filename (string)

在打開了 redirect_stderr 的時候,這個選項設置所建立的日誌文件的文件名。 這個數值是當作 strftime 模式看待的。 因此 % 逃逸可以聲明因時間而變的文件名。 如果沒有出現 % 逃逸,PostgreSQL 將附著日誌文件打開的紀元時間。 比如,如果 log_filenameserver_log, 那麼選擇的文件名將是 server_log.1093827753 — 假如日誌文件開始於 Sun Aug 29 19:02:33 2004 MST 的話。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

log_rotation_age (integer)

在打開了 redirect_stderr 的時候, 這個選項設置一個獨立的日誌文件的最大生存期。 在數值指定的分鐘過去之後,將建立一個新的日誌文件。 設置為零可以關閉以時間為基礎的新日誌文件的建立。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

log_rotation_size (integer)

在打開了 redirect_stderr 的時候, 這個選項設置一個獨立的日誌文件的最大尺寸。 在數值指定的千字元寫入日誌文件之後,將會建立一個新的日誌文件。 設置為零可以關閉以尺寸為基礎的新日誌文件的建立。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

log_truncate_on_rotation (boolean)

如果打開了 redirect_stderr,這個選項將導致 PostgreSQL 階段(覆蓋),而不是附加到任何同名的現有日誌文件上。 不過,截斷只是發生在因為以時間為基礎的旋轉的時候建立的新文件上, 而不是在伺服器啟動的時候或者以尺寸為基礎的旋轉上。 比如,使用這個選項和類似 postgresql-%H.log 這樣的 log_filename 將導致生成 24 個按小時生成的日誌文件然後在這些文件上循環。 這個選項只能在伺服器啟動的時候在 postgresql.conf 文件裡面設置。

例子:保留 7 天的日誌,每天一個日誌文件,叫做 server_log.Monserver_log.Tue,等等,並且上周的日誌會自動被這周的日誌覆蓋, 把 log_filename 設置為 server_log.%alog_truncate_on_rotation 設置為 true, 並且把 log_rotation_age 設置為 1440

例子:保留 24 小時的日誌,每小時一個日誌,但是如果日誌文件尺寸大於 1GB 也旋轉日誌, 設置 log_filenameserver_log.%H%Mlog_truncate_on_rotationtruelog_rotation_age60,並且把 log_rotation_size 設置為 1000000。 在 log_filename 裡包含 %M 允許任何尺寸驅動的旋轉選取一個和開始的文件名同小時數但是名字不同的文件。

syslog_facility (string)

如果把日誌記錄到 syslog 功能打開, 那麼這個選項在打開syslog後判斷要使用的 syslog "設施"。 您可以從 LOCAL0LOCAL1LOCAL2LOCAL3LOCAL4LOCAL5LOCAL6LOCAL7 中選擇;預設是LOCAL0。 又見您的系統的 syslog 守護進程文件。這個選項只能在伺服器啟動的時候設置。

syslog_ident (string)

如果打開了向syslog中記日誌的功能, 這個選項決定用於在 syslog 日誌中標識 PostgreSQL 的程序名。預設是 postgres。 這個選項只能在伺服器啟動的時候設置。

16.4.6.2. 什麼時候記日誌

client_min_messages (string)

這個選項控制那些訊息發送到客戶端。 有效的數值是 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1LOGNOTICEWARNINGERROR。 每個級別包含所有它後面的級別,級別越靠後,發送的訊息越少。 預設是 NOTICE。這裡的 LOGlog_min_messages 裡面的有不同的級別。

log_min_messages (string)

控制寫到伺服器日誌裡的訊息的詳細程度。有效值是 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORLOGFATAL,和 PANIC。 每個級別都包含它後面的級別。越靠後的數值發往伺服器日誌的訊息越少。 預設是 NOTICE。請注意 LOGclient_min_messages 裡面的同名級別優先級不同。 只有超級用戶可以修改這個設置。

log_error_verbosity (string)

控制記錄的每條訊息寫到伺服器日誌裡的詳細程度。 有效的值是 TERSEDEFAULT,和 VERBOSE, 每個都會向顯示的訊息裡增加更多的字串。只有超級用戶可以改變這個設置。

log_min_error_statement (string)

控制是否在伺服器日誌裡輸出那些導致錯誤條件的 SQL 語句。 所有導致一個特定級別(或者更高級別)的錯誤的 SQL 語句都要被記錄日誌。 預設是 PANIC(實際上是把這個特性關閉了)。 有效的值有 DEBUG5DEBUG4DEBUG3DEBUG2DEBUG1INFONOTICEWARNINGERRORFATAL,和 PANIC。 比如,如果您把這個設置為 ERROR, 那麼所有導致錯誤,致命錯誤,或者恐慌的 SQL 語句都將被記錄日誌。 打開這個選項可以幫助跟蹤那些在伺服器日誌裡出現的任何錯誤的源頭。 只有超級用戶可以改變這個設置。

log_min_duration_statement (integer)

設置要記錄日誌的語句的最小執行時間(以毫秒計)。 所有執行時間等於或者大於這個值的 SQL 語句都會在和他們的執行時間一起記錄在日誌裡。 把這個設置為零將打印所有的查詢和他們的持續時間。 設置為負一(預設值)關閉這個功能。比如,如果您把它設置為 250, 那麼所有執行時間等於或者超過 250ms 的 SQL 語句都會被記錄日誌。 打開這個選項可以很方便地跟蹤您的應用裡那些沒有優化地查詢。 只有超級用戶可以修改這個設置。

silent_mode (boolean)

安靜的執行伺服器。如果設置了這個選項,伺服器將自動在後台執行並且與控制終端脫開 (和 postmaster-S 選項效果一樣)。 伺服器的標準輸出和標準錯誤重定向到 /dev/null,因此,發送的任何訊息都將丟失。 除非打開了 syslog 日誌或者打開了 redirect_stderr, 否則我們不建議使用這個選項,因為它讓我們很難看到錯誤訊息。

這裡是這個設置裡用到各種訊息嚴重程度類型的一個列資料表:

DEBUG[1-5]

這個提供開發人員使用的訊息。

INFO

這個提供用戶隱含要求的訊息,比如在 VACUUM VERBOSE 過程中的訊息。

NOTICE

這個提供可能對用戶有幫助的訊息,比如,長標識符的截斷, 作為主鍵一部分建立的索引。

WARNING

這個提供給用戶的警告,比如在交易範圍之外的 COMMIT

ERROR

報告導致目前命令退出的錯誤。

LOG

這個報告一些管理員感興趣的訊息,比如,檢查點活躍性。

FATAL

這個報告為什麼目前會話終止。

PANIC

報告導致所有會話退出的原因。

16.4.6.3. 記錄什麼

debug_print_parse (boolean)
debug_print_rewritten (boolean)
debug_print_plan (boolean)
debug_pretty_print (boolean)

這個選項打開出的各種調試輸出。 對於執行的每個查詢,它們打印生成的它生成的分析樹,查詢重寫,或者執行規劃。 debug_pretty_print 把這些輸出進行縮進,會生成漂亮些但是長一些的輸出格式。 client_min_messages 或者 log_min_messages 必須是 DEBUG1 或者更低才實際上把輸出發往客戶端或者伺服器日誌。這些選項預設都是關閉的。

log_connections (boolean)

這樣會在每次成功的連線的時候都向伺服器日誌裡打印一行詳細訊息。 預設時是關閉的,儘管它可能很有用。這個選項只能在伺服器啟動的時候設置, 或者在 postgresql.conf 配置文件裡設置。

log_disconnections (boolean)

這個選項在會話結束的時候在伺服器日誌裡輸出一行,類似 log_connections。 預設是關閉的。這個選項只能在伺服器開始時設置或者在 postgresql.conf 配置文件裡設置。

log_duration (boolean)

導致每個滿足 log_statement 之條件已完成語句的持續時間都寫入日誌。要使用這個選項, 而您又不使用 syslog,那麼我們建議您用 log_line_prefix 記錄 PID 或者會話 ID, 這樣您就可以用進程 ID 或者會話 ID 把語句和持續時間連接起來。 預設是關閉。如果管理員打開過它,那麼只有超級用戶可以修改這個設置。

log_line_prefix (string)

這是一個 printf 風格的字串,在日誌的每行開頭輸出。 預設時一個空字串。每個可識別的逃逸都會按照下面說明的那樣逃逸 - 任何其它看起來像逃逸的都會被忽略。 其它字元都直接拷貝到日誌行中。有些逃逸只被會話進程識別,不能應用於後端進程,比如 postmaster。 Syslog 生成自己的時間戳和進程 ID 訊息,因此,如果您使用了 syslog, 可能不會想使用那些逃逸。這個選項只能在伺服器啟動或者 postgresql.conf 配置文件裡設置。

逃逸效果僅用於會話
%u用戶名
%d資料庫名
%r遠程主機名或者 IP 地址,以及遠端連接埠
%p進程 ID
%t時間戳
%i命令標籤。這是生成日誌行的命令。
%c 會話 ID。一個每個會話的唯一標識符。 它是兩個 4 字元的十六進制數字(沒有前導零),用句點分開。 數字是會話開始時間和進程 ID,因此也可以用做一種打印這些項目的節約空間的方法。
%l 每個進程的日誌行的編號,從 1 開始。
%s會話開始的時間戳
%x交易 ID
%q 不生成任何輸出,但是告訴非會話進程在字串的這個位置停止。 被會話進程忽略。
%%文本 %

log_statement (string)

控制記錄哪個 SQL 語句。有效的值是 noneddlmod,和 allddl 記錄所有資料定義命令, 比如 CREATEALTER,和 DROP 命令。 mod 記錄所有 ddl 語句, 加上 INSERTUPDATEDELETETRUNCATE,和 COPY FROM。如果所包含的命令類型對路,那麼PREPAREEXPLAIN ANALYZE 語句也同樣被記錄。

預設是 none。只有超級用戶可以修改這個設置。

注意: EXECUTE 語句不認為是 ddl 或者 mod 語句。 如果記錄它的日誌,那麼只有準備好的語句的名字被記錄,不包括實際的準備好的語句。

如果一個函數用一種類似 PL/pgSQL 的伺服器端編程語言定義, 那麼,任何該函數執行的查詢都只在該函數第一此調用的時候記錄日誌。 這是因為 PL/pgSQL 為函數里的 SQL 語句保存一份該查詢規劃的緩存。

log_hostname (boolean)

預設時,連線日誌只記錄所連線主機的 IP 地址。 打開這個選項導致同時記錄主機名。 請注意,這樣有可能帶來一些不可忽略的性能損失, — 取決於您的名字解析的設置。這個選項只能在伺服器啟動的時候或者在 postgresql.conf 裡設置。

16.4.7. 執行時統計

16.4.7.1. 統計監控

log_statement_stats (boolean)
log_parser_stats (boolean)
log_planner_stats (boolean)
log_executor_stats (boolean)

對每條查詢,向伺服器日誌裡輸出相應模塊的性能統計。 log_statement_stats 報告總的語言統計,而其它的報告模塊的統計。 這是原始的剖析工具。log_statement_stats 不能和其它任何按模塊統計的選項一起打開。 預設時所有這些選項都是關閉的。只有超級用戶才能修改這些設置。

16.4.7.2. 查詢和索引統計蒐集器

stats_start_collector (boolean)

控制伺服器是否啟動統計蒐集子進程。預設時是打開, 但如果您對統計蒐集不感興趣,那麼可以關閉。這個選項只能在啟動伺服器時設置。

stats_command_string (boolean)

打開每個會話目前執行的命令的統計蒐集,以及該命令開始執行的時間。 這個選項預設是關閉的。請注意即使把它打開,這個訊息也不是所有用戶都可見的, 只有超級用戶和會話的所有者才能看到;因此它不應該是個安全漏洞。 這些資料可以透過系統視圖 pg_stat_activity 訪問, 請參考 Chapter 23 獲取更多訊息。

stats_block_level (boolean)

打開資料庫活躍性的塊級別的統計蒐集。這個選項預設時是關閉的。 如果打開這個選項,生成的資料可以透過 pg_statpg_statio 族函系統視圖訪問; 請參考 Chapter 23 獲取更多訊息。

stats_row_level (boolean)

打開資料庫活躍性的塊級別和行級別的統計。 這個選項預設是關閉的。生成的資料可以透過 pg_statpg_statio 族系統視圖來訪問。 請參考 Chapter 23 獲取更多訊息。

stats_reset_on_server_start (boolean)

如果打開,那麼在伺服器啟動的時候蒐集的訊息被清零。 如果關閉,那麼統計在伺服器重起過程中累加。預設是打開。 這個選項只能在伺服器啟動的時候設置。

16.4.8. 客戶端連接預設

16.4.8.1. 語句行為

search_path (string)

這個變量聲明模式的搜索順序,在一個被引用對像(資料表,資料類型,函數等)只是一個簡單名字, 沒有附加模式部分時需要這樣的搜索。 如果在另外一個模式裡有一個相同的對象名,那麼使用在這個搜索路徑中找到的第一個。 一個沒有在搜索路徑中任何一個模式裡出現的對象只能透過其所在模式的全稱(打點的)名字來聲明。

search_path 的值必需是一個逗號分隔的模式名的列資料表。 如果列資料表項之一是特殊值 $user, 那麼該模式和 SESSION_USER 所代換的名字一樣 — 如果存在這個模式的話。 (如果沒有,那麼忽略 $user。)

系統資料表模式,pg_catalog,總是被搜索,不管我們有沒有在路徑裡提到它。 如果我們在路徑中提到它,那麼將按照指定的順序搜索。 如果 pg_catalog 沒有在路徑中,那麼它將在任何路徑項之前得到搜索。 我們還要注意的是,臨時資料表模式,pg_temp_nnn,也隱含在任何這些項之前得到搜索。

如果建立對像時沒有聲明特定的目標模式,那麼它將被放到搜索路徑中的第一個模式。如果搜索路徑是空的,那麼會報告一個錯誤。

這個參數的預設值是 '$user, public' (如果沒有叫 public 的模式,那麼第二部分將被忽略)。 這樣就支援共享使用一個資料庫(這個時候沒有用戶擁有私有模式, 並且所有人都共享使用 public),私有的每用戶的模式, 以及這些的組合。其它效果可以透過(全局或者每用戶地)修改搜索路徑設置獲取。

搜索路徑目前的有效值可以用 SQL 函數 current_schemas() 檢查。 它和檢查 search_path 的值並不太一樣, 因為 current_schemas() 顯示的是在 search_path 裡出現的請求如何被分析。

有關模式處理的更多訊息,參閱 Section 5.8

default_tablespace (string)

這個變量聲明當 CREATE 命令沒有明確聲明資料表空間時, 所建立之對象(資料表和索引等)的預設資料表空間。

數值要麼是一個資料表空間的名字,要麼是一個空串,資料表明使用目前資料庫的預設資料表空間。 如果這個數值和任意現存資料表空間的名字不匹配,那麼 PostgreSQL 將自動使用目前資料庫的預設資料表空間。

有關資料表空間的更多的訊息,參閱 Section 18.6

check_function_bodies (boolean)

這個參數通常是真。如果設置為假,那麼就關閉在 CREATE FUNCTION 時候的函數體字串的合法性檢查。 關閉合法性檢查有時候會有用,比如可以避免在從轉儲中恢復函數定義的時候類似前向引用的問題。

default_transaction_isolation (string)

每個 SQL 交易都有一個隔離級別,可以是"讀未提交""讀已提交""可重複讀"或者是"可串性化"。 這個參數控制每個新的交易的隔離級別。預設是讀已提交。

參考 Chapter 12SET TRANSACTION 獲取更多訊息。

default_transaction_read_only (boolean)

只讀的 SQL 交易不能修改非臨時資料表。這個參數控制每個新交易的只讀狀態。 預設是假(讀/寫).

參考 SET TRANSACTION 獲取更多訊息。

statement_timeout (integer)

退出任何使用了超過此參數指定時間(毫秒)的語句。 零值(預設)關閉這個計時器。

16.4.8.2. 區域和格式化

DateStyle (string)

設置日期和時間值的顯示格式,以及有歧義的輸入值的解析規則。 由於歷史原因,這個變量包含兩個獨立的部分:輸出格式聲明(ISOPostgresSQL,或者 German)以及日誌字串順序聲明(DMYMDY,或者 YMD)。 這兩個可以獨立設置或者一起設置。關鍵字 EuroEuropeanDMY 的同義詞; 關鍵字 USNonEuro,和 NonEuropeanMDY 的同義詞。 參閱 Section 8.5 獲取更多訊息。預設是 ISO, US

timezone (string)

設置用於顯示和解析時間戳的時區。預設是 'unknown',意味著使用系統環境聲明的時區。 參閱 Section 8.5 獲取更多訊息。

australian_timezones (boolean)

如果設置為真,那麼ACSTCSTCSTEST,和 SAT 都解釋成澳大利亞時區,而不是南/北美時區和週六。 預設是假。

extra_float_digits (integer)

這個參數為浮點數值調整顯示的資料位數,浮點類型包括 float4float8,和幾何資料類型。 參數值加在標準的資料位數上(FLT_DIG 或者 DBL_DIG 中合適的)。 數值可以設置為最高 2,以包括部分關鍵的資料位;這個功能對轉儲那些需要精確恢復的浮點資料特別有用。 或者您也可以把它設置位負數以消除不需要的資料位。

client_encoding (string)

設置客戶端編碼(字元集)。預設使用資料庫編碼。

lc_messages (string)

設置訊息顯示的語言。可接受的值是系統相關的;參閱 Section 20.1 獲取更多訊息。 如果這個變量設置為空字串(預設值),那麼其值以一種系統相關的方式從伺服器的執行環境中繼承過來。

在一些系統上,這個區域範疇並不存在。設置這個變量仍然是允許的, 但是將不會有任何效果。同樣,也有可能是所期望的語言的翻譯訊息不存在。在這種情況下,您仍然能看到英文訊息。

lc_monetary (string)

為格式化金額數量設置區域。比如為 to_char 族函數設置。 可接受的值是系統相關的;參閱 Section 20.1 獲取更多訊息。 如果這個變量設置為空字串(預設值),那麼其值是以一種系統相關的方式從伺服器的執行環境中繼承過來的。

lc_numeric (string)

設置用於格式化數字的區域,比如那些用於 to_char 族函數的。可接受的值是系統相關的;參閱 Section 20.1 獲取更多訊息。如果這個變量設置為空字串(預設值),那麼其值以一種系統相關的方法從伺服器的執行環境中繼承過來。

lc_time (string)

設置用於格式化日期和時間值的區域。(目前,這個設置什麼事也沒幹,但將來可能會有用。) to_char 族函數的。 可接受的值是系統相關的;參閱 Section 20.1 獲取更多訊息。 如果這個變量設置為空字串(預設值),那麼其值是以一種系統相關的方式從伺服器的執行環境中繼承過來的。

16.4.8.3. 其它預設

explain_pretty_print (boolean)

決定 EXPLAIN VERBOSE 是使用縮進格式還是使用非縮進格式顯示詳細的查詢樹轉儲。 預設是打開。

dynamic_library_path (string)

如果需要打開一個可以動態裝載的模塊並且在 CREATE FUNCTION 或者 LOAD 命令裡面聲明的名字沒有目錄部分(也就是說名字裡不包含斜槓), 那麼系統將搜索這個目錄以查找聲明的文件。

用於 dynamic_library_path 的數值必須是一個冒號分隔(或者是在 Windows 上分號分隔)的絕對路徑名字列資料表。 如果一個路徑名字以特殊變量 $libdirPostgreSQL編譯好的庫目錄)開頭, 那麼就替換為PostgreSQL發佈提供的模塊安裝路徑。 這是標準 PostgreSQL 發佈提供的模塊安裝的目錄。 (使用 pg_config --pkglibdir 打印這個目錄的名字。) 比如:

dynamic_library_path = '/usr/local/lib/postgresql:/home/my_project/lib:$libdir'

或者是在 windows 環境裡:

dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir'

這個參數的預設值是 '$libdir'。 如果把這個值設置為一個空字串,則關閉自動路徑搜索。

這個參數可以在執行時由超級用戶修改,但是這麼修改的設置只能保持到這個客戶端連接的結束, 因此這個方法應該保留給開發用途使用。 我們建議的設置這個參數的方法是在 postgresql.conf 配置文件裡設置。

16.4.9. 鎖管理

deadlock_timeout (integer)

這個是以毫秒計的時間,用於設置在檢查是否存在死鎖條件之前的等待時間。 檢查是否存在死鎖條件是一個緩慢的過程,因此伺服器不會在每次等待鎖的時候都執行這個過程。 我們(樂觀地?)假設在生產應用中的死鎖是不常出現的, 因此我們在開始詢問是否可以解鎖之前只等待一個鎖相對短的一段時間。 增加這個值就減少了浪費在無用的死鎖檢查上的時間,但是減慢了報告真正死鎖錯誤的速度。 預設是 1000(也就是 1 秒),可能是您能夠耐心等待的最短時間。 在一個重載的伺服器上,您可能需要增大它。這個值的典型設置應該超過您的交易的時間, 這樣就可以減少在鎖釋放之前就開始死鎖檢查的問題。

max_locks_per_transaction (integer)

共享的鎖資料表的大小是以假設任意時刻最多只有 max_locks_per_transaction * max_connections 個獨立的對象需要被鎖住為基礎進行計算的。 (所以,這個參數的名字可能有些讓人糊塗:這不是單個交易可以使用的鎖數目的硬限制,而是一個平均值。) 預設值 64, 已經經歷史證明是足夠的了,不過如果您的客戶可能在一個交易裡面修改很多不同的資料表, 那麼您就可能需要提高這個數值。這個選項只能在伺服器啟動的時候設置。

16.4.10. 版本和平台相容性

16.4.10.1. 以前的 PostgreSQL 版本

add_missing_from (boolean)

如果為 true,查詢引用的資料表將自動增加到 FROM 裡 -如果還沒有出現這個子句的話。 預設是 true,為的是和以前的 PostgreSQL 版本兼容。 不過,這個行為不是 SQL 的標準,並且很多人不喜歡她,因為它會隱藏錯誤(比如該引用別名的時候引用了資料表名)。 設置為 false 則遵循 SQL 標準行為:拒絕引用不在 FROM 裡列出的資料表。

regex_flavor (string)

正則資料表達式"風味"可以設置為 advancedextended, 或者 basic。通常的預設是 advancedextended 設置對於和 7.4 以前的 PostgreSQL 精確的向下兼容很有用。 參閱 Section 9.7.3.1 獲取細節。

sql_inheritance (boolean)

這個選項控制繼承語義,尤其是在預設時是否在各種命令裡把子資料表包括進來。 版本 7.1 以前是不包括的。如果您需要老特性,您可以把這個變量設為假, 但是從長遠看來,我們建議您修改您的應用以使用 ONLY 關鍵字來排除子資料表。 參考 Section 5.5 獲取關於繼承的更多訊息。

default_with_oids (boolean)

如果既沒有聲明 WITH OIDS,又沒有聲明 WITHOUT OIDS, 那麼這個選項控制 CREATE TABLECREATE TABLE AS 是否在新建立的資料表中包含一個 OID 字串。它還決定 SELECT INTO 建立的資料表裡面是否包含 OID。 在 PostgreSQL 8.0.0 default_with_oids 預設為真。 這也是以前的版本的 PostgreSQL 的行為。 不過,我們不鼓勵假設資料表裡面預設會包含 OID。因此,在將來的版本的 PostgreSQL 裡, 這個選項預設會是假。

為了容易與那些使用了 OID 的應用兼容,這個選項應該是打開。 為了容易和將來版本的 PostgreSQL 兼容, 這個選項應該關閉,而要求某些資料表上有 OID 的應用在建立資料表的時候應該明確聲明 WITH OIDS

16.4.10.2. 平台和客戶端相容性

transform_null_equals (boolean)

如果打開它,那麼下面這樣的資料表達式 expr = NULL (或者 NULL = expr)被當做 expr IS NULL,處理,也就是說, 如果 expr 得出 NULL 值則返回真,否則返回假。 expr = NULL 正確的 SQL 標準兼容的行為總是返回 NULL(未知)。 因此這個選項預設時是關閉的。

不過,在Microsoft Access裡的過濾資料表單生成的查詢好像使用的是 expr = NULL 測試空值, 因此,如果您使用這個界面存取資料庫,您可能想把這個選項打開。 因為形如 expr = NULL 的資料表達式總是返回 NULL (使用正確的代換),因此它們並不常用, 而且在一般的應用中也不常見,因此這個選項實際上沒有什麼害處。 但是新用戶常常在涉及 NULL 的資料表達式語義上感到糊塗,因此預設時不打開這個選項。

請注意這個選項只影響 = NULL 形式, 不包括其它比較操作符或者其它與一些涉及等號操作符的資料表達式計算(比如 IN)。 因此,這個選項不是垃圾程序的狗皮膏藥。

請參考 Section 9.2 獲取相關訊息。

16.4.11. 預置的選項

下面的"參數"是只讀的,是在編譯或安裝 PostgreSQL 的時候決定的。 因此,他們被排除在了 postgresql.conf 文件之外。這些選項報告各種 PostgreSQL 某些應用可能感興趣的行為,特別是管理性的前端。

block_size (integer)

顯示磁盤塊的大小。它是由製作伺服器的時候 BLCKSZ 的值確定的。 預設值是 8192 字元。 有些配置變量的含義(比如 shared_buffers)會被block_size影響。 參閱 Section 16.4.3 獲取訊息。

integer_datetimes (boolean)

顯示 PostgreSQL 是否打開了 64 位整數日期和時間製作的。 這是製作 PostgreSQL 的時候由配置 --enable-integer-datetimes 設置的。 預設值是 off

lc_collate (string)

顯示文本資料排序使用的區域。參閱 Section 20.1 獲取更多訊息。 該值是在初始化資料庫集群的時候判斷的。

lc_ctype (string)

顯示決定字元分類的區域。參閱 Section 20.1 獲取更多訊息。 該值是在資料庫集群初始化的時候決定的。通常它和 lc_collate 一樣, 但是可以為特殊應用設置成不同的。

max_function_args (integer)

顯示函數參數的最大個數。它是由製作伺服器的時候的 FUNC_MAX_ARGS 值決定的。 預設是 32。

max_identifier_length (integer)

顯示最大標識符長度。它是由製作伺服器時的 NAMEDATALEN 減一決定的。 NAMEDATALEN 的預設值時 64;因此預設的 max_identifier_length 是 63。

max_index_keys (integer)

顯示最大索引鍵字的個數。它是由製作伺服器時的 INDEX_MAX_KEYS 值決定的。 預設值是 32。

server_encoding (string)

顯示資料庫編碼(字元集)。 這是在建立資料庫的時候決定的。通常,客戶端值需要關心 client_encoding 的值。

server_version (string)

顯示伺服器版本。它是在製作伺服器的時候由 PG_VERSION 決定的。

16.4.12. 客戶化的選項

這個特性是用來允許那些通常 PostgreSQL 不知道的選項可以被附加模塊添加(比如過程語言)。 這樣,就允許附加的模塊(比如觸發器和函數的語言映射)可以以一種一致的方式配置。

custom_variable_classes (string)

這個變量以逗號分隔的列資料表的形式聲明一個或者多個用於客戶變量的類。 一個客戶變量通常是一個 PostgreSQL 並不太知道的變量, 但是被一些附加的模塊使用。這樣的變量的名字必須由一個類別名,一個點,以及一個變量名組成。 custom_variable_classes 聲明在一次安裝裡的所有類別名。

這裡聲明的每一類都可以定義任意個變量。這些變量將被看作佔位符,知道定義他們的模塊裝載之前, 他們沒有意義。在裝載了某種類特定的模塊之後,它將為與之關聯的類增加合適的變量定義, 根據這些定義轉換任何的佔位符,並且為任何到該時刻還剩下的佔位符發出警告。 這個選項只能在伺服器啟動的時候或者在 postgresql.conf 配置文件裡設置。

postgresql.conf 裡設置客戶變量的困難在於這個文件必須在附加模塊裝載之前讀取, 因此客戶化變量通常會被認為是未知而拒絕。在設置了 custom_variable_classes 之後, 伺服器將接受每個聲明的類別裡的任意變量。這些變量將被當作佔位符,並且在定義它們的模塊裝載之前沒有任何用處。 在一個特定類別的模塊裝在後,它將為這個類別名增加合適的變量定義,根據它們的定義把那些佔位符數值進行轉換, 並且為該類別剩下的任何佔位符發出警告(這些很有可能是拼寫錯的配置變量)。

下面是一個在使用客戶化變量時,postgresql.conf 可能包含的東西的例子。

custom_variable_classes = 'plr,pljava'
plr.path = '/usr/lib/R'
pljava.foo = 1
plruby.bar = true        # 生成一個錯誤,未知的類別名

16.4.13. 開發人員選項

下面的選項目的是在 PostgreSQL 代碼上使用, 並且在某些情況下可以幫助恢復嚴重損壞了的資料庫。 在生產環境裡沒有使用這些設置的理由。 因此,我們把他們從樣例 postgresql.conf 文件中排除了出去。 請注意許多這些選項要求特殊的原始碼編譯標誌才能運轉。

debug_assertions (boolean)

打開各種斷言檢查。這是調試助手。如果您經歷了奇怪的問題或者崩潰, 那麼您可能會想把這個打開,因為它可能暴露編程的錯誤。 要使用這個選項,我們必須在製作 PostgreSQL 的時候定義宏 USE_ASSERT_CHECKING (透過 configure 選項 --enable-cassert 完成)。 請注意,如果帶著斷言打開的選項編譯 PostgreSQL, 那麼 debug_assertions 預設就是打開的。

debug_shared_buffers (integer)

ARC 報告之間的秒數。如果設置為大於零,每隔這麼多秒就向日誌中發出 ARC 統計。 零(預設)關閉報告。

pre_auth_delay (integer)

如果為非零,那麼在一個新的伺服器進程派生出來之後,就會延遲這麼多秒,然後才會繼續認證過程。 這樣就給我們一個機會用調試器附著在一個伺服器進程上跟蹤認證裡面的異常行為。

trace_notify (boolean)

LISTENNOTIFY 命令生長大量調試輸出。 client_min_messages 或者 log_min_messages 必須是 DEBUG1 或者更低才能把這些輸出分別發送到客戶端或者伺服器日誌。

trace_locks (boolean)
trace_lwlocks (boolean)
trace_userlocks (boolean)
trace_lock_oidmin (boolean)
trace_lock_table (boolean)
debug_deadlocks (boolean)
log_btree_build_stats (boolean)

各種其它的代碼跟蹤和調試選項。

wal_debug (boolean)

如果為真,打開 WAL 相關的調試輸出。 只有在編譯 PostgreSQL 的時候打開了 WAL_DEBUG 宏的情況下,這個選項才可用。

zero_damaged_pages (boolean)

如果偵測到一個損壞了的頁面頭通常會導致 PostgreSQL 報告一個錯誤,並且退出目前命令。把 zero_damaged_pages 設置為真則令系統報告一個警告,把損壞的頁面填充零,然後繼續處理。 這種行為會破壞資料,也就是所有在已經損壞頁面上的行。 但是它允許您繞開壞頁面然後從資料表中還有的未損壞的頁面上繼續檢索資料行。 因此它在因為硬件或者軟件錯誤導致的崩潰中進行恢復是很有用的。 通常您不應該把它設置為真,除非您已經徹底放棄從崩潰底頁面中恢復資料。預設的設置是關閉,並且只有超級用戶可以改變它。

16.4.14. 短選項

為了方便起見,這裡還為一些參數提供了好多單字母命令行選項開關。 它們在下Table 16-1裡描述。

Table 16-1. 短選項鍵字

短選項等效
-B xshared_buffers = x
-d xserver_min_messages = DEBUGx
-Ffsync = off
-h xlisten_addresses = x
-ilisten_addresses = '*'
-k xunix_socket_directory = x
-lssl = on
-N xmax_connections = x
-p xport = x
-fi, -fh, -fm, -fn, -fs, -ft[a] enable_indexscan = off, enable_hashjoin = off, enable_mergejoin = off, enable_nestloop = off, enable_seqscan = off, enable_tidscan = off
-s[a]log_statement_stats = on
-S x[a]work_mem = x
-tpa,-tpl,-te[a]log_parser_stats = on, log_planner_stats = on, log_executor_stats = on
Notes:
a. 因為歷史原因,這些選項透過-o postmaster選項傳遞給獨立得伺服器進程,比如,

$ postmaster -o '-S 1024 -s'

或者是透過客戶端的 PGOPTIONS, 像上面解釋地那樣。