PostgreSQL postgres

2021-09-13 17:59 更新

postgres — PostgreSQL數(shù)據(jù)庫服務(wù)器

大綱

postgres [選項...]

描述

postgresPostgreSQL數(shù)據(jù)庫服務(wù)器。一個客戶端應(yīng)用為了能訪問一個數(shù)據(jù)庫,它會(通過一個網(wǎng)絡(luò)或者本地)連接到一個運行著的postgres實例。該postgres實例接著會開始一個獨立的服務(wù)器進程來處理該連接。

一個postgres實例總是管理正好一個數(shù)據(jù)庫集簇的數(shù)據(jù)。一個數(shù)據(jù)庫集簇是一個數(shù)據(jù)庫的集合,它們被存儲在一個共同的文件系統(tǒng)位置(數(shù)據(jù)區(qū))上。 一個系統(tǒng)上可以同時運行多個postgres實例,只要它們使用不同的數(shù)據(jù)區(qū)和不同的通信端口(見下文)。postgres啟動時需要知道數(shù)據(jù)區(qū)的位置,該位置必須通過 -D選項或PGDATA環(huán)境變量指定,對此是沒有默認值的。通常,-DPGDATA會直接指向由initdb創(chuàng)建的數(shù)據(jù)區(qū)目錄。其他可能的文件布局在 第 19.2 節(jié)中討論。

默認情況下,postgres會在前臺啟動并將日志消息打印到標準錯誤流。但在實際應(yīng)用中,postgres應(yīng)當作為一個后臺進程啟動,而且多數(shù)是在系統(tǒng)啟動時自動啟動。

postgres還能在單用戶模式中被調(diào)用。這種模式的主要用途是在啟動過程中由initdb使用。有時候它也被用于調(diào)試或者災(zāi)難性恢復(fù)。注意,運行一個單用戶模式服務(wù)器并不真地適合調(diào)試服務(wù)器,因為不會發(fā)生實際的進程間通信和鎖定。當從 shell 中調(diào)用單用戶模式時,用戶可以輸入查詢并且結(jié)果會被以一種更適合開發(fā)者閱讀(不適合普通用戶)的形式打印在屏幕上。在單用戶模式中,會話用戶將被設(shè)置為 ID 為 1 的用戶,并且這個用戶會被隱式地賦予超級用戶權(quán)限。該用戶不必實際存在,因此單用戶模式運行可以被用來對某些意外損壞的系統(tǒng)目錄進行手工恢復(fù)。

選項

postgres接受下列命令行參數(shù)。關(guān)于這些選項的詳細討論請參考第 19 章。你也可以通過設(shè)置一個配置文件來減少鍵入大部分這些選項。有些(安全)選項還可以從連接的客戶端以一種與應(yīng)用相關(guān)只應(yīng)用于會話的方法設(shè)置。例如,如果設(shè)置了PGOPTIONS環(huán)境變量,那么基于 libpq的客戶端將都把那個字符串傳遞給服務(wù)器,它將被服務(wù)器解釋成postgres命令行選項。

通用選項

-B nbuffers

設(shè)置被服務(wù)器進程使用的共享內(nèi)存緩沖區(qū)數(shù)量。這個參數(shù)的默認值是initdb自動選擇的。指定這個選項等效于設(shè)置shared_buffers配置參數(shù)。

-c name=value

設(shè)置一個命名的運行時參數(shù)。PostgreSQL支持的配置參數(shù)在第 19 章中描述。大多數(shù)其它命令行選項實際上都是這種參數(shù)賦值的短形式。-c可以出現(xiàn)多次用于設(shè)置多個參數(shù)。

-C name

打印命名運行時參數(shù)的值,并且退出(詳見上面的-c選項)。這可以被用在一個運行服務(wù)器上,并且從postgresql.conf中返回值,這些值可能被在這次調(diào)用中的任何參數(shù)修改過。它并不反映集簇啟動時提供的參數(shù)。

這個選項用于與一個服務(wù)器實例交互的其他程序來查詢配置參數(shù)值,例如pg_ctl。面向用戶的應(yīng)用應(yīng)該使用SHOW或者 pg_settings視圖。

-d debug-level

設(shè)置調(diào)試級別。數(shù)值設(shè)置得越高,寫到服務(wù)器日志的調(diào)試輸出就越多。取值范圍是從 1 到 5。還可以針對某個特定會話使用-d 0來阻止父postgres進程的服務(wù)器日志級別被傳播到這個會話。

-D datadir

指定數(shù)據(jù)庫配置文件的文件系統(tǒng)位置。詳見第 19.2 節(jié)。

-e

把默認日期風(fēng)格設(shè)置為European,也就是輸入日期域的順序是DMY。這也導(dǎo)致在一些日期輸出格式中把日打印在月之前。詳見第 8.5 節(jié)。

