pg_settings引數詳解

日积月累者發表於2024-11-23

引言

在管理和配置PostgreSQL資料庫時,瞭解引數的分類和了解如何檢視和更改這些引數是至關重要的。引數的分類涉及到不同的生效方式,如內部引數、需要重啟生效的引數、不需要重啟而可以重新載入配置檔案生效的引數等。本文將介紹各類引數的分類及其在PostgreSQL中的作用。

一、引數的分類

引數的型別名稱說明
internal內部引數,只讀無法修改。postgres程式寫死或者是在初始化指定後無法修改的引數
postmaster更改該類引數,需重啟生效
sighup不需重啟,重新載入配置檔案即可生效,且會對當前所有程序生效
backend不需重啟,重新載入配置檔案即可生效,但只對新連線生效
superuser該類引數可由超級使用者使用set命令來改變,隻影響自身session配置,不影響其它會話;重新載入配置檔案後只對新連線生效
user該類引數可由普通使用者可以使用set命令來改變,隻影響自身session配置,不影響其它會話;重新載入配置檔案後只對新連線生效

二、檢視與更改引數的方式

1、pg_settings檢視

所有的配置引數都在系統檢視pg_settings中,該檢視各欄位含義如下,其中context欄位用於記錄引數的型別:

name:執行時配置引數名
setting:引數的當前值
unit:儲存引數的單位,如ms
category:引數的邏輯組
short_desc:引數的簡短描述
extra_desc:附加的引數的詳細描述
context:用於記錄引數的型別,可根據該值判斷引數修改是否需重啟生效
vartype:引數型別 (bool, enum, integer, real, or string)
source:當前引數值的來源
min_val:引數的最小允許值(對非數字值為空)
max_val:引數的最大允許值(對非數字值為空)
enumvals:用於儲存引數的可取值(對非數字值為空)
boot_val:如果引數沒有被別的其他設定,此列為在伺服器啟動時設定的引數值
reset_val:在當前會話中,RESET將會設定的引數值
sourcefile:當前值被設定的配置檔案(空值表示從非配置檔案的其他來源設定,由不是超級使用者也不是pg_read_all_settings成員的使用者檢查時也為空值),在配置檔案中使用include指令時有用
sourceline:當前值被設定的配置檔案中的行號(空值表示從非配置檔案的其他來源設定,由不是超級使用者也不是pg_read_all_settings成員的使用者檢查時也為空值)。
pending_restart:如果配置檔案中修改了該值但需要重啟,則為true,否則為false

2、檢視引數

show xxx;或select current_setting('xxx');

3、修改引數

修改當前session的引數配置:
set maintenance_work_mem to '128M';或select set_config('maintenance_work_mem','128M',false);

ALTER SYSTEM動態修改全域性引數:
ALTER SYSTEM SET configuration_parameter { TO | = } { value | 'value' | DEFAULT }
將引數從postgresql.auto.conf檔案中移除
ALTER SYSTEM RESET configuration_parameter
將所有引數從postgresql.auto.conf檔案中移除
ALTER SYSTEM RESET ALL
說明:
ALTER SYSTEM會把給出的引數 設定寫入到postgresql.auto.conf檔案中,該檔案會隨著 postgresql.conf一起被讀入。
ALTER SYSTEM RESET可以把引數從postgresql.auto.conf檔案中移除。使用 RESET ALL可以移除所有這類配置項。
用ALTER SYSTEM設定的值將在重新載入配置檔案後生效(用pg_ctl reload或select pg_reload_conf()😉,那些只能在伺服器啟動時更改的引數則會在下一次伺服器重啟後生效。

4、令修改後的引數生效

1)重新載入配置檔案
對於不需重啟生效的引數,可在作業系統層執行pg_ctl reload或psql中執行select pg_reload_conf();重新載入配置檔案令引數的修改生效。

2)重啟生效
部分引數需重啟生效,可檢視pg_settings檢視的pending_restart欄位,如果為true表示需重啟生效。

三、常見的各類引數

1、監聽連線相關

