以下函數用於建立與 PostgreSQL 後端伺服器的連線。一個應用程式可以同時開啟多個後端連線。(這樣做的一個原因是為了存取多個資料庫。)每個連線都由一個 PGconn
物件表示,該物件從函數 PQconnectdb
、PQconnectdbParams
或 PQsetdbLogin
取得。請注意,這些函數總是會傳回一個非空的物件指標,除非記憶體太少,甚至無法分配 PGconn
物件。PQstatus
函數應該在透過連線物件傳送查詢之前呼叫,以檢查傳回值,判斷連線是否成功。
如果不受信任的使用者可以存取尚未採用安全綱要使用模式的資料庫,請在每個工作階段開始時,從 search_path
中移除可公開寫入的綱要。 可以將參數關鍵字 options
設定為值 -csearch_path=
。 或者,可以在連線後發出 PQexec(
。 這種考量並非 libpq 所獨有;它適用於執行任意 SQL 命令的每個介面。conn
, "SELECT pg_catalog.set_config('search_path', '', false)")
在 Unix 上,使用開放的 libpq 連線 fork 一個程序可能會導致不可預測的結果,因為父程序和子程序共用相同的 socket 和作業系統資源。 因此,不建議這樣使用,雖然從子程序執行 exec
以載入新的可執行檔是安全的。
PQconnectdbParams
#建立與資料庫伺服器的新連線。
PGconn *PQconnectdbParams(const char * const *keywords, const char * const *values, int expand_dbname);
此函數使用從兩個以 NULL
結尾的陣列中取得的參數開啟新的資料庫連線。 第一個陣列 keywords
定義為字串陣列,每個字串都是一個關鍵字。 第二個陣列 values
提供每個關鍵字的值。 與下面的 PQsetdbLogin
不同,可以擴展參數集而無需變更函數簽名,因此對於新的應用程式編程,建議使用此函數(或其非阻塞類比 PQconnectStartParams
和 PQconnectPoll
)。
目前可識別的參數關鍵字列於第 32.1.2 節。
傳遞的陣列可以是空的,以使用所有預設參數,也可以包含一個或多個參數設定。它們的長度必須匹配。處理將在 keywords
陣列中的第一個 NULL
條目處停止。此外,如果與非 NULL
的 keywords
條目關聯的 values
條目是 NULL
或空字串,則該條目將被忽略,並且處理將繼續使用下一對陣列條目。
當 expand_dbname
非零時,將檢查第一個 dbname
關鍵字的值,以查看它是否是連線字串。 如果是,它將被「展開」為從字串中提取的個別連線參數。 如果該值包含等號 (=
) 或以 URI 方案指示符開頭,則該值被視為連線字串,而不僅僅是資料庫名稱。(有關連線字串格式的更多詳細資訊,請參閱第 32.1.1 節。)僅以這種方式處理 dbname
的第一次出現; 任何後續的 dbname
參數都將被視為普通的資料庫名稱。
通常,參數陣列會從頭到尾依序處理。如果任何關鍵字重複出現,則使用最後一個值 (不是 NULL
或空字串)。此規則特別適用於連線字串中找到的關鍵字與 keywords
陣列中出現的關鍵字衝突時。因此,程式設計師可以決定陣列條目是否可以覆蓋或被來自連線字串的值覆蓋。出現在展開的 dbname
條目之前的陣列條目可以被連線字串的欄位覆蓋,而連線字串的欄位又可以被出現在 dbname
之後的陣列條目覆蓋(但同樣地,僅當這些條目提供非空值時)。
在處理完所有陣列條目和任何展開的連線字串後,任何未設定的連線參數都會填入預設值。如果未設定參數的相應環境變數(請參閱第 32.15 節),則使用其值。如果環境變數也未設定,則使用參數的內建預設值。
PQconnectdb
#建立與資料庫伺服器的新連線。
PGconn *PQconnectdb(const char *conninfo);
此函數使用從字串 conninfo
取得的參數開啟新的資料庫連線。
傳遞的字串可以是空的,以使用所有預設參數,或者它可以包含一個或多個以空白分隔的參數設定,或者它可以包含一個URI。有關詳細資訊,請參閱第 32.1.1 節。
PQsetdbLogin
#建立與資料庫伺服器的新連線。
PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd);
這是 PQconnectdb
的前身,具有固定的參數集。它具有相同的功能,只是遺失的參數將始終採用預設值。對於任何要預設的固定參數,請寫入 NULL
或空字串。
如果 dbName
包含一個 =
符號或具有有效的連線URI前綴,它將被視為一個 conninfo
字串,其處理方式與傳遞給 PQconnectdb
完全相同,然後將剩餘的參數按照 PQconnectdbParams
的指定方式應用。
pgtty
不再使用,並且任何傳遞的值都將被忽略。
PQsetdb
#建立與資料庫伺服器的新連線。
PGconn *PQsetdb(char *pghost, char *pgport, char *pgoptions, char *pgtty, char *dbName);
這是一個巨集,使用 null 指標作為 login
和 pwd
參數來呼叫 PQsetdbLogin
。提供它是為了與非常舊的程式保持向後相容性。
PQconnectStartParams
PQconnectStart
PQconnectPoll
#PGconn *PQconnectStartParams(const char * const *keywords, const char * const *values, int expand_dbname); PGconn *PQconnectStart(const char *conninfo); PostgresPollingStatusType PQconnectPoll(PGconn *conn);
這三個函數用於開啟到資料庫伺服器的連線,這樣您的應用程式執行緒在執行時不會被遠端 I/O 阻塞。這種方法的重點是,等待 I/O 完成可以在應用程式的主迴圈中發生,而不是在 PQconnectdbParams
或 PQconnectdb
內部發生,因此應用程式可以與其他活動平行管理此操作。
使用 PQconnectStartParams
,資料庫連線是使用從 keywords
和 values
陣列中取得的參數建立的,並由 expand_dbname
控制,如上面對 PQconnectdbParams
的描述。
使用 PQconnectStart
,資料庫連線是使用從字串 conninfo
取得的參數建立的,如上面對 PQconnectdb
的描述。
只要滿足一些限制,PQconnectStartParams
、PQconnectStart
和 PQconnectPoll
都不會阻塞
必須適當地使用 hostaddr
參數,以防止發出 DNS 查詢。有關詳細資訊,請參閱第 32.1.2 節中此參數的說明。
如果您呼叫 PQtrace
,請確保您追蹤到的串流物件不會阻塞。
您必須確保套接字處於適當的狀態,然後才能呼叫 PQconnectPoll
,如下所述。
若要開始非阻塞連線請求,請呼叫 PQconnectStart
或 PQconnectStartParams
。如果結果為 null,則 libpq 無法配置新的 PGconn
結構。否則,會傳回有效的 PGconn
指標(但尚未表示到資料庫的有效連線)。接下來呼叫 PQstatus(conn)
。如果結果為 CONNECTION_BAD
,則連線嘗試已失敗,通常是因為無效的連線參數。
如果 PQconnectStart
或 PQconnectStartParams
成功,則下一個階段是輪詢 libpq,以便它可以繼續進行連線序列。使用 PQsocket(conn)
取得資料庫連線底層的套接字描述符。(注意:不要假設套接字在 PQconnectPoll
呼叫中保持不變。) 迴圈如下:如果 PQconnectPoll(conn)
最後傳回 PGRES_POLLING_READING
,則等到套接字準備好讀取(如 select()
、poll()
或類似的系統函數所示)。請注意,如果您的系統上可用,PQsocketPoll
可以透過抽象化 select(2)
或 poll(2)
的設定來幫助減少樣板程式碼。然後再次呼叫 PQconnectPoll(conn)
。相反地,如果 PQconnectPoll(conn)
最後傳回 PGRES_POLLING_WRITING
,則等到套接字準備好寫入,然後再次呼叫 PQconnectPoll(conn)
。在第一次迭代中,即如果您尚未呼叫 PQconnectPoll
,則表現得好像它最後傳回 PGRES_POLLING_WRITING
。繼續此迴圈,直到 PQconnectPoll(conn)
傳回 PGRES_POLLING_FAILED
,表示連線程序已失敗,或者 PGRES_POLLING_OK
,表示連線已成功建立。
在連線期間的任何時間,都可以透過呼叫 PQstatus
來檢查連線狀態。如果此呼叫傳回 CONNECTION_BAD
,則連線程序已失敗;如果呼叫傳回 CONNECTION_OK
,則連線已準備就緒。從上述 PQconnectPoll
的傳回值同樣可以偵測到這兩種狀態。在非同步連線程序期間(且僅在該期間),也可能發生其他狀態。這些狀態指示連線程序的目前階段,並且可能有用於向使用者提供回饋。這些狀態是
CONNECTION_STARTED
#等待連線建立。
CONNECTION_MADE
#連線正常;等待傳送。
CONNECTION_AWAITING_RESPONSE
#等待伺服器的回應。
CONNECTION_AUTH_OK
#收到驗證;等待後端啟動完成。
CONNECTION_SSL_STARTUP
#協商 SSL 加密。
CONNECTION_GSS_STARTUP
#協商 GSS 加密。
CONNECTION_CHECK_WRITABLE
#檢查連線是否能夠處理寫入交易。
CONNECTION_CHECK_STANDBY
#檢查連線是否連到待命模式的伺服器。
CONNECTION_CONSUME
#消耗連線上任何剩餘的回應訊息。
請注意,雖然這些常數會保留(為了維持相容性),但應用程式絕不應該依賴這些常數以特定的順序發生,或完全發生,或依賴於狀態始終是這些文件中記錄的值之一。應用程式可能會執行類似以下的操作
switch(PQstatus(conn)) { case CONNECTION_STARTED: feedback = "Connecting..."; break; case CONNECTION_MADE: feedback = "Connected to server..."; break; . . . default: feedback = "Connecting..."; }
當使用 PQconnectPoll
時,connect_timeout
連線參數會被忽略;由應用程式自行決定是否經過了過多的時間。 否則,PQconnectStart
後面跟著 PQconnectPoll
迴圈,等同於 PQconnectdb
。
請注意,當 PQconnectStart
或 PQconnectStartParams
傳回一個非 null 指標時,您必須在完成使用後呼叫 PQfinish
,以便處置該結構和任何相關的記憶體區塊。即使連線嘗試失敗或被放棄,也必須執行此操作。
PQsocketPoll
# 輪詢使用 PQsocket
擷取的連線底層 socket 描述符。此函數的主要用途是迭代 PQconnectStartParams
文件中描述的連線序列。
typedef pg_int64 pg_usec_time_t; int PQsocketPoll(int sock, int forRead, int forWrite, pg_usec_time_t end_time);
此函數執行檔案描述符的輪詢,並可選擇設定逾時時間。如果 forRead
非零,則當 socket 準備好進行讀取時,該函數將終止。如果 forWrite
非零,則當 socket 準備好進行寫入時,該函數將終止。
逾時時間由 end_time
指定,它是停止等待的時間,以自 Unix Epoch 以來的微秒數表示(即,time_t
乘以 100 萬)。如果 end_time
是 -1
,則逾時時間是無限的。如果 end_time 是 0
(或者,實際上,任何早於現在的時間),則逾時時間是立即的(不阻塞)。逾時值可以透過將所需的微秒數加到 PQgetCurrentTimeUSec
的結果中來方便地計算。請注意,底層系統呼叫可能具有小於微秒的精度,因此實際的延遲可能不精確。
如果滿足指定條件,該函數將傳回一個大於 0
的值;如果發生逾時,則傳回 0
;如果發生錯誤,則傳回 -1
。可以透過檢查 errno(3)
值來檢索錯誤。如果 forRead
和 forWrite
均為零,則該函數會立即傳回逾時指示。
PQsocketPoll
是使用 poll(2)
或 select(2)
實作的,具體取決於平台。有關更多資訊,請參閱 poll(2)
中的 POLLIN
和 POLLOUT
,或 select(2)
中的 readfds
和 writefds
。
PQconndefaults
#傳回預設的連線選項。
PQconninfoOption *PQconndefaults(void); typedef struct { char *keyword; /* The keyword of the option */ char *envvar; /* Fallback environment variable name */ char *compiled; /* Fallback compiled in default value */ char *val; /* Option's current value, or NULL */ char *label; /* Label for field in connect dialog */ char *dispchar; /* Indicates how to display this field in a connect dialog. Values are: "" Display entered value as is "*" Password field - hide value "D" Debug option - don't show by default */ int dispsize; /* Field size in characters for dialog */ } PQconninfoOption;
傳回連線選項陣列。這可用於確定所有可能的 PQconnectdb
選項及其目前的預設值。傳回值指向一個 PQconninfoOption
結構的陣列,該陣列以一個具有空 keyword
指標的條目結尾。如果無法分配記憶體,則傳回空指標。請注意,目前的預設值(val
欄位)將取決於環境變數和其他上下文。遺失或無效的服務檔案將被靜默忽略。呼叫者必須將連線選項資料視為唯讀。
處理選項陣列後,透過將其傳遞給 PQconninfoFree
來釋放它。如果沒有這樣做,則每次呼叫 PQconndefaults
都會洩漏少量記憶體。
PQconninfo
#傳回即時連線使用的連線選項。
PQconninfoOption *PQconninfo(PGconn *conn);
傳回連線選項陣列。這可用於確定所有可能的 PQconnectdb
選項以及用於連線到伺服器的值。傳回值指向一個 PQconninfoOption
結構的陣列,該陣列以一個具有空 keyword
指標的條目結尾。PQconndefaults
的所有上述說明也適用於 PQconninfo
的結果。
PQconninfoParse
#從提供的連線字串傳回已剖析的連線選項。
PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);
剖析連線字串並將結果選項作為陣列傳回;如果連線字串有問題,則傳回 NULL
。此函數可用於提取提供的連線字串中的 PQconnectdb
選項。傳回值指向一個 PQconninfoOption
結構的陣列,該陣列以一個具有空 keyword
指標的條目結尾。
所有合法的選項都會出現在結果陣列中,但是連線字串中不存在的任何選項的 PQconninfoOption
都會將 val
設定為 NULL
;不會插入預設值。
如果 errmsg
不是 NULL
,成功時 *errmsg
會被設定為 NULL
;否則,會被設定為一個用 malloc
分配的錯誤字串,來說明問題。(也有可能 *errmsg
被設定為 NULL
,且函式返回 NULL
;這表示記憶體不足的情況。)
處理選項陣列後,將其傳遞給 PQconninfoFree
來釋放它。 如果不這樣做,每次呼叫 PQconninfoParse
都會洩漏一些記憶體。 相反地,如果發生錯誤且 errmsg
不是 NULL
,請務必使用 PQfreemem
釋放錯誤字串。
PQfinish
#關閉與伺服器的連線。 同時釋放 PGconn
物件使用的記憶體。
void PQfinish(PGconn *conn);
請注意,即使伺服器連線嘗試失敗(如 PQstatus
所示),應用程式也應呼叫 PQfinish
以釋放 PGconn
物件使用的記憶體。 在呼叫 PQfinish
後,不得再次使用 PGconn
指標。
PQreset
#重設與伺服器的通訊通道。
void PQreset(PGconn *conn);
此函式將關閉與伺服器的連線,並嘗試建立新的連線,使用之前使用的所有相同參數。 如果工作連線遺失,這可能對錯誤恢復很有用。
PQresetStart
PQresetPoll
#以非阻塞的方式重設與伺服器的通訊通道。
int PQresetStart(PGconn *conn); PostgresPollingStatusType PQresetPoll(PGconn *conn);
這些函式將關閉與伺服器的連線,並嘗試建立新的連線,使用之前使用的所有相同參數。 如果工作連線遺失,這可能對錯誤恢復很有用。 它們與 PQreset
(如上所述)的不同之處在於,它們以非阻塞的方式運作。 這些函式具有與 PQconnectStartParams
、PQconnectStart
和 PQconnectPoll
相同的限制。
要啟動連線重設,請呼叫 PQresetStart
。 如果它返回 0,則重設失敗。 如果它返回 1,請使用 PQresetPoll
以與使用 PQconnectPoll
建立連線完全相同的方式輪詢重設。
PQpingParams
#PQpingParams
報告伺服器的狀態。 它接受與上面描述的 PQconnectdbParams
相同的連線參數。 沒有必要提供正確的使用者名稱、密碼或資料庫名稱值來取得伺服器狀態; 但是,如果提供了不正確的值,伺服器將記錄失敗的連線嘗試。
PGPing PQpingParams(const char * const *keywords, const char * const *values, int expand_dbname);
該函式返回以下值之一
PQping
#PQping
報告伺服器的狀態。 它接受與上面描述的 PQconnectdb
相同的連線參數。 沒有必要提供正確的使用者名稱、密碼或資料庫名稱值來取得伺服器狀態; 但是,如果提供了不正確的值,伺服器將記錄失敗的連線嘗試。
PGPing PQping(const char *conninfo);
返回值與 PQpingParams
的返回值相同。
PQsetSSLKeyPassHook_OpenSSL
#PQsetSSLKeyPassHook_OpenSSL
允許應用程式使用 sslpassword 或互動式提示,來覆蓋 libpq 的 加密用戶端憑證金鑰檔案的預設處理方式。
void PQsetSSLKeyPassHook_OpenSSL(PQsslKeyPassHook_OpenSSL_type hook);
應用程式傳遞一個指向簽名回呼函式的指標
int callback_fn(char *buf, int size, PGconn *conn);
然後 libpq 將呼叫該函式 而不是 其預設的 PQdefaultSSLKeyPassHook_OpenSSL
處理常式。 回呼應確定金鑰的密碼,並將其複製到大小為 size
的結果緩衝區 buf
中。buf
中的字串必須以 null 結尾。 回呼必須返回儲存在 buf
中密碼的長度,不包括 null 終止符。 失敗時,回呼應設定 buf[0] = '\0'
並返回 0。 有關範例,請參閱 libpq 原始碼中的 PQdefaultSSLKeyPassHook_OpenSSL
。
如果使用者指定了顯式金鑰位置,則在呼叫回呼時,其路徑將位於 conn->sslkey
中。 如果使用預設金鑰路徑,則此值將為空。 對於作為引擎說明符的金鑰,是否使用 OpenSSL 密碼回呼或定義自己的處理方式取決於引擎的實作。
應用程式回呼可以選擇將未處理的情況委託給 PQdefaultSSLKeyPassHook_OpenSSL
,或者先呼叫它,如果它返回 0,則嘗試其他操作,或者完全覆蓋它。
回呼 不得 使用異常、longjmp(...)
等跳脫正常的流程控制。 它必須正常返回。
PQgetSSLKeyPassHook_OpenSSL
#PQgetSSLKeyPassHook_OpenSSL
會傳回目前用戶端憑證金鑰密碼勾點 (hook),如果沒有設定,則傳回 NULL
。
PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL(void);
數個 libpq 函數會解析使用者指定的字串來取得連線參數。這些字串有兩種可接受的格式:純關鍵字/值字串和 URI。URI 通常遵循 RFC 3986,但允許多主機連線字串,如下所述。
在關鍵字/值格式中,每個參數設定都採用 keyword
=
value
的形式,設定之間有空格。設定的等號周圍的空格是可選的。要寫入空值或包含空格的值,請用單引號將其括起來,例如 keyword = 'a value'
。值中的單引號和反斜線必須用反斜線跳脫,即 \'
和 \\
。
範例
host=localhost port=5432 dbname=mydb connect_timeout=10
可辨識的參數關鍵字列在 第 32.1.2 節中。
連線的一般形式URI是
postgresql://[userspec
@][hostspec
][/dbname
][?paramspec
] whereuserspec
is:user
[:password
] andhostspec
is: [host
][:port
][,...] andparamspec
is:name
=value
[&...]
其中URIscheme 指定符可以是 postgresql://
或 postgres://
。其餘的每個URI部分都是可選的。以下範例說明了有效的URI語法
postgresql:// postgresql://127.0.0.1 postgresql://127.0.0.1:5433 postgresql://127.0.0.1/mydb postgresql://user@localhost postgresql://user:secret@localhost postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp
通常會出現在階層部分的數值URI可以作為具名參數給定。例如
postgresql:///mydb?host=localhost&port=5433
所有具名參數都必須符合 第 32.1.2 節中列出的關鍵字,但為了與 JDBC 連線URI相容,ssl=true
的實例會轉換為 sslmode=require
。
如果連線URI在其任何部分中包含具有特殊意義的符號,則需要使用 百分比編碼進行編碼。以下是一個範例,其中等號 (=
) 替換為 %3D
,空格字元替換為 %20
postgresql://user@localhost:5433/mydb?options=-c%20synchronous_commit%3Doff
主機部分可以是主機名稱或 IP 位址。要指定 IPv6 位址,請將其括在方括號中
postgresql://[2001:db8::1234]/database
主機部分的解釋方式與參數 host 的描述相同。特別是,如果主機部分為空或看起來像是絕對路徑名稱,則會選擇 Unix 網域 socket 連線,否則會啟動 TCP/IP 連線。但是請注意,斜線是 URI 階層部分中的保留字元。因此,要指定非標準的 Unix 網域 socket 目錄,請省略 URI 的主機部分,並將主機指定為具名參數,或對 URI 主機部分中的路徑進行百分比編碼
postgresql:///dbname?host=/var/lib/postgresql postgresql://%2Fvar%2Flib%2Fpostgresql/dbname
可以在單個 URI 中指定多個主機元件,每個元件都有一個可選的埠元件。形式為 postgresql://host1:port1,host2:port2,host3:port3/
的 URI 等效於形式為 host=host1,host2,host3 port=port1,port2,port3
的連線字串。如下文所述,將依次嘗試每個主機,直到成功建立連線。
可以指定要連線的多個主機,以便按給定的順序嘗試連線。在關鍵字/值格式中,host
、hostaddr
和 port
選項接受以逗號分隔的值清單。必須在每個指定的選項中給出相同數量的元素,例如,第一個 hostaddr
對應於第一個主機名稱,第二個 hostaddr
對應於第二個主機名稱,依此類推。作為例外情況,如果僅指定一個 port
,則它適用於所有主機。
在連線 URI 格式中,您可以在 URI 的 host
元件中列出多個以逗號分隔的 host:port
配對。
無論使用哪種格式,單個主機名稱都可以轉換為多個網路位址。一個常見的例子是同時具有 IPv4 和 IPv6 位址的主機。
指定多個主機時,或者當單個主機名稱轉換為多個位址時,將按順序嘗試所有主機和位址,直到其中一個成功為止。如果無法連線到任何主機,則連線將失敗。如果成功建立連線,但驗證失敗,則不會嘗試清單中的其餘主機。
如果使用密碼檔案,您可以為不同的主機設定不同的密碼。所有其他連線選項對於清單中的每個主機都是相同的;例如,無法為不同的主機指定不同的使用者名稱。
目前可辨識的參數關鍵字為
host
#要連線的主機名稱。 如果主機名稱看起來像是絕對路徑名稱,則它指定 Unix 網域通訊而不是 TCP/IP 通訊;該值是儲存 socket 檔案的目錄名稱。(在 Unix 上,絕對路徑名稱以斜線開頭。在 Windows 上,也辨識以磁碟機代號開頭的路徑。)如果主機名稱以 @
開頭,則將其視為抽象命名空間中的 Unix 網域 socket(目前在 Linux 和 Windows 上支援)。如果未指定 host
或為空,則預設行為是連線到 /tmp
中的 Unix 網域 socket(或建置 PostgreSQL 時指定的任何 socket 目錄)。在 Windows 上,預設是連線到 localhost
。
也接受以逗號分隔的主機名稱清單,在這種情況下,將按順序嘗試清單中的每個主機名稱;清單中的空白項目會選擇上述說明中的預設行為。有關詳細訊息,請參閱 第 32.1.1.3 節。
hostaddr
#要連線的主機的數值 IP 位址。這應該採用標準的 IPv4 位址格式,例如 172.28.40.9
。如果您的機器支援 IPv6,您也可以使用這些位址。當為此參數指定非空字串時,始終使用 TCP/IP 通訊。如果未指定此參數,則將查閱 host
的值以尋找相應的 IP 位址 — 或者,如果 host
指定 IP 位址,則將直接使用該值。
使用 hostaddr
允許應用程式避免主機名稱查閱,這在具有時間限制的應用程式中可能很重要。但是,GSSAPI 或 SSPI 驗證方法以及 verify-full
SSL 憑證驗證都需要主機名稱。使用以下規則
如果指定了 host
但未指定 hostaddr
,則會進行主機名稱查詢。(當使用 PQconnectPoll
時,查詢會在 PQconnectPoll
首次考慮此主機名稱時發生,並且可能導致 PQconnectPoll
阻塞一段相當長的時間。)
如果指定了 hostaddr
但未指定 host
,則 hostaddr
的值給出了伺服器網路位址。如果身份驗證方法需要主機名稱,則連線嘗試將會失敗。
如果同時指定了 host
和 hostaddr
,則 hostaddr
的值給出了伺服器網路位址。除非身份驗證方法需要,否則 host
的值將被忽略;如果需要,則會將其用作主機名稱。
請注意,如果 host
不是網路位址 hostaddr
上的伺服器名稱,則驗證很可能會失敗。此外,當同時指定 host
和 hostaddr
時,host
用於在密碼檔案中識別連線(請參閱第 32.16 節)。
也接受以逗號分隔的 hostaddr
值列表,在這種情況下,列表中的每個主機都會按順序嘗試。列表中的空項目會導致使用相應的主機名稱,如果該主機名稱也為空,則使用預設主機名稱。有關詳細資訊,請參閱第 32.1.1.3 節。
如果沒有主機名稱或主機位址,libpq 將使用本機 Unix 網域套接字進行連線;或者在 Windows 上,它將嘗試連線到 localhost
。
port
#要連線到伺服器主機的埠號,或是 Unix 網域連線的套接字檔案名稱副檔名。 如果在 host
或 hostaddr
參數中給出了多個主機,則此參數可以指定與主機列表長度相同的以逗號分隔的埠列表,也可以指定單個埠號以用於所有主機。空字串或以逗號分隔的列表中的空項目,表示在建置 PostgreSQL 時建立的預設埠號。
dbname
#資料庫名稱。預設值與使用者名稱相同。在某些情況下,會檢查該值的擴展格式;有關這些格式的更多詳細資訊,請參閱第 32.1.1 節。
user
#要連線為的 PostgreSQL 使用者名稱。預設值與執行應用程式的使用者的作業系統名稱相同。
password
#如果伺服器要求密碼驗證,則使用的密碼。
passfile
#指定用於儲存密碼的檔案名稱(請參閱第 32.16 節)。預設為 ~/.pgpass
,或 Microsoft Windows 上的 %APPDATA%\postgresql\pgpass.conf
。(如果此檔案不存在,則不會報告錯誤。)
require_auth
#指定用戶端需要的來自伺服器的驗證方法。如果伺服器未使用所需的方法驗證用戶端,或者伺服器未完全完成驗證交握,則連線將會失敗。也可以提供以逗號分隔的方法列表,伺服器必須使用其中一個方法才能成功建立連線。預設情況下,接受任何驗證方法,並且伺服器可以完全跳過驗證。
可以使用 !
字首來否定方法,在這種情況下,伺服器不得嘗試列出的方法;將接受任何其他方法,並且伺服器可以自由地不驗證用戶端。如果提供了以逗號分隔的列表,則伺服器不得嘗試任何列出的否定方法。否定和非否定形式不能在同一設定中組合使用。
作為最終特殊情況,none
方法要求伺服器不使用驗證挑戰。(它也可以被否定,以要求某種形式的驗證。)
可以指定以下方法
password
伺服器必須請求純文字密碼驗證。
md5
伺服器必須請求 MD5 雜湊密碼驗證。
gss
伺服器必須透過以下方式請求 Kerberos 交握GSSAPI或建立GSS加密通道(另請參閱gssencmode)。
sspi
伺服器必須請求 WindowsSSPI驗證。
scram-sha-256
伺服器必須成功完成與用戶端的 SCRAM-SHA-256 驗證交換。
none
伺服器不得提示用戶端進行驗證交換。(這不會禁止透過 TLS 進行用戶端憑證驗證,也不會禁止透過其加密傳輸進行 GSS 驗證。)
channel_binding
#此選項控制用戶端對通道綁定的使用。require
的設定表示連線必須採用通道綁定,prefer
表示用戶端將在可用時選擇通道綁定,而 disable
阻止使用通道綁定。如果使用 SSL 支援編譯 PostgreSQL,則預設值為 prefer
;否則預設值為 disable
。
通道綁定是一種伺服器向用戶端驗證自身的方法。僅在 PostgreSQL 11 或更新版本的伺服器上使用 SCRAM
驗證方法的 SSL 連線上才支援。
connect_timeout
#連線時等待的最長時間,以秒為單位(寫為十進制整數,例如,10
)。零、負數或未指定表示無限期等待。此逾時分別適用於每個主機名稱或 IP 位址。例如,如果您指定了兩個主機,並且 connect_timeout
為 5,則如果在 5 秒內未建立任何連線,每個主機都將逾時,因此等待連線的總時間可能長達 10 秒。
client_encoding
#這會為此連線設定 client_encoding
配置參數。除了相應伺服器選項接受的值之外,您還可以使用 auto
從用戶端中的當前語言環境(Unix 系統上的 LC_CTYPE
環境變數)確定正確的編碼。
options
#指定在連線啟動時要傳送到伺服器的命令列選項。例如,將此設定為 -c geqo=off
或 --geqo=off
會將會話的 geqo
參數值設定為 off
。除非使用反斜線 (\
) 逸出,否則此字串中的空格被認為分隔命令列引數;寫入 \\
以表示字面反斜線。有關可用選項的詳細討論,請參閱第 19 章。
application_name
#指定 application_name 配置參數的值。
fallback_application_name
#指定 application_name 設定參數的回退值。如果沒有透過連線參數或 PGAPPNAME
環境變數為 application_name
提供值,則將使用此值。指定回退名稱在希望設定預設應用程式名稱但允許使用者覆寫的一般工具程式中很有用。
keepalives
#控制是否使用用戶端 TCP keepalive。預設值為 1,表示開啟,但如果不需要 keepalive,您可以將其更改為 0,表示關閉。對於透過 Unix 網域套接字建立的連線,此參數將被忽略。
keepalives_idle
#控制 TCP 在多少秒的不活動後,應將 keepalive 訊息傳送到伺服器。值為零表示使用系統預設值。對於透過 Unix 網域套接字建立的連線,或如果停用 keepalive,此參數將被忽略。它僅在 TCP_KEEPIDLE
或等效的套接字選項可用的系統以及 Windows 上受支援;在其他系統上,它沒有任何作用。
keepalives_interval
#控制在未收到伺服器確認的 TCP keepalive 訊息應重新傳輸的秒數。值為零表示使用系統預設值。對於透過 Unix 網域套接字建立的連線,或如果停用 keepalive,此參數將被忽略。它僅在 TCP_KEEPINTVL
或等效的套接字選項可用的系統以及 Windows 上受支援;在其他系統上,它沒有任何作用。
keepalives_count
#控制在用戶端與伺服器的連線被視為已中斷之前,可以遺失的 TCP keepalive 數量。值為零表示使用系統預設值。對於透過 Unix 網域套接字建立的連線,或如果停用 keepalive,此參數將被忽略。它僅在 TCP_KEEPCNT
或等效的套接字選項可用的系統上受支援;在其他系統上,它沒有任何作用。
tcp_user_timeout
#控制傳輸的資料在強制關閉連線之前可以保持未確認的毫秒數。值為零表示使用系統預設值。對於透過 Unix 網域套接字建立的連線,此參數將被忽略。它僅在 TCP_USER_TIMEOUT
可用的系統上受支援;在其他系統上,它沒有任何作用。
replication
#此選項決定連線是否應使用複製協定而不是常規協定。這是 PostgreSQL 複製連線以及諸如 pg_basebackup 之類的工具在內部使用的,但它也可以被第三方應用程式使用。有關複製協定的描述,請參閱第 53.4 節。
支援以下值(不區分大小寫)
true
, on
, yes
, 1
連線進入實體複製模式。
database
連線進入邏輯複製模式,連線到 dbname
參數中指定的資料庫。
false
, off
, no
, 0
連線是常規連線,這是預設行為。
在實體或邏輯複製模式下,只能使用簡單查詢協定。
gssencmode
#此選項決定是否以及以何種優先順序與伺服器協商安全GSSTCP/IP 連線。有三種模式
disable
僅嘗試非GSSAPI-加密連線
prefer
(預設)如果存在GSSAPI認證(即在認證快取中),首先嘗試GSSAPI-加密連線;如果失敗或沒有認證,請嘗試非GSSAPI-加密連線。這是 PostgreSQL 在編譯時具有GSSAPI支援時的預設值。
require
僅嘗試GSSAPI-加密連線
對於 Unix 網域套接字通訊,gssencmode
會被忽略。如果 PostgreSQL 在沒有 GSSAPI 支援的情況下編譯,則使用 require
選項將導致錯誤,而 prefer
將被接受,但 libpq 實際上不會嘗試GSSAPI-加密連線。
sslmode
#此選項決定是否以及以何種優先順序與伺服器協商安全SSLTCP/IP 連線將與伺服器協商。有六種模式
disable
僅嘗試非SSL連線
allow
首先嘗試非SSL連線;如果失敗,請嘗試SSL連線
prefer
(預設)首先嘗試SSL連線;如果失敗,請嘗試非SSL連線
require
僅嘗試SSL連線。如果存在根 CA 檔案,請以與指定 verify-ca
相同的方式驗證憑證
verify-ca
僅嘗試SSL連線,並驗證伺服器憑證是否由受信任的憑證授權單位頒發 (CA)
verify-full
僅嘗試SSL連線,驗證伺服器憑證是否由受信任的CA頒發,並且請求的伺服器主機名稱與憑證中的名稱相符
有關這些選項如何運作的詳細說明,請參閱第 32.19 節。
對於 Unix 網域套接字通訊,sslmode
會被忽略。如果 PostgreSQL 在沒有 SSL 支援的情況下編譯,則使用選項 require
、verify-ca
或 verify-full
將導致錯誤,而選項 allow
和 prefer
將被接受,但 libpq 實際上不會嘗試SSL連線。
請注意,如果GSSAPI加密是可能的,則將優先於使用SSL加密,無論 sslmode
的值如何。要在具有工作SSL基礎結構(例如 Kerberos 伺服器)的環境中強制使用GSSAPI加密,也請將 gssencmode
設定為 disable
。
requiressl
#此選項已被棄用,取而代之的是 sslmode
設定。
如果設定為 1,則需要與伺服器建立SSL連線(這相當於 sslmode
require
)。如果伺服器不接受SSL連線,libpq 將拒絕連線。如果設定為 0(預設),libpq 將與伺服器協商連線類型(相當於 sslmode
prefer
)。只有在 PostgreSQL 在編譯時具有 SSL 支援時,此選項才可用。
sslnegotiation
#這個選項控制在使用 SSL 時,與伺服器協商 SSL 加密的方式。在預設的 postgres
模式下,用戶端會先詢問伺服器是否支援 SSL。在 direct
模式下,用戶端在建立 TCP/IP 連線後,直接啟動標準 SSL 交握。傳統的 PostgreSQL 協定協商對於不同的伺服器配置是最具彈性的。如果已知伺服器支援直接SSL連線,則後者需要較少的往返行程,從而減少連線延遲,並允許使用與協定無關的 SSL 網路工具。直接 SSL 選項在 PostgreSQL 第 17 版中引入。
postgres
執行 PostgreSQL 協定協商。如果未提供此選項,則這是預設值。
direct
在建立 TCP/IP 連線後,直接啟動 SSL 交握。這僅在使用 sslmode=require 或更高設定時才允許,因為較弱的設定可能會導致在伺服器不支援直接 SSL 交握時意外地回退到純文字驗證。
sslcompression
#如果設定為 1,則通過 SSL 連線傳送的資料將被壓縮。如果設定為 0,則壓縮將被禁用。預設值為 0。如果建立了沒有 SSL 的連線,則忽略此參數。
現在認為 SSL 壓縮是不安全的,因此不再建議使用。 OpenSSL 1.1.0 預設情況下禁用壓縮,並且許多作業系統發行版也在之前的版本中禁用了壓縮,因此如果伺服器不接受壓縮,則將此參數設定為 on 將不會有任何效果。PostgreSQL 14 完全禁用了後端的壓縮。
如果安全性不是主要考慮因素,則如果網路是瓶頸,壓縮可以提高吞吐量。如果 CPU 效能是限制因素,則禁用壓縮可以改善回應時間和吞吐量。
sslcert
#此參數指定用戶端 SSL 憑證的檔案名稱,替換預設的 ~/.postgresql/postgresql.crt
。如果未建立 SSL 連線,則忽略此參數。
sslkey
#此參數指定用於用戶端憑證的私密金鑰的位置。它可以指定一個檔案名稱,該檔案將取代預設的 ~/.postgresql/postgresql.key
,或者它可以指定從外部 “引擎” 獲得的金鑰(引擎是 OpenSSL 可載入的模組)。外部引擎規範應包含以冒號分隔的引擎名稱和引擎特定的金鑰識別碼。如果未建立 SSL 連線,則忽略此參數。
sslpassword
#此參數指定 sslkey
中指定的私密金鑰的密碼,即使互動式密碼輸入不切實際,也允許將用戶端憑證私密金鑰以加密形式儲存在磁碟上。
使用任何非空值指定此參數會抑制 OpenSSL 在預設情況下,當加密的用戶端憑證金鑰提供給 libpq
時發出的 Enter PEM pass phrase:
提示。
如果金鑰未加密,則忽略此參數。除非引擎使用 OpenSSL 密碼回呼機制進行提示,否則該參數對 OpenSSL 引擎指定的金鑰無效。
沒有等同於此選項的環境變數,也沒有在 .pgpass
中查找它的工具。它可以在服務檔案連線定義中使用。具有更複雜用途的用戶應考慮使用 OpenSSL 引擎和諸如 PKCS#11 或 USB 加密卸載設備之類的工具。
sslcertmode
#此選項確定是否可以將用戶端憑證傳送到伺服器,以及是否需要伺服器請求一個憑證。有三種模式
disable
永遠不會傳送用戶端憑證,即使有可用的憑證(預設位置或通過 sslcert 提供)。
allow
(預設)如果伺服器請求憑證且用戶端有憑證要傳送,則可以傳送憑證。
require
伺服器必須請求憑證。如果用戶端未傳送憑證,並且伺服器仍成功驗證了用戶端,則連線將失敗。
sslcertmode=require
不會增加任何額外的安全性,因為無法保證伺服器正在正確地驗證憑證;PostgreSQL 伺服器通常會從用戶端請求 TLS 憑證,無論它們是否驗證這些憑證。此選項在對更複雜的 TLS 設定進行疑難排解時可能很有用。
sslrootcert
#此參數指定包含 SSL 憑證授權單位 (CA) 憑證的檔案名稱。如果該檔案存在,則會驗證伺服器的憑證是否由這些授權單位之一簽署。預設值為 ~/.postgresql/root.crt
。
可以指定特殊值 system
,在這種情況下,將載入系統受信任的 CA 根憑證。這些根憑證的確切位置因 SSL 實作和平台而異。特別是對於 OpenSSL,這些位置可以通過 SSL_CERT_DIR
和 SSL_CERT_FILE
環境變數進一步修改。
當使用 sslrootcert=system
時,預設的 sslmode
會更改為 verify-full
,並且任何較弱的設定都會導致錯誤。在大多數情況下,任何人都可以輕鬆獲得系統信任的主機名的憑證,從而使 verify-ca
和所有較弱的模式變得無用。
魔術值 system
將優先於具有相同名稱的本機憑證檔案。如果由於某些原因您發現自己處於這種情況,請使用替代路徑,例如 sslrootcert=./system
。
sslcrl
#此參數指定 SSL 伺服器憑證撤銷清單 (CRL) 的檔案名稱。如果此檔案存在,則在嘗試驗證伺服器的憑證時,將拒絕此檔案中列出的憑證。如果既未設定 sslcrl 也未設定 sslcrldir,則此設定將被視為 ~/.postgresql/root.crl
。
sslcrldir
#這個參數指定 SSL 伺服器憑證撤銷清單 (CRL) 的目錄名稱。如果這個目錄存在,嘗試驗證伺服器憑證時,將會拒絕目錄中檔案裡列出的憑證。
需要使用 OpenSSL 指令 openssl rehash
或 c_rehash
準備這個目錄。詳情請參閱其說明文件。
可以同時指定 sslcrl
和 sslcrldir
。
sslsni
#如果設定為 1(預設值),libpq 會在啟用 SSL 的連線上設定 TLS 擴充 “伺服器名稱指示” (SNI)。將此參數設定為 0 會將其關閉。
SSL 感知代理伺服器可以使用伺服器名稱指示,在不必解密 SSL 串流的情況下路由連線。(請注意,除非代理伺服器知道 PostgreSQL 通訊協定的信號交換,否則這需要將 sslnegotiation
設定為 direct
。)然而,SNI會使目標主機名稱以明文顯示在網路流量中,因此在某些情況下可能不希望這樣。
requirepeer
#此參數指定伺服器的作業系統使用者名稱,例如 requirepeer=postgres
。在使用 Unix 網域套接字連線時,如果設定此參數,客戶端會在連線開始時檢查伺服器程序是否以指定的使用者名稱執行;如果不是,連線將會中止並顯示錯誤。這個參數可用來提供伺服器驗證,類似於 TCP/IP 連線上使用 SSL 憑證所提供的驗證。(請注意,如果 Unix 網域套接字位於 /tmp
或其他可公開寫入的位置,任何使用者都可以在那裡啟動伺服器監聽。使用此參數可確保您連接到由受信任使用者執行的伺服器。)此選項僅在實作 peer
驗證方法的平台上受支援;請參閱第 20.9 節。
ssl_min_protocol_version
#此參數指定允許連線的最低 SSL/TLS 通訊協定版本。有效值為 TLSv1
、TLSv1.1
、TLSv1.2
和 TLSv1.3
。支援的通訊協定取決於所使用的 OpenSSL 版本,較舊版本不支援最新的通訊協定版本。如果未指定,預設值為 TLSv1.2
,這符合截至撰寫本文時的產業最佳實務。
ssl_max_protocol_version
#此參數指定允許連線的最高 SSL/TLS 通訊協定版本。有效值為 TLSv1
、TLSv1.1
、TLSv1.2
和 TLSv1.3
。支援的通訊協定取決於所使用的 OpenSSL 版本,較舊版本不支援最新的通訊協定版本。如果未設定,則忽略此參數,並且連線將使用後端定義的上限(如果有的話)。設定最高通訊協定版本主要用於測試,或者如果某些元件在使用較新通訊協定時遇到問題。
krbsrvname
#使用 GSSAPI 驗證時要使用的 Kerberos 服務名稱。這必須與伺服器組態中指定的服務名稱相符,Kerberos 驗證才能成功。(另請參閱第 20.6 節。)預設值通常為 postgres
,但在建置 PostgreSQL 時可以使用 configure 的 --with-krb-srvnam
選項進行變更。在大多數環境中,永遠不需要變更此參數。某些 Kerberos 實作可能需要不同的服務名稱,例如 Microsoft Active Directory,它要求服務名稱為大寫 (POSTGRES
)。
gsslib
#用於 GSSAPI 驗證的 GSS 程式庫。目前,除了包含 GSSAPI 和 SSPI 支援的 Windows 建置版本之外,此參數被忽略。在這種情況下,將此參數設定為 gssapi
可讓 libpq 使用 GSSAPI 程式庫進行驗證,而不是預設的 SSPI。
gssdelegation
#將 GSS 認證轉發(委派)到伺服器。預設值為 0
,表示認證不會轉發到伺服器。將此參數設定為 1
以在可能的情況下轉發認證。
service
#用於其他參數的服務名稱。它指定 pg_service.conf
中的服務名稱,該檔案包含其他連線參數。這允許應用程式僅指定服務名稱,以便集中維護連線參數。請參閱第 32.17 節。
target_session_attrs
#此選項決定連線是否必須具有某些屬性才能被接受。它通常與多個主機名稱結合使用,以在多個主機中選擇第一個可接受的替代方案。有六種模式
any
(預設)任何成功的連線都是可接受的
read-write
連線預設必須接受讀寫交易(也就是說,伺服器不能處於熱備份模式,並且 default_transaction_read_only
參數必須為 off
)
read-only
連線預設不得接受讀寫交易(反之亦然)
primary
伺服器不得處於熱備份模式
standby
伺服器必須處於熱備份模式
prefer-standby
首先嘗試尋找備用伺服器,但如果列出的主機都不是備用伺服器,則以 any
模式再次嘗試
load_balance_hosts
#控制用戶端嘗試連線到可用主機和位址的順序。一旦連線嘗試成功,就不會嘗試其他主機和位址。此參數通常與多個主機名稱或傳回多個 IP 的 DNS 記錄結合使用。此參數可以與 target_session_attrs 結合使用,例如,僅在備用伺服器上進行負載平衡。成功連線後,傳回連線上的後續查詢都將傳送到同一台伺服器。目前有兩種模式
disable
(預設)不執行跨主機的負載平衡。主機按照它們提供的順序進行嘗試,位址按照它們從 DNS 或主機檔案接收的順序進行嘗試。
random
主機和位址以隨機順序進行嘗試。此值在同時開啟多個連線時最有用,可能來自不同的機器。這樣,連線可以跨多個 PostgreSQL 伺服器進行負載平衡。
雖然隨機負載平衡由於其隨機性,幾乎永遠不會產生完全均勻的分佈,但統計上來說,它非常接近。這裡一個重要的面向是此演算法使用了兩個層級的隨機選擇:首先,主機會以隨機順序解析。然後,其次,在解析下一個主機之前,目前主機的所有已解析位址將以隨機順序嘗試。在某些情況下,這種行為可能會極大地扭曲每個節點獲得的連線數量,例如當某些主機解析出比其他主機更多的位址時。但這種扭曲也可以有目的地使用,例如,透過在主機字串中多次提供較大伺服器的主機名稱,來增加該伺服器獲得的連線數量。
當使用這個值時,建議同時為 connect_timeout 配置一個合理的值。 因為這樣,如果用於負載平衡的其中一個節點沒有回應,將會嘗試新的節點。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。