PostgresSQL數據庫配置參數中文說明

PostgresSQL提供了許多數據庫配置參數,本章將介紹每個參數的作用和如何配置每一個參數。

10.1 如何設置數據庫參數
所有的參數的名稱都是不區分大小寫的。每個參數的取值是布爾型、整型、浮點型和字符串型這四種類型中的一個,分別用boolean

、integer、 floating point和string表示。布爾型的值可以寫成ON、OFF、 TRUE、 FALSE、 YES、 NO、 1和 0,而且不區分大小

寫。

有些參數用來配置內存大小和時間值。內存大小的單位可以是KB、MB和GB。時間的單位可以是毫秒、秒、分鐘、小時和天。用ms表示

毫秒,用s表示秒,用 min表示分鐘,用h表示小時,用d表示天。表示內存大小和時間值的參數參數都有一個默認的單位,如果用戶

在設置參數的值時沒有指定單位,則以參數默認的 單位爲準。例如,參數shared_buffers表示數據緩衝區的大小,它的默認單位是

數據塊的個數,如果把它的值設成8,因爲每個數據塊的大小是  8KB,則數據緩衝區的大小是8*8=64KB,如果將它的值設成128MB,

則數據緩衝區的大小是128MB。參數vacuum_cost_delay 的默認單位是毫秒,如果把它的值設成10,則它的值是10毫秒,如果把它的

值設成100s,則它的值是100秒。

所有的參數都放在文件 postgresql.conf中,下面是一個文件實例:

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

每一行只能指定一個參數,空格和空白行都會被忽略。“ #”表示註釋,註釋信息不用單獨佔一行,可以出現在配置文件的任何地方

。如果參數的值不是簡單的標識符和數字,應該用單引號引起來。如果參數的值中有單引號,應該寫兩個單引號,或者在單引號前面

加一個反斜槓。
一個配置文件也可以包含其它配置文件,使用include指令能夠達到這個目的,例如,假設postgresql.conf文件中有下面一行:

include ‘my.confg’
文件my.config中的配置信息也會被數據庫讀入。include指令指定的配置文件也可以用include指令再包含其它配置文件。如果

include指令中指定的文件名不是絕對路徑,數據庫會在postgresql.conf文件所在的目錄下查找這個文件。

用戶也可以在數據庫啓動以後修改postgresql.conf配置文件,使用命令pg_ctl reload來通知數據庫重新讀取配置文件。注意,有些

參數在數據庫啓動以後,不能被修改,只有重新啓動數據庫以後,新的參數值才能生效。另外一些參數可 以在數據庫運行過程中被

修改而且新的值可以立即生效。所以數據庫在運行過程中重新讀取參數配置文件以後,不是所有的參數都會被賦給新的值。

用戶可以在自己建立的會話中執行命令SET修改某些配置參數的值(注意不是全部參數),例如:
SET ENABLE_SEQSCAN TO OFF;
另外,有些參數只有數據庫超級用戶才能使用SET命令修改它們。用戶可以在psql中執行命令show來查看所有的數據庫參數的當前值

。例如:
(1)show all;          --查看所有數據庫參數的值

(2)show search_path;  --查看參數search_path的值

10.2 連接與認證
10.2.1 連接設置
listen_addresses (string)

這個參數只有在啓動數據庫時,才能被設置。它指定數據庫用來監聽客戶端連接的TCP/IP地址。默認是值是* ,表示數據庫在啓動以

後將在運行數據的機器上的所有的IP地址上監聽用戶請求(如果機器只有一個網卡,只有一個IP地址,有多個網卡的機器有多個 IP

地址)。可以寫成機器的名字,也可以寫成IP地址,不同的值用逗號分開,例如,’server01’, ’140.87.171.49, 140.87.171.21

’。如果被設成localhost,表示數據庫只能接受本地的客戶端連接請求,不能接受遠程的客戶端連接請求。
port (integer)

這個參數只有在啓動數據庫時,才能被設置。它指定數據庫監聽戶端連接的TCP端口。默認值是5432。

max_connections (integer)