引數含義
listen_addressesserver端對客戶端的Tcp/ip監聽地址,預設為"localhost"表示僅允許本地透過巢狀字連線,"*"表示監聽所有IP,即允許所有IP訪問
port伺服器監聽TCP埠,預設5432
max_connectionsserver端允許最大連線數,預設100
superuser_reserved_connectionsServer端為超級賬號保留的連線數,預設3
unix_socket_directoryServer監聽客戶端Unix巢狀字目錄,預設/tmp

2、記憶體相關

引數含義
shared_buffer共享記憶體快取區大小,預設128MB
temp_buffers每個會話使用的臨時快取區大小,預設8MB
work_mem記憶體臨時表排序操作或者hash需要使用到的記憶體快取大小,預設4MB
maintenance_work_mem對於維護性操作(vacuum、create index)最大使用記憶體,預設64M,最小1M。
max_stack_depthServer端執行堆疊最大安全深度,預設2M,若發現無法執行複雜函式時可適當調整該引數

3、錯誤日誌相關

引數含義
logging_collector是否開啟日誌
log_rotation_age超過多少天生產一個新的日誌檔案
log_rotation_size超過多少大小生成一個新的日誌檔案
log_directory日誌目錄,可以是絕對路徑或相對PGDA他的相對路徑
log_destination日誌記錄型別,預設是stderr,只記錄錯誤輸出
log_filename日誌檔名,預設是postgresql-%Y-%m-%d_%H%M%S.log
log_truncate_on_rotation當日志名已存在時,是否覆蓋原檔案

4、慢SQL相關

引數含義
log_statement記錄語句型別,none表示不開啟,ddl標誌僅僅記錄DDL語句,all表示全部語句均記錄
log_min_duration_statement單位ms,記錄執行超過多少ms的語句

5、主從以及WAL相關

引數含義
wal_level可配置minimal、replica、logical,此配置決定多少資訊寫入wal日誌中,更改引數需重啟生效。minimal,只寫入在資料庫崩潰會突然關機進行恢復時所需要的資訊;設定為replica,會新增一些備庫只讀查詢時需要的資訊,需要流複製物理備庫、歸檔、時間點恢復時,需設定為replica;需要邏輯訂閱或邏輯備庫則設定為logical,logical增加支援邏輯解碼所需的資訊
fsync是否使用fsync()將記憶體中的髒頁重新整理到物理磁碟,預設為ON
synchronous_commit事務提交是否需要等待對應的wal日誌刷盤,預設為ON;複製一致性要求模式,可設定 remote_apply、on(預設值)remote_write、local、 和off
wal_sync_methodwal日誌刷盤方式
full_page_write當開啟該引數時,當在檢查點之後第一次修改一個頁面時,整個頁面都被寫入wal,避免資料庫崩潰恢復時資料頁損壞
wal_log_hints在full_page_writes的基礎上,即使資料頁發生了一些不重要的更改,也會將整個頁面寫入到wal日誌。若資料庫使用pg_rewind,需要開啟該引數或者開啟 data checksums
wal_compression當開啟full_page_writes引數或者進行基礎備份時,是否對wal日誌進行壓縮,預設為off
wal_buffer資料庫變更操作首先會寫入wal buffer,然後wal buffer刷盤寫入到wal log,一般可設定為wal log的1/32,但不建議過小或者過大,一般設定為16MB。
wal_writer_delaywal buffer進行刷盤從時間維度上的頻率,預設200ms。若距離上一次刷盤時間小於 wal_writer_delay 且容量小於 wal_writer_flush_after ,wal僅僅會寫入os,並不會進行刷盤
wal_writer_flush_afterwal buffer 進行刷盤從容量上的頻率,預設為8kb。若距離上一次刷盤時間小於 wal_writer_delay 且容量小於 wal_writer_flush_after ,wal僅僅會寫入os,並不會進行刷盤
max_wal_size在兩次checkpoint期間wal日誌增長最大限制,該引數的限制屬於軟限制。當archive異常、standby複製異常、重負載、wal_keep_segments引數設定過大時,該引數可能會進行擴充套件。該引數設定過大會影響資料崩潰恢復的時間
min_wal_size當wal日誌空間佔用小於該引數時,wal日誌會被進行復用而不會被刪除,該引數可確保批處理操作時有足夠的wal空間進行儲存,預設為80MB
wal_keep_size指定在 pg_wal 目錄中保留的 wal segment file 的最小大小,以便流複製環境中的 standby server 從主庫中 fetch wal file;單位MB
wal_sender_timeout傳送方(主庫)walsender程序的超時時間,如果存在超過這個時間、停止活動的複製連線,會被中斷,預設以毫秒為單位,預設60s
wal_receiver_timeout接收方(從庫)walreceiver程序的超時時間,如果存在超過這個時間、停止活動的複製連線,會被中斷,預設以毫秒為單位,預設60s