-F

禁用fsync調(diào)用以提高性能,但是要冒系統(tǒng)崩潰時數(shù)據(jù)損壞的風(fēng)險。指定這個選項等效于禁用fsync配置參數(shù)。在使用之前閱讀詳細文檔!

-h hostname

指定postgres監(jiān)聽來自客戶端應(yīng)用 TCP/IP 連接的 IP 主機名或地址。該值也可以是一個用逗號分隔的地址列表,或者*表示監(jiān)聽所有可用的地址。一個空值表示不監(jiān)聽任何 IP 地址,在這種情況下可以使用 Unix 域套接字連接到服務(wù)器。缺省只監(jiān)聽localhost。聲明這個選項等效于設(shè)置listen_addresses配置參數(shù)。默認只監(jiān)聽localhost。指定這個選項等效于設(shè)置 listen_addresses配置參數(shù)。

-i

允許遠程客戶端使用 TCP/IP (互聯(lián)網(wǎng)域)連接。沒有這個選項,將只接受本地連接。這個選項等效于在postgresql.conf中或者通過-h選項將listen_addresses設(shè)為*

這個選項已經(jīng)被廢棄,因為它不允許訪問listen_addresses的完整功能。所以最好直接設(shè)置listen_addresses。

-k directory

指定postgres用來監(jiān)聽來自客戶端應(yīng)用連接的 Unix 域套接字的目錄。這個值也可以是一個逗號分隔的目錄列表。一個空值指定不監(jiān)聽任何 Unix 域套接字,在這種情況下只能用 TCP/IP 套接字來連接到服務(wù)器。默認值通常是/tmp,但是可以在編譯的時候修改。指定這個選項等效于設(shè)置unix_socket_directories配置參數(shù)。

-l

啟用使用SSL的安全連接。要使這個選項可用,編譯PostgreSQL時必須打開SSL支持。有關(guān)使用SSL的更多信息,請參考第 18.9 節(jié)。

-N max-connections

設(shè)置該服務(wù)器將接受的最大客戶端連接數(shù)。該參數(shù)的默認值由initdb自動選擇。指定這個選項等效于設(shè)置max_connections配置參數(shù)。

-o extra-options

extra-options中指定的命令行風(fēng)格的參數(shù)會被傳遞給所有由這個postgres進程派生的服務(wù)進程。

extra-options中的空格被視作 參數(shù)分隔符,除非用反斜線(\)轉(zhuǎn)義。要表示一個字面意 義上的反斜線,可以寫成\\。通過多次使用-o 也可以指定多個參數(shù)。

這個選項的使用已經(jīng)被廢棄。用于服務(wù)器進程的所有命令行選項可以在postgres命令行上直接指定。

-p port

指定postgres用于監(jiān)聽客戶端應(yīng)用連接的 TCP/IP 端口或本地 Unix 域套接字文件擴展。默認為PGPORT環(huán)境變量的值。如果PGPORT沒有設(shè)置,那么默認值是編譯期間設(shè)立的值(通常是 5432)。如果你指定了一個非默認端口,那么所有客戶端應(yīng)用都必須用命令行選項或者PGPORT指定同一個端口。

-s

在每條命令結(jié)束時打印時間信息和其它統(tǒng)計信息。這個選項對測試基準和調(diào)節(jié)緩沖區(qū)數(shù)量有用處。

-S work-mem

指定在使用臨時磁盤文件之前排序和散列表使用的基本內(nèi)存量。 請參閱 第 19.4.1 節(jié)work_mem 配置參數(shù)的說明。

-V
--version

打印postgres版本并退出。

--name=value

設(shè)置一個命名的運行時參數(shù);其縮寫形式是-c

--describe-config

這個選項會用制表符分隔的COPY格式導(dǎo)出服務(wù)器的內(nèi)部配置變量、描述以及默認值。設(shè)計它的目的是用于管理工具。

-?
--help

顯示有關(guān)postgres的命令行參數(shù),并且退出。

半內(nèi)部選項

這里描述的選項主要被用于調(diào)試目的,并且在某些情況下可以協(xié)助恢復(fù)嚴重受損的數(shù)據(jù)庫。在生產(chǎn)數(shù)據(jù)庫環(huán)境中應(yīng)該不會去使用它們。在這里列舉它們只是為了讓PostgreSQL系統(tǒng)開發(fā)者使用。此外,這些選項可能在將來的版本中更改或刪除而不另行通知。

-f { s | i | o | b | t | n | m | h }

禁止某種掃描和連接方法的使用:si分別禁用順序和索引掃描, o、bt分別禁用只用索引掃描、位圖索引掃描以及 TID 掃描,而n、mh則分別禁用嵌套循環(huán)、歸并和哈希連接。