這個參數只有在啓動數據庫時,才能被設置。它決定數據庫可以同時建立的最大的客戶端連接的數目。默認值是100。

superuser_reserved_connections (integer)

這個參數只有在啓動數據庫時,才能被設置。它表示預留給超級用戶的數據庫連接數目。它的值必須小於max_connections。 普通用

戶可以在數據庫中建立的最大的併發連接的數目是max_connections- superuser_reserved_connections, 默認值是3。

unix_socket_group (string)
這個參數只有在啓動數據庫時,才能被設置。設置Unix-domain socket所在的操作系統用戶組。默認值是空串,用啓動數據庫的操作

系統用戶所在的組作爲Unix-domain socket的用戶組。

unix_socket_permissions (integer)
這個參數只有在啓動數據庫時,才能被設置。它設置Unix-domain socket的訪問權限,格式與操作系統的文件訪問權限是一樣的。默

認值是0770,表示任何操作系統用戶都能訪問Unix-domain socket。可以設爲0770(所有Unix-domain socket文件的所有者所在的組

包含的用戶都能訪問)和0700(只有Unix-domain socket文件的所有者才能訪問)。對於Unix-domain socket,只有寫權限纔有意義,

讀和執行權限是沒有意義的。

tcp_keepalives_idle (integer)
這個參數可以在任何時候被設置。默認值是0,意思是使用操作系統的默認值。它設置TCP套接字的TCP_KEEPIDLE屬性。這個參數對於

通過Unix-domain socket建立的數據庫連接沒有任何影響。

tcp_keepalives_interval (integer)
這個參數可以在任何時候被設置。默認值是0,意思是使用操作系統的默認值。它設置TCP套接字的TCP_KEEPINTVL屬性。這個參數對

於通過Unix-domain socket建立的數據庫連接沒有任何影響。

tcp_keepalives_count (integer)
這個參數可以在任何時候被設置。默認值是0,意思是使用操作系統的默認值。它設置TCP套接字的TCP_KEEPCNT屬性。這個參數對於

通過Unix-domain socket建立的數據庫連接沒有任何影響。

10.2.2. 安全與認證
authentication_timeout (integer)
這個參數只能在postgresql.conf文件中被設置,它指定一個時間長度,在這個時間長度內,必須完成客戶端認證操作,否則客戶端

連接請求將被拒絕。它可以阻止某些客戶端進行認證時長時間佔用數據庫連接。單位是秒,默認值是60。

ssl (boolean)
這個參數只有在啓動數據庫時,才能被設置。決定數據庫是否接受SSL連接。默認值是off。

ssl_ciphers (string)
指定可以使用的SSL加密算法。查看操作系統關於openssl的用戶手冊可以得到完整的加密算法列表(執行命令openssl ciphers –v

也可以得到)。

10.3 資源消耗
10.3.1 內存
shared_buffers (integer)
這個參數只有在啓動數據庫時,才能被設置。它表示數據緩衝區中的數據塊的個數,每個數據塊的大小是8KB。數據緩衝區位於數據

庫的共享內存中,它越大越好,不能小於128KB。默認值是1024。

temp_buffers (integer)
這個參數可以在任何時候被設置。默認值是8MB。它決定存放臨時表的數據緩衝區中的數據塊的個數,每個數據塊的大小是8KB。臨時

表緩衝區存放在每個數據庫進程的私有內存中,而不是存放在數據庫的共享內存中。默認值是1024。

max_prepared_transactions (integer)
這個參數只有在啓動數據庫時,才能被設置。它決定能夠同時處於prepared狀態的事務的最大數目(參考PREPARE TRANSACTION命令

)。如果它的值被設爲0。則將數據庫將關閉prepared事務的特性。它的值通常應該和max_connections的值 一樣大。默認值是5。

work_mem (integer)
這個參數可以在任何時候被設置。它決定數據庫的排序操作和哈希表使用的內存緩衝區的大小。如何work_mem指定的內存被耗盡,數

據庫將使用磁盤文件進 行完成操作,速度會慢很多。ORDER BY、DISTINCT和merge連接會使用排序操作。哈希表在Hash連接、hash聚

