PostgreSQL7.0手冊-用戶手冊-21. 系統應用 - postmaster
2019-09-08 23:33:57
供稿:網友
postmaster
名稱
postmaster ― 運行 Postgres 多用戶后端
語法
postmaster [ -B nBuffers ] [ -D DataDir ] [ -N maxBackends ] [ -S ]
[ -d DebugLevel ] [ -i ] [ -l ]
[ -o BackendOptions ] [ -p port ] [ -n | -s ]
輸入
postmaster 接受下列命令行參數:
-B nBuffers
postmaster 為它啟動的后端進程分配和管理的共享內存緩沖區數量。此值缺省為 64 個緩沖區,每個緩沖區是 8k 字節(或者 config.h 里設置的 BLCKSZ 大?。??!?
-D DataDir
聲明用做數據庫目錄樹的根的目錄。如果沒有給出 -D,缺省目錄名是環境變量 PGDATA 的值。如果沒有設置 PGDATA,那么使用的目錄是 $POSTGRESHOME/data。如果兩個環境變量和命令行選項都沒有給出,用的缺省目錄是編譯時設置的?!?
-N maxBackends
此 postmaster 允許啟動的后端服務器的最大數目。缺省配置時,該值為 32,如果你的系統能支持更多進程,該值最大可以設置為 1024。缺省值和最大值都可以在制作 Postgres 時修改(參閱 src/include/config.h)?!?
-S
指明 postmaster 進程將以安靜模式啟動。也就是說,它將與用戶的(控制)tty 脫離并且啟動其自身的進程組。這個選項不應和調試選項結合使用,因為向標準輸出和標準錯誤打印的任何信息都被丟棄?!?
請注意使用這個開關會令除錯非常困難,因為通常由這個 postmaster 和它生成的后代產生的跟蹤和日志信息都將被丟棄.
-d DebugLevel
決定后端服務器將產生的調試信息輸出的數量。如果 DebugLevel 是一,將跟蹤所有聯接動作,而對其它的一律忽略。對于級別二或更高,后端進程的調試被打開并且 postmaster 顯示更多信息,包括后端環境和處理動作。注意如果沒有給后端服務器聲明他們的調試輸出指向的文件,則輸出會出現在它們的父postmaster 的控制 tty 上?!?
-i
這個選項打開 TCP/IP 或者網際域套接字通訊。沒有這個選項,只能進行本地 Unix 域套接字通訊?!?
-l
這個選項打開 SSL 套接字通訊。同樣還需要 -i 選項。要使用這個選項,編譯時你必須打開了 SSL 選項?!?
-o BackendOptions
在 BackendOptions 里聲明的 postgres 選項都傳遞給所有由這個 postmaster 啟動的后端服務進程。如果選項字串包含任何空白,整個字串必須引起來?!?
-p port
聲明 postmaster 偵聽著等待連接的互聯網 TCP/IP 端口或一個本地 Unix 域套接字文件擴展(描述符).缺省的端口號是環境變量 PGPORT 的值。如果沒有設置 PGPORT,缺省是 Postgres 編譯時建立的值(通常是 5432)。如果你聲明了一個非缺省端口,那么所有前端應用(包括psql)都必須用命令行選項或者 PGPORT 聲明同一個端口?!?
還有幾個命令行選項用于在后端非正常退出時進行調試。這些選項用于在這種情況下控制postmaster,而且沒有一個選項是為了用于正常操作的?!?
用于這種狀況的一般策略是通知所有其它后端必須退出,然后重新初始化共享內存和信號燈。這是因為一個出錯的后端在退出前可能已經破壞了一些共享的狀態?!?
這些特殊選項是:
-n
postmaster 將不會重新初始化共享數據結構。一個有經驗的系統程序員這時就可以使用shmemdoc 程序檢查共享內存和信號燈狀態?!?
-s
postmaster 將通過發送信號 SIGSTOP 停止所有其他后端進程,但不會導致它們退出。這樣就允許系統程序員手工從所有后端進程收集傾倒的核心(core dumps)。
輸出
semget: No space left on device
如果你看到這條信息,你應該運行 ipcclean 命令。干完這個之后,試著重新啟動 postmaster。如果還不行,你可能需要按照安裝指導里描述的那樣配置你的內核的共享內存和信號燈。如果你在一臺主機上運行多個postmaster 實例,或者如果你的內核的共享內存和/或信號燈被限制得很小,你可能要重新配置你的內核以增加共享內存和信號燈參數?!?
小技巧:你也可以通過降低 -B 的參數以減少 Postgres 的共享內存的消耗,或者降低 -N 的參數減少 Postgres 的信號燈的消耗,以此可以推遲重新配置內核。
StreamServerPort: cannot bind to port
如果看到這樣的信息,你應該確保沒有其他的postmaster 進程正在運行。判斷這個情況的最簡單的辦法是使用命令
% ps -ax | grep postmaster
(這是在 BSD 類型的系統上),或者
% ps -e | grep postmast
(這是在 System V 類型或者 POSIX 兼容的系統象 HP-UX 上)?!?
如果你確信沒有其他 postmaster 進程在運行但是你還是收到這個錯誤信息,試著用 -p 選項聲明一個不同的端口。如果你終止 postmaster 后又馬上用同一個端口運行它,你也有可能得到這個錯誤信息;這時,你必須多等幾秒,等操作系統關閉了該端口后再試。最后如果你使用了一個操作系統認為是保留的端口,也可能導致這個錯誤信息。例如,我的 Unix 版本認為低于 1024 的端口號是可信任的因而只有 Unix 超級用戶可以使用它們?!?
IpcMemoryAttach: shmat() failed: Permission denied
一個可能的解釋是另外一個用戶企圖在同一端口上運行一個postmaster 進程,該進程請求共享資源然后退出。因為 Postgres 的共享內存鍵是以賦予 postmaster 的端口號為基礎的,因此在同一臺主機上有好幾個安裝的話很有可能沖突。如果當前沒有其他postmaster 進程正在運行(見上面),運行 ipcclean 然后再嘗試一下。如果其他 postmaster 鏡象正在運行,你就不得不與那些進程的所有者協調端口號的分配和/或刪除未用的共享內存段?!?
描述
postmaster 管理前端和后端進程之間的通訊,還負責分配共享緩沖池和 SysV 信號燈(在沒有測試和設置指令的機器上)。postmaster 本身并不與用戶交互并且應該作為一個后臺進程啟動?!?
每個 Postgres 安裝每次應該只啟動一個 postmaster。這里,一個安裝意味著一個數據庫目錄和postmaster 端口號。你可以在一臺機器上運行多于一個 postmaster,前提是每個有不同的目錄和端口號。
注意
如果有可能,不要使用 SIGKILL 殺死 postmaster。而應該使用 SIGHUP,SIGINT 或 SIGTERM?。╧ill(1)的缺省信號)。用
% kill -KILL
或者其可選形式
% kill -9
會阻止 postmaster 在退出前釋放它持有的系統資源(例如共享內存和信號燈)。這樣就無法讓你免于處理上面描述的共享內存的問題?!?
處理共享內存問題的有用的工具包括 ipcs(1),ipcrm(1),和ipcclean(1)?!?
用法
用缺省值啟動 postmaster 鍵入:
% nohup postmaster >logfile 2>&1 &
這條命令將在缺省端口(5432)啟動 postmaster。這是最簡單和最常用的啟動postmaster 的方法。
要在指定的端口啟動 postmaster?。骸?
% nohup postmaster -p 1234 &
這條命令將啟動通過端口1234通訊的 postmaster。為了用 psql 與這個 postmaster 聯接,你需要這樣運行(psql):
% psql -p 1234
或者設置環境變量 PGPORT:
% setenv PGPORT 1234
% psql