6、複製相關

引數含義
max_wal_senders資料庫啟動wal傳送程序的最大併發數(備用伺服器複製或者基礎備份)
max_replication_slots資料庫可建立的複製槽個數
wal_keep_segments為保證備用伺服器複製落後時,主資料庫仍保留所需的wal日誌的wal段大小
synchronous_standby_namesPG預設採用非同步複製,如要配置同步複製,需將synchronous_standby_names設定為非空,synchronous_commit設定為ON
官網說明:postgres.cn/docs/13/run.
hot_standbystandby例項是否可進行查詢
wal_sender_timeout中斷那些停止活動超過指定毫秒數的複製連線。這對傳送伺服器檢測一個後備機崩潰或網路中斷有用。設定為0將禁用該超時機制,預設為 60 秒
wal_receiver_timeout從master例項接收wal的最大時間限制,終止處於非活動狀態的複製連線。設定為0會禁用超時機制,預設值是 60 秒
hot_standby_feedback當開啟該引數時,備用伺服器執行大查詢或者大事物期間,主資料庫進行相應的vacuum操作時,保留備用服務所需的版本記錄。若備份伺服器長時間存在大查詢或者大事物,會導致對應表膨脹

7、超時相關

引數含義
deadlock_timeout超過該引數的鎖才會進行死鎖檢測,預設1s
lock_timeout鎖等待超時時間,預設為0表示一直等待
statement_timeout控制語句執行時長,單位是ms。超過設定值,該語句將被終止
idle_in_transaction_session_timeout終止開啟事務但空閒時間超過指定持續時間(以毫秒為單位)的任何會話,預設為0表示不開啟該功能
checkpoint_timeout兩次檢查點之間的最長時間間隔,單位是秒
archive_timeout強制資料庫切換新的wal日誌的時間間隔,預設為0,表示禁用,一般1min設定是比較合理的
authentication_timeout完成伺服器認證的最長時間,如果在這個時間內沒有完成認證,伺服器將關閉連線,預設1min
wal_sender_timeout中斷那些停止活動超過指定毫秒數的複製連線。這對傳送伺服器檢測一個後備機崩潰或網路中斷有用。設定為0將禁用該超時機制,預設為 60 秒。
wal_receiver_timeout從master例項接收wal的最大時間限制,終止處於非活動狀態的複製連線。設定為0會禁用超時機制,預設值是 60 秒。

8、vacuum相關

引數含義
vacuum_cost_delay超出成本計數後強制休眠時間,該引數不建議設定過大
vacuum_cost_page_hitvacuum操作命中 shared buffer 的代價消耗
vacuum_cost_page_missvacuum操作未命中 shared buffer 的代價消耗
vacuum_cost_page_dirtyvacuum操作未命中 shared buffer 後,需要將對應的dirty頁刷盤的代價消耗
vacuum_cost_limit需要強制休眠的代價限制

9、非同步相關

引數含義
effective_io_concurrency資料庫允許會話級別進行併發磁碟I/O操作的數量
maintenance_io_concurrency資料庫維護操作允許發起的併發磁碟I/O運算元量
max_worker_processes資料庫支援最大後臺程序數,預設為8,若調整改引數需要對應的調整以下引數:max_parallel_workers、max_parallel_maintenance_workers和max_parallel_workers_per_gather
max_parallel_workers_per_gather並行查詢最大工作程序數,程序資源從 max_worker_processes 中獲取,並受限於 max_parallel_workers
max_parallel_maintenance_workers資料庫進行維護操作的最大並行程序數,程序資源從 max_worker_processes 中獲取,並受限於 max_parallel_workers
max_parallel_workers資料庫支援最大並行工作程序

轉自