集函數和用哈希表來處理IN謂詞中的子查詢中被使用。單位是 KB,默認值是1024。

maintenance_work_mem (integer)
這個參數可以在任何時候被設置。它決定數據庫的維護操作使用的內存空間的大小。數據庫的維護操作包括VACUUM、CREATE INDEX和

ALTER TABLE ADD FOREIGN KEY等操作。 maintenance_work_mem的值如果比較大,通常可以縮短VACUUM數據庫和從dump文件中恢復數

據庫需要的時間。 maintenance_work_mem存放在每個數據庫進程的私有內存中,而不是存放在數據庫的共享內存中。單位是KB,默

認值是16384。

max_stack_depth (integer) 
這個參數可以在任何時候被設置,但只有數據庫超級用戶才能修改它。它決定一個數據庫進程在運行時的STACK所佔的空間的最大值

。數據庫進程在運行時,會 自動檢查自己的STACK大小是否超過max_stack_depth,如果超過,會自動終止當前事務。這個值應該比

操作系統設置的進程STACK的大小 的上限小1MB。使用操作系統命令“ulimit –s“可以得到操作系統設置的進程STACK的最大值。單

位是KB,默認值是100。

10.3.2 Free Space Map
數據庫的所有可用空間信息都存放在一個叫free space map (FSM)的結構中,它記載數據文件中每個數據塊的可用空間的大小。FSM

中沒有記錄的數據塊,即使有可用空間,也不會系統使用。系統如果需要新的物理存 儲空間,會首先在FSM中查找,如果FSM中沒有

一個數據頁有足夠的可用空間,系統就會自動擴展數據文件。所以,FSM如果太小,會導致系統頻繁地擴展數 據文件,浪費物理存儲

空間。命令VACUUM VERBOSE在執行結束以後,會提示當前的FSM設置是否滿足需要,如果FSM的參數值太小,它會提示增大參數。

FSM存放在數據庫的共享內存中,由於物理內存的限制,FSM不可能跟蹤數據庫的所有的數據文件的所有數據塊的可用空間信息,只能

跟蹤一部分數據塊的可用空間信息。

max_fsm_relations (integer)
這個參數只有在啓動數據庫時,才能被設置。默認值是1000。它決定FSM跟蹤的表和索引的個數的上限。每個表和索引在FSM中佔7個

字節的存儲空間。

max_fsm_pages (integer)
這個參數只有在啓動數據庫時,才能被設置。它決定FSM中跟蹤的數據塊的個數的上限。initdb在創建數據庫集羣時會根據物理內存

的大小決定它的值。每 個數據塊在fsm中佔6個字節的存儲空間。它的大小不能小於16 * max_fsm_relations。默認值是20000。

10.3.3 內核資源
max_files_per_process (integer)
這個參數只有在啓動數據庫時,才能被設置。他設定每個數據庫進程能夠打開的文件的數目。默認值是1000。

shared_preload_libraries (string)
這個參數只有在啓動數據庫時,才能被設置。它設置數據庫在啓動時要加載的操作系統共享庫文件。如果有多個庫文件,名字用逗號

分開。如果數據庫在啓動時未找到shared_preload_libraries指定的某個庫文件,數據庫將無法啓動。默認值爲空串。

10.3.4 垃圾收集
執行VACUUM 和ANALYZE命令時,因爲它們會消耗大量的CPU與IO資源,而且執行一次要花很長時間,這樣會干擾系統執行應用程序發

出的SQL命令。爲了解決這個 問題,VACUUM 和ANALYZE命令執行一段時間後,系統會暫時終止它們的運行,過一段時間後再繼續執行

這兩個命令。這個特性在默認的情況下是關閉的。將參數 vacuum_cost_delay設爲一個非零的正整數就可以打開這個特性。

用戶通常只需要設置參數vacuum_cost_delay和vacuum_cost_limit,其它的參數使用默認值即可。VACUUM 和ANALYZE命令在執行過程

