16.4. 運行時配置

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

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

設置這些選項的一個方法是在數據目錄裡比如(在那裡安裝著一個缺省文件)創建一個文件 postgresql.conf 比如,下面是一個該文件的例子:

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

象你看到的那樣,選項是每條一行。選項名和值之間的等號是可選的。 空白和空行被忽略。井號(#)用做任何地方引入注釋。

每次postmaster收到SIGHUP(最簡單的發送方法就是使用 pg_ctl reload)。 信號後都會重新讀取這個配置文件。 postmaster同時也將這個信號廣播給所有正在運行的服務器進程,這樣現有會話也能得到新的缺省。 另外,你可以只向一個服務器進程直接發送信號。

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

postmaster -c log_connections=yes -c syslog=2

命令行選項覆蓋任何與 postgresql.conf 衝突的選項。

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

env PGOPTIONS='-c geqo=off' psql

(這個選項可以用于任何基于libpq的客戶端應用,不光是 psql。) 請注意,這個變量對那些需要在服務器啟動後固定的選項是無效的,比如端口號。

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

SET ENABLE_SEQSCAN TO OFF;

如果允許用 SET 設置,這種每數據庫的設置覆蓋任何來自 postmaster 命令行選項或者配置文件的設置。超級用戶允許比普通用戶 SET 更多的數值。

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

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

16.4.1. 連接和認證

16.4.1.1. 連接設置

tcpip_socket (boolean)

如果這個設置為真,那麼服務器激昂接受 TCP/IP 連接。 否則只接受本地的 Unix 域套接字。它缺省是關閉。這個選項只能在服務器啟動的時候設置。

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 的值。 這個參數只能在服務器啟動的時候設置。

port (integer)

服務器監聽的 TCP 端口;缺省是 5432。這個選項只能在服務器啟動的時候設置。

unix_socket_directory (string)

聲明服務器監聽客戶端應用連接來臨的 Unix 域套接字的目錄。 缺省通常是 /tmp,但是缺省值可以在制作的時候修改。

unix_socket_group (string)

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

unix_socket_permissions (integer)

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

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

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

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

virtual_host (string)

聲明服務器監聽到訪連接的服務器名字或者 IP 地址。 缺省是監聽所有已配置的地址(包括 localhost)。

rendezvous_name (string)

聲明 Rendezvous 廣播地址。缺省的時候,使用計算機名,聲明是 ''。

16.4.1.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.2. 資源消耗

16.4.2.1. 內存

shared_buffers (integer)

設置數據庫服務器將使用的共享內存緩衝區數量。缺省通常是 1000, 如果你的內核設置不支持這麼大,那麼可以少些(在 initdb 的時候決定)。 每個緩衝區大小的典型值是 8192 字節。這個數值必須大于 16, 並且至少是 MAX_CONNECTIONS 數值的兩倍;不過,這個數值大一些通常可以改進性能。 對于生產安裝,我們通常建議是幾千。 這個選項只能在服務器啟動的時候設置。

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

sort_mem (integer)

聲明內部排序操作和散列表在開始使用臨時磁盤文件之前使用的內存數目。 數值是以千字節為單位的,缺省是 1024 千字節(1 MB)。 請注意對于復雜的查詢,可能會同時運行好幾個排序或者散列操作; 每個都會被批準使用這個參數聲明的這麼多內存,然後才會開始求助于臨時文件。 同樣,好幾個正在運行的會話可能會同時進行排序操作。因此使用的總內存可能是 sort_mem 的好幾倍。 在 ORDER BY,融合連接,以及 CREATE INDEX 裡都要用到排序操作。 散列表在散列連接,散列為基礎的聚集,以及散列為基礎的 IN 子查詢處理中都要用到。 因為在恢復數據庫的時候用到 CREATE INDEX,所以在恢復一個大的數據庫的之前增大 sort_mem 可以改善性能。

vacuum_mem (integer)

聲明 VACUUM 用于跟蹤要被恢復使用的(舊)行的最大內存樹。 數值以千字節計,缺省是 8192 kB。增大這個值可以提高那些有大量被刪除行的大表的清理速度。

16.4.2.2. 自由空間映射

max_fsm_pages (integer)

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

max_fsm_relations (integer)

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

16.4.2.3. 內核資源使用

max_files_per_process (integer)

設置每個服務器進程允許同時打開的最大的文件數目。缺省是 1000。 實際使用的限制實際上是這個設置值和 sysconf(_SC_OPEN_MAX) 之間的最小值。 因此,在那些 sysconf 返回一個合理的限制的系統上, 你不用操心這個設置。但是在一些平台上(特別指出的是,大多數 BSD 系統), sysconf 返回一個系統真正可以支持的數目大的多的數值。 如果你發現有 "Too many open files" 這樣的失敗閒閒,那麼就嘗試縮小這個設置。 這個選項只能在服務器啟動或者在 postgresql.conf 配置文件裡設置; 如果修改了配置文件,那麼它只影響隨後啟動的服務器子進程。

preload_libraries (string)

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

如果沒有找到 mylib 或者 mylib_init,那麼服務器將啟動失敗。

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

通過預先裝載一個共享庫(以及在需要的時候初始化它), 我們就可以避免第一次使用這個庫的那些啟動時間。不過,啟動每個服務器進程的時間可能會增加, 即使進程從來沒有使用過這些庫也這樣。

16.4.3. 預寫式日志

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

16.4.3.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 文件)。 不是在所有系統上都能使用上面四種選項。這個選項只能在服務器啟動的時候和在postgresql.conf文件裡設置。

