PostgreSQL裡面有個system catalog叫做pg_settings,可以透過查詢他來看到當前連線的PostgreSQL之各樣設定值。pg_settings裡面可以查看到每個設定值的名稱(對應name欄位)、設定值(對應setting欄位),簡短解釋(對應到short_desc)、所容許的最大值與最小值(max_val與min_val欄位)等等。也可以透過sourcefile跟sourceline欄位來查看這個設定是從哪個設定黨的哪個位置被載入的,以及pending_restart欄位來查看設定是否要等到下次重新啟動資料庫才會生效。
pg_settings的context欄位代表該設定可以被套用的時機,有以下幾種:
1.internal:在Postgres編譯時寫死的設定,無法在安裝之後修改
2.postmaster:在整個database cluster重啟之後可以套用
3.sighup:向postmaster主程序傳送SIGHUP signal即可重新讀取設定檔,讓設定生效
4.user_backend/superuser_backend:可以透過修改postgresql.conf然後發送SIGHUP的方式,在下一個新建立連線的session開始套用
5.user/superuser:在當下調整之後可以馬上套用,superuser和user的差異是superuser設定只有超級使用者才能使用SET指令修改
另外查詢pg_file_settings可以看到所有透過設定檔來引入的設定,他們所在的檔案(sourcefile欄位)以及每一樣設定值是否存在錯誤(error欄位)。
在postgresql.conf裡面可以指定include_file來將其他的設定檔合併到當前設定中,指定include_dir將特定目錄之下的設定檔合併到當前設定中,或者include_if_exists在檔案存在的時候將其合併到設定中(include_file指定的檔案不存在會出現錯誤)。如果相同的設定在多個地方被指定,則後來include的內容會覆蓋掉原先的。
fsync可以指定Postgres是否在每次transaciton COMMIT過後做fsync的系統呼叫,讓作業系統把記憶體的內容寫入硬碟。wal_sync_method可以指定Postgres在做fsync時要求的系統呼叫。synchronous_commit可以切換Postgres使用同步(在COMMIT結束過後立即做)或非同步(稍晚使用wal writer process)的方式來做fsync。
shared_buffers指定Postgres在每個backend process之間共用,拿來快取資料庫內容的緩衝區大小。
work_mem設定每個process最多可以拿多少的記憶體來進行像是hash或是排序等工作,這個參數和記憶體的用量有關,數值調得越大,就越有機會完全在記憶體裡面進行操作而不需要向硬碟寫入暫存檔案,但是佔用太多可能會造成系統記憶體不夠用而崩潰的情形。
maintanance_work_mem指定在VACUMM或是CREATE INDEX的時候可以使用多少的記憶體。
wal_buffers設定WAL在被寫入硬碟之前有多少的量可以緩存在記憶體裡面。
update_process_title可以在Linux的程序管理工具(例如ps)中顯示額外的資訊,可以更容易看出每個process在Postgres中的用途。
cluster_name指定在process上面顯示的cluster名稱,用來辨識Postgres的程序是來自哪個cluster。
listen_address指定Postgres應該監聽來自哪些IP位址的連線請求,port指定Postgres建立連線所使用的連接埠號碼。max_connections 和 superuser_reserved_connections指定資料庫同時允許的連線數量/超級使用者連線數量。authentication_timeout可以指定client在建立連線之前必須完成認證的時間,一旦超過時間連線就會被切斷。
其他還有一些像是VACUUM/查詢優化/統計數據選項之類的設定,這裡就不多做說明。
PostgreSQL也有提供另一種修改設定的方式,讓使用者在不需要(或是沒有辦法)更改設定檔案的情況下調整Postgres的設定,用法為ALTER SYSTEM SET ${設定參數} to '${數值}';
其變更會被寫入到postgresql.auto.conf檔案裡,覆寫掉系統當前的設定值。如果要撤銷變更,對於單個設定可以打ALTER SYSTEM RESET ${設定參數},撤銷全部設定可以打ALTER SYSTEM RESET ALL。