中,系統會計算它們執行消耗的資源,資源的數量用一個正整數表示,如果資源的數量超過 vacuum_cost_limit,則執行命令的進程

會進入睡眠狀態,睡眠的時間長度是是vacuum_cost_delay。 vacuum_cost_limit的值越大,VACUUM 和ANALYZE命令在執行的過程中

,睡眠的次數就越少,反之,vacuum_cost_limit的值越小,VACUUM 和ANALYZE命令在執行的過程中,睡眠的次數就越多。

vacuum_cost_delay (integer)
這個參數可以在任何時候被設置。默認值是0。它決定執行VACUUM 和ANALYZE命令的進程的睡眠時間。單位是微秒。它的值最好是10

的整數,如果不是10的整數,系統會自動將它設爲比該值大的並且最接近該值的是10 的倍數的整數。如果值是0,VACUUM 和ANALYZE

命令在執行過程中不會主動進入睡眠狀態,會一直執行下去直到結束。

vacuum_cost_page_hit (integer)
這個參數可以在任何時候被設置。默認值是1。

vacuum_cost_page_miss (integer)
這個參數可以在任何時候被設置。默認值是10。

vacuum_cost_page_dirty (integer)
這個參數可以在任何時候被設置。默認值是20。

vacuum_cost_limit (integer)
這個參數可以在任何時候被設置。默認值是200。

10.3.5 後臺寫數據庫進程
後臺寫數據庫進程負責將數據緩衝區中的被修改的數據塊(又叫髒數據塊)寫回到數據庫物理文件中。

bgwriter_delay (integer)
這個參數只能在文件postgresql.conf中設置。它決定後臺寫數據庫進程的睡眠時間。後臺寫數據庫進程每次完成寫數據到物理文件

中的任務以後, 就會睡眠bgwriter_delay指定的時間。 bgwriter_delay的值應該是10的倍數,如果用戶設定的值不是10的倍數,數

據庫會自動將參數的值設爲比用戶指定的值大的最接近用戶指定的值 的同時是10的倍數的值。單位是毫秒,默認值是200。

bgwriter_lru_maxpages (integer)
這個參數只能在文件postgresql.conf中設置。默認值是100。後臺寫數據庫進程每次寫髒數據塊時,寫到外部文件中的髒數據塊的個

數不能超過 bgwriter_lru_maxpages指定的值。例如,如果它的值是500,則後臺寫數據庫進程每次寫到物理文件的數據頁的個數不

能超過500,若 超過,進程將進入睡眠狀態,等下次醒來再執行寫物理文件的任務。如果它的值被設爲0, 後臺寫數據庫進程將不會

寫任何物理文件(但還會執行檢查點操作)。

bgwriter_lru_multiplier (floating point)
這個參數只能在文件postgresql.conf中設置。默認值是2.0。它決定後臺寫數據庫進程每次寫物理文件時,寫到外部文件中的髒數據

塊的個數 (不能超過bgwriter_lru_maxpages指定的值)。一般使用默認值即可,不需要修改這個參數。這個參數的值越大,後臺寫

數據庫進程每次寫 的髒數據塊的個數就越多。

10.4 事務日誌
full_page_writes (boolean)
這個參數只能在postgresql.conf文件中被設置。默認值是on。打開這個參數,可以提高數據庫的可靠性,減少數據丟失的概率,但

是會產生過多的事務日誌,降低數據庫的性能。

wal_buffers (integer)
這個參數只有在啓動數據庫時,才能被設置。默認值是8。它指定事務日誌緩衝區中包含的數據塊的個數,每個數據塊的大小是8KB,

所以默認的事務日誌緩衝區的大小是8*8=64KB。事務日誌緩衝區位於數據庫的共享內存中。

wal_writer_delay (integer)
這個參數只能在postgresql.conf文件中被設置。它決定寫事務日誌進程的睡眠時間。WAL進程每次在完成寫事務日誌的任務後,就會

睡眠 wal_writer_delay指定的時間,然後醒來,繼續將新產生的事務日誌從緩衝區寫到WAL文件中。單位是毫秒(millisecond),