順序掃描和嵌套循環(huán)連接都不可能完全被禁用。-fs-fn選項僅僅是在有其他選擇時不鼓勵優(yōu)化器使用這些計劃類型。

-n

該選項主要用于調(diào)試導(dǎo)致服務(wù)器進程異常崩潰的問題。對付這種情況的一般策略是通知所有其它服務(wù)器進程,讓它們終止并且接著重新初始化共享內(nèi)存和信號量。這是因為一個錯誤的服務(wù)器進程可能在終止之前就已經(jīng)對共享狀態(tài)造成了破壞。該選項指定postgres將不會重新初始化共享數(shù)據(jù)結(jié)構(gòu)。一個有經(jīng)驗的系統(tǒng)程序員這時就可以使用調(diào)試器檢查共享內(nèi)存和信號量狀態(tài)。

-O

允許修改系統(tǒng)表的結(jié)構(gòu)。這個選項用于initdb

-P

讀取系統(tǒng)表時忽略系統(tǒng)索引(但在更改系統(tǒng)表時仍然更新索引)。這在從損壞的系統(tǒng)索引中恢復(fù)時有用。

-t pa[rser] | pl[anner] | e[xecutor]

打印與每個主要系統(tǒng)模塊相關(guān)的查詢的時間統(tǒng)計。這個選項不能和-s選項一起使用。

-T

該選項主要用于調(diào)試導(dǎo)致服務(wù)器進程異常崩潰的問題。對付這種情況的一般策略是通知所有其它服務(wù)器進程,讓它們終止并且接著重新初始化共享內(nèi)存和信號量。這是因為一個錯誤的服務(wù)器進程可能在終止之前就已經(jīng)對共享狀態(tài)造成了破壞。該選項指定postgres將通過發(fā)送SIGSTOP信號停止其他所有服務(wù)器進程,但是并不讓它們終止。這樣就允許系統(tǒng)程序員手動從所有服務(wù)器進程收集內(nèi)核轉(zhuǎn)儲。

-v protocol

聲明這次會話使用的前/后服務(wù)器協(xié)議的版本數(shù)。該選項僅在內(nèi)部使用。

-W seconds

在一個新服務(wù)器進程被啟動時,它實施認證過程之后會延遲這個選項所設(shè)置的秒數(shù)。這就留出了機會來用一個調(diào)試器附著在服務(wù)器進程上。

用于單用戶模式的選項

下面的選項僅適用于單用戶模式(見單用戶模式)。

--single

選擇單用戶模式。這必須是命令行中的第一個選項。

database

指定要訪問的數(shù)據(jù)庫的名稱。這必須是命令行中的最后一個參數(shù)。如果省略它,則默認為用戶名。

-E

在執(zhí)行命令之前回顯所有命令到標準輸出。

-j

使用跟著兩個新行的分號而不是僅用新行作為命令終止符。

-r filename

將所有服務(wù)器日志輸出發(fā)送到filename中。 只有在作為一個命令行選項提供時,這個選項才會兌現(xiàn)。

環(huán)境

PGCLIENTENCODING

客戶端使用的默認字符編碼(客戶端可以獨立地覆蓋它)。這個值也可以在配置文件中設(shè)置。

PGDATA

默認的數(shù)據(jù)目錄位置。

PGDATESTYLE

DateStyle運行時參數(shù)的默認值(這個環(huán)境變量的使用已被廢棄)。

PGPORT

默認端口號(在配置文件中設(shè)置更好)

診斷

一個提到了semgetshmget的錯誤消息可能意味著你需要配置內(nèi)核來提供足夠的共享內(nèi)存和信號量。更多討論請見第 18.4 節(jié)。你也可以通過降低shared_buffers值減少 PostgreSQL的共享內(nèi)存消耗, 或者降低max_connections值減少信號量消耗,這樣可以推遲對內(nèi)核的重新配置。

如果一個消息說另外一個服務(wù)器已經(jīng)在運行,應(yīng)該仔細地檢查,例如根據(jù)你的系統(tǒng)可以用命令

$ ps ax | grep postgres

$ ps -ef | grep postgres

如果你確信沒有沖突的服務(wù)器正在運行,那么你可以刪除消息中提到的鎖文件然后再次嘗試。

如果一個失敗消息指示它無法綁定到一個端口,可能意味著該端口已經(jīng)被某些非PostgreSQL進程所使用。如果你終止postgres并且立即使用相同的端口重啟它,你也可能會得到這種錯誤。在這種情況系,你必須等待幾秒直到操作系統(tǒng)關(guān)閉該端口,然后再重試。最后,如果你指定了一個操作系統(tǒng)認為需要保留的端口號,你可能也會得到這個錯誤。例如,很多版本的 Unix 認為低于 1024 的端口號是 可信的并且只允許 Unix 超級用戶訪問它們。