wal_buffers (integer)

放在共享內存裡用于 WAL 日志的磁盤頁面緩衝區的數目。這個選項只能在服務器啟動的時候設置。

16.4.3.2. 檢查點

checkpoint_segments (integer)

在自動的 WAL 檢查點之間的最大舉例,以日志文件段(每個段通常 16 兆打)計。 缺省是三。這個選項只能在服務器啟動或者在 postgresql.conf 文件裡設置。

checkpoint_timeout (integer)

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

checkpoint_warning (integer)

如果因為填充檢查點段文件發生的檢查點比這個數值表示的秒數更多, 那麼向服務器日志發送一個消息。缺省是 30 秒。零則關閉警告。

commit_delay (integer)

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

commit_siblings (integer)

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

16.4.4. 查詢規劃

16.4.4.1. 規劃器方法配置

注意: 這些配置參數提供了一個用于影響查詢優化器選擇的查詢規劃的原始的方法。 如果優化器為特定的查詢選擇的缺省規劃並不是最優,那麼我們就可以通過使用這些配置參數強制優化器選擇一個更好的規劃來臨時解決這個問題。 其它改善優化器選擇的規劃的方法包括配置 規劃器開銷常量, 更頻繁運行 ANALYZE,以及使用 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.4.2. 規劃器開銷常量

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

effective_cache_size (floating point)

設置規劃器對有效磁盤緩衝區大小的假定(也就是說,內核的磁盤緩衝將會用于 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.4.3. 基因查詢優化器

geqo (boolean)

允許或禁止基因查詢優化,這是一種試圖不通過窮舉搜索來實現查詢規劃的算法。缺省是允許。參閱各種其他geqo_設置。

geqo_threshold (integer)

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

geqo_effort (integer)
geqo_generations (integer)
geqo_pool_size (integer)
geqo_selection_bias (floating point)

各種各樣的調節基因查詢優化的參數: 緩衝池大小(geqo_pool_size)是一個全體中的個體的數量。 有效值介于 128 和 1024 之間。如果把它設置為 0(缺省),那麼就使用 2^(QS+1) 大小的緩衝池,這裡 QS 是查詢中FROM項的數量。 geqo_effort 的作用是為每一代計算一個缺省值。有效值是介于 1 和 80 之間的數字,40 是缺省值。 代(geqo_generations)聲明算法中的反復次數。此數字必須是正整數。 如果聲明了 0,那麼就使用 Effort * Log2(PoolSize)。 算法的運行時間大概是緩衝池大小(geqo_pool_size)和代(geqo_generations)之和的分數。 選擇偏移(geqo_selection_bias)是全體內部的選擇性壓力(selective pressure)。 其值可以介于 1.50 到 2.00 之間;後者是缺省。

16.4.4.4. 其它規劃器選項

default_statistics_target (integer)

為沒有用 ALTER TABLE SET STATISTICS 設置字段相關目標的表中其它字段設置缺省統計目標。 更大的數值增加了 ANALYZE 所需要的時間,但是可能會改善規劃器的估計質量。缺省值是 10。

from_collapse_limit (integer)

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

join_collapse_limit (integer)

如果得出的列表不超過這個數目的項,那麼規劃器將把明確的內層 JOIN 構造抹平到 FROM 列表項中。 通常它設置為和 from_collapse_limit 相同。把它設置為 1 則避免任何內層 JOIN 的融合,就可以使用明確的 JOIN 語法來控制連接順序。其它的中間值我們可以用來在規劃時間和規劃質量之間平衡。

16.4.5. 錯誤報告和日志

16.4.5.1. Syslog

syslog (integer)

PostgreSQL 允許把 syslog 作為日志系統。 如果這個選項設為 1,則信息同時往syslogstdout輸出。如果設為 2, 則只輸出到syslog。(有些信息還是會輸出到stdout/stderr。) 缺省是 0,意味著關閉向syslog的輸出。 這個選項只能在服務器啟動的時候設置。

syslog_facility (string)

這個選項在打開syslog後判斷要使用的 syslog "設施"。 你可以從 LOCAL0LOCAL1LOCAL2LOCAL3LOCAL4LOCAL5LOCAL6LOCAL7 中選擇;缺省是LOCAL0。 又見你的系統的 syslog 文檔。

syslog_ident (string)

如果打開了向syslog中記日志的功能, 這個選項決定用于在 syslog 日志信息中標識 PostgreSQL 的程序名。缺省是 postgres

16.4.5.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 選項效果一樣)。 除非打開了 syslog 日志,否則我們不建議使用這個選項,因為它讓我們很難看到錯誤信息。

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