默認 值是200。

commit_delay (integer)
這個參數可以在任何時候被設置。它設定事務在發出提交命令以後的睡眠時間,只有在睡眠了commit_delay指定的時間以後,事務產

生的事務日誌纔會 被寫到事務日誌文件中,事務才能真正地提交。增大這個參數會增加用戶的等待時間,但是可以讓多個事務被同

時提交,提高系統的性能。如果數據庫中的負載比較 高,而且大部分事務都是更新類型的事務,可以考慮增大這個參數的值。下面

的參數commit_siblings會影響commit_delay是否生效。 默認值是0,單位是微秒(microsecond)。

commit_siblings (integer)
這個參數可以在任何時候被設置。這個參數的值決定參數commit_delay是否生效。假設commit_siblings的值是5,如果一個事務發出

一個提交請求,此時,如果數據庫中正在執行的事務的個數大於或等於5,那麼該事務將睡眠commit_delay指定的時間。如果數據庫

中正在執行的事務 的個數小於5,這個事務將直接提交。默認值是5。

10.5 檢查點
checkpoint_segments (integer)
這個參數只能在postgresql.conf文件中被設置。默認值是3。它影響系統何時啓動一個檢查點操作。如果上次檢查點操作結束以後,

系統產生的事 務日誌文件的個數超過checkpoint_segments的值,系統就會自動啓動一個檢查點操作。增大這個參數會增加數據庫崩

潰以後恢復操作需要的時 間。

checkpoint_timeout (integer)
這個參數只能在postgresql.conf文件中被設置。單位是秒,默認值是300。它影響系統何時啓動一個檢查點操作。如果現在的時間減

去上次檢查 點操作結束的時間超過了checkpoint_timeout的值,系統就會自動啓動一個檢查點操作。增大這個參數會增加數據庫崩

潰以後恢復操作需要的時 間。

checkpoint_completion_target (floating point)
這個參數控制檢查點操作的執行時間。合法的取值在0到1之間,默認值是0.5。不要輕易地改變這個參數的值,使用默認值即可。 這

個參數只能在postgresql.conf文件中被設置。

10.6 歸檔模式
archive_mode (boolean)
這個參數只有在啓動數據庫時,才能被設置。默認值是off。它決定數據庫是否打開歸檔模式。

archive_dir (string)
這個參數只有在啓動數據庫時,才能被設置。默認值是空串。它設定存放歸檔事務日誌文件的目錄。

archive_timeout (integer)
這個參數只能在postgresql.conf文件中被設置。默認值是0。單位是秒。如果archive_timeout的值不是0,而且當前時間減去數 據

庫上次進行事務日誌文件切換的時間大於archive_timeout的值,數據庫將進行一次事務日誌文件切換。一般情況下,數據庫只有在

一個事務日誌 文件寫滿以後,纔會切換到下一個事務日誌文件,設定這個參數可以讓數據庫在一個事務日誌文件尚未寫滿的情況下

切換到下一個事務日誌文件。

10.7 優化器參數
10.7.1 存取方法參數
下列參數控制查詢優化器是否使用特定的存取方法。除非對優化器特別瞭解,一般情況下,使用它們默認值即可。

enable_bitmapscan (boolean)
打開或者關閉bitmap-scan 。默認值是 on。

enable_hashagg (boolean)
打開或者關閉hashed aggregation。默認值是 on。

enable_hashjoin (boolean)
打開或者關閉hash-join。默認值是 on。

enable_indexscan (boolean)
打開或者關閉index-scan。默認值是 on。

enable_mergejoin (boolean)
打開或者關閉merge-join。默認值是 on。

enable_nestloop (boolean)
打開或者關閉nested-loop join。默認值是 on。不可能完全不使用nested-loop join,關閉這個參數會讓系統在有其它存取方法可

用的情況下,不使用nested-loop join。

enable_seqscan (boolean)
打開或者關閉sequential scan。默認值是 on。不可能完全不使用sequential scan,關閉這個參數會讓系統在有其它存取方法可用

的情況下,不使用sequential scan。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章