注解

實用命令pg_ctl可以用來安全方便地啟動和關(guān)閉postgres服務(wù)器。

只要有可能,就不要使用SIGKILL殺死主postgres服務(wù)器。這樣會阻止postgres在終止前釋放它持有的系統(tǒng)資源(例如共享內(nèi)存和信號量)。這樣可能會導(dǎo)致啟動新的postgres進程時出現(xiàn)問題。

要正常地終止postgres服務(wù)器,可以使用SIGTERMSIGINT或者SIGQUIT信號。第一個在退出前將等待所有客戶端終止,第二個將強行斷開所有客戶端的連接,第三個會不做正確的關(guān)閉立即退出并且會導(dǎo)致重啟時的恢復(fù)。

SIGHUP信號會重新加載服務(wù)器配置文件。也可以向一個單獨的服務(wù)器進程發(fā)送SIGHUP信號,但是這樣做通常沒什么意義。

要取消一個正在運行的查詢,可以向運行該查詢的進程發(fā)送SIGINT信號。要干凈地終止一個后端進程,可向它發(fā)送SIGTERM。在 SQL 中可調(diào)用的與這兩種動作等效的命令可參考第 9.27.2 節(jié)中的 pg_cancel_backendpg_terminate_backend。

postgres服務(wù)器使用SIGQUIT來告訴子服務(wù)器進程終止但不做正常的清理。該信號不應(yīng)該被用戶使用。向一個服務(wù)器進程發(fā)送SIGKILL也是不明智的 — 主postgres進程將把這解釋為一次崩潰,并且作為其標準崩潰恢復(fù)過程的一部分,它將強制所有的后代進程退出。

缺陷

--選項在FreeBSDOpenBSD上無法運行,應(yīng)該使用-c。這在受影響的系統(tǒng)里是個缺陷; 如果這個缺陷沒有被修復(fù),將來的PostgreSQL版本將提供一種解決方案。

單用戶模式

要啟動一個單用戶模式的服務(wù)器,使用這樣的命令

postgres --single -D /usr/local/pgsql/data other-options my_database

-D給服務(wù)器提供正確的數(shù)據(jù)庫目錄的路徑,或者確保環(huán)境變量PGDATA被設(shè)置。同時還要指定你想在其中工作的特定數(shù)據(jù)庫的名字。

通常,單用戶模式的服務(wù)器會把換行符當做命令輸入的終止符。它不明白分號的作用,因為那屬于psql。要想把一個命令分成多行,必須在最后一個換行符以外的每個換行符前面敲一個反斜線。這個反斜線和旁邊的新行都會被從輸入命令中去掉。注意即使在字符串或者注釋中也會這樣做。

但是如果使用了-j命令行選項,那么單個新行將不會終止命令輸入。相反,分號-新行-新行的序列才會終止命令輸入。也就是說,輸入一個緊跟著空行的分號。在這種模式下,反斜線-新行不會被特殊對待。此外,在字符串或者注釋內(nèi)的這類序列也不會被特殊對待。

不管在哪一種輸入模式中,如果輸入的一個分號不是正好在命令終止符之前或者不是命令終止符的一部分,它會被認為是一個命令分隔符。當真正輸入一個命令終止符時,已經(jīng)輸入的多個語句將被作為一個單個事務(wù)執(zhí)行。

要退出會話,輸入EOF(通常是Control+D)。如果從上一個命令終止符以來已經(jīng)輸入了任何文本,那么EOF將被當作命令終止符,并且如果要退出則需要另一個EOF

請注意單用戶模式的服務(wù)器不會提供復(fù)雜的行編輯特性(例如沒有命令歷史)。但用戶模式也不會做任何后臺處理,例如自動檢查點或者復(fù)制。

例子

要用默認值在后臺啟動postgres

$ nohup postgres >logfile 2>&1 </dev/null &

要用指定端口啟動postgres,例如 1234:

$ postgres -p 1234

要使用psql連接到這個服務(wù)器,用 -p 選項指定這個端口:

$ psql -p 1234

或者設(shè)置環(huán)境變量PGPORT

$ export PGPORT=1234
$ psql

命名運行時參數(shù)可以用這些形式之一設(shè)置:

$ postgres -c work_mem=1234
$ postgres --work-mem=1234

兩種形式都覆蓋postgresql.conf中可能存在的work_mem設(shè)置。請注意在參數(shù)名中的下劃線在命令行可以寫成下劃線或連字符。除了用于短期的實驗外,更好的習(xí)慣是編輯postgresql.conf中的設(shè)置, 而不是倚賴命令行開關(guān)來設(shè)置參數(shù)。

參見

initdb, pg_ctl


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號