DEBUG[1-5]

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

INFO

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

NOTICE

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

WARNING

這個提供給用戶的警告,比如在事務塊範圍之外的 COMMIT

ERROR

報告導致當前事務退出的錯誤。

LOG

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

FATAL

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

PANIC

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

16.4.5.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_duration (boolean)

導致每個完成的語句的持續時間都寫入日志。要使用這個選項, 打開 log_statementlog_pid, 這樣你就可以用進程 ID 把語句和持續時間連接起來。 缺省是關閉。如果管理員打開過它,那麼只有超級用戶可以把這個選項關閉。

log_pid (boolean)

在服務器日志文件裡的每條服務器信息前面加上服務器進程的進程號前綴。 這對理出某條信息屬于那個連接很有幫助。缺省時是關閉的。 這個參數並不影響通過 syslog 記錄日志的消息,它總包含進程 ID。

log_statement (boolean)

導致每個 SQL 語句都被記錄日志。缺省是關閉的。 如果這個選項曾被管理員打開,那麼只有超級用戶可以關閉這個選項。

log_timestamp (boolean)

在每條服務器信息前面加上時間戳前綴。 缺省時是關閉的。

log_hostname (boolean)

缺省時,聯接日志只記錄所聯接主機的 IP 地址。如果你想顯示主機名, 你可以打開這個選項,不過,這樣有可能帶來一些不可忽略的性能損失, --取決于你的名字解析的設置。 這個選項只能在服務器啟動的時候設置。

log_source_port (boolean)

在聯接日志信息裡面顯示正在連接的主機的端口號。 你可以回朔此端口號並找出是哪個用戶初始化的聯接。 除了上面這個功能之外,它基本沒用,所以缺省是關閉。 這個選項只能在服務器啟動的時候設置。

16.4.6. 運行時統計

16.4.6.1. 統計監控

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

對每條查詢,向服務器日志裡輸出相應模塊的性能統計。 這是原始的剖析工具。缺省時所有這些選項都是關閉的。 如果管理員曾經打開它們中的任意幾個,那麼只有超級用戶才能關閉它。

16.4.6.2. 查詢和索引統計收集器

stats_start_collector (boolean)

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

stats_command_string (boolean)

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

stats_block_level (boolean)
stats_row_level (boolean)

這兩個選項分別打開數據庫活躍性的塊級別和行級別的統計。 選項缺省是關閉的。這些數據可以通過 pg_statpg_statio 族系統視圖來訪問。 請參考 Chapter 23 獲取更多信息。

stats_reset_on_server_start (boolean)

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

16.4.7. 客戶端連接缺省

16.4.7.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

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.7.2. 區域和格式化

datestyle (string)

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

timezone (string)

設置用于顯示和解析時間戳的時區。缺省是使用系統環境聲明的時區。 參閱 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.7.3. 其它缺省

explain_pretty_print (boolean)

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

dynamic_library_path (string)

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

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

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

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

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

max_expr_depth (integer)

設置分析器接受的最大表達式嵌套深度。 缺省值對任何常見查詢來說都夠高了,但是如果你需要的話你可以提高這個數值。 (不過如果你把它升得太高,你就得冒因為棧溢出導致的服務器崩潰的風險。)

16.4.8. 鎖管理

deadlock_timeout (integer)

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

max_locks_per_transaction (integer)

共享的鎖表的大小是以假設任意時刻最多只有 max_locks_per_transaction * max_connections 個獨立的對象需要被鎖住為基礎進行計算的。缺省值 64,已經經歷史證明是足夠的了,不過如果你的客戶可能在一個事務裡面修改很多不同的表, 那麼你就可能需要提高這個數值。這個選項只能在服務器啟動的時候設置。

16.4.9. 版本和平台兼容性

16.4.9.1. 以前的 PostgreSQL 版本

add_missing_from (boolean)

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

regex_flavor (string)

正則表達式"風味"可以設置為 advancedextended, 或者 basic。通常的缺省是 advancedextended 設置對于和 7.4 以前的 PostgreSQL 精確的向下兼容很有用。

sql_inheritance (boolean)

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

16.4.9.2. 平台和客戶端兼容性

transform_null_equals (boolean)

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

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

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

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

16.4.10. 開發人員選項

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

debug_assertions (boolean)

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

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 (integer)

如果為非零,打開 WAL 相關的調試輸出。

zero_damaged_pages (boolean)

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

16.4.11. 短選項

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

Table 16-1. 短選項鍵字

短選項等效
-B xshared_buffers = x
-d xserver_min_messages = DEBUGx
-Ffsync = off
-h xvirtual_host = x
-itcpip_socket = on
-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]show_statement_stats = on
-S x[a]sort_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, 像上面解釋地那樣。