?
This document uses PHP Chinese website manual Release
在任何人可以訪問數(shù)據(jù)庫前,你必須啟動數(shù)據(jù)庫服務(wù)器。 數(shù)據(jù)庫服務(wù)器程序?yàn)?tt class="COMMAND">postgres, 它必須知道在哪里能找到它要用的數(shù)據(jù)。這是利用-D選項(xiàng)實(shí)現(xiàn)的。 因此,啟動服務(wù)器最簡單的方法是像下面這樣:
$postgres-D/usr/local/pgsql/data
這樣將把服務(wù)器放在前臺運(yùn)行。這個步驟同樣必須以PostgreSQL 用戶帳戶登錄來做。沒有-D選項(xiàng),服務(wù)器將使用環(huán)境變量 PGDATA命名的目錄;如果這個環(huán)境變量也沒有,將導(dǎo)致失敗。
通常,最好在后臺啟動postgres,使用下面的shell語法
$postgres-D/usr/local/pgsql/data>logfile2>&1&
把服務(wù)器的stdout和stderr輸出 放到某個地方是非常重要的,就像在上面建議的這樣。 這樣做既可以幫助審查又可以幫助診斷問題。 參閱Section 23.3獲取有關(guān)日志文件處理的更完整討論。
postgres還接受一些其它的一些命令行選項(xiàng)。 更多的信息請參考postgres手冊頁 和下面的Chapter 18。
這些shell語法很容易讓人覺得無聊。因此我們提供了封裝 程序pg_ctl 以簡化一些任務(wù)。比如:
pg_ctlstart-llogfile
將在后臺啟動服務(wù)器并且把輸出放到指定的日志文件中。 -D選項(xiàng)和你直接運(yùn)行postgres 時的意思是一樣的。pg_ctl還可以用于關(guān)閉服務(wù)器。
通常,你會希望在計(jì)算機(jī)啟動的時候啟動數(shù)據(jù)庫服務(wù)器。 自動啟動腳本是特定操作系統(tǒng)的。PostgreSQL 自己帶了幾個,放在contrib/start-scripts目錄里。需要root權(quán)限安裝它們。
不同的系統(tǒng)在引導(dǎo)時有不同的啟動守護(hù)進(jìn)程的方法,所以我們建議你先熟悉它。 許多系統(tǒng)有名字稱為/etc/rc.local 或/etc/rc.d/rc.local這樣的文件, 其它的還有rc.d目錄。不管你怎么做, 都要記住服務(wù)器必須以PostgreSQL用戶帳戶, 而不是root或任何其它用戶身份運(yùn)行。 因此,你可能總是要用su-c'...'postgres這樣的命令。比如:
su-c'pg_ctlstart-D/usr/local/pgsql/data-lserverlog'postgres
下面是一些比較詳細(xì)的與操作系統(tǒng)相關(guān)的建議。 請注意把每個例子里的通用值替換成合適的安裝路徑和用戶名。
對于FreeBSD,看看PostgreSQL 源代碼版本里的contrib/start-scripts/freebsd文件。
在OpenBSD上, 把下面幾行加到/etc/rc.local文件里:
if[-x/usr/local/pgsql/bin/pg_ctl-a-x/usr/local/pgsql/bin/postgres];then su--c'/usr/local/pgsql/bin/pg_ctlstart-l/var/postgresql/log-s'postgres echo-n'postgresql' fi
在Linux系統(tǒng)里, 要么往/etc/rc.d/rc.local文件里添加下面幾行:
/usr/local/pgsql/bin/pg_ctlstart-llogfile-D/usr/local/pgsql/data
要么看看PostgreSQL源代碼樹里的contrib/start-scripts/linux文件。
在NetBSD上,你可以 根據(jù)愛好選擇FreeBSD或Linux 的啟動腳本之一。
在Solaris上,創(chuàng)建一個 /etc/init.d/postgresql的文件,包含下面行:
su-postgres-c"/usr/local/pgsql/bin/pg_ctlstart-llogfile-D/usr/local/pgsql/data"
然后在/etc/rc3.d里創(chuàng)建一個指向它的符號鏈接,名叫S99postgresql。
運(yùn)行的時候,它的PID是保存在數(shù)據(jù)目錄下的 postmaster.p id文件里的。這樣做 是為了避免多個服務(wù)器在同一個數(shù)據(jù)目錄內(nèi)運(yùn)行,此文件同樣可以用于關(guān)閉服務(wù)器。
有幾個常見的原因會導(dǎo)致服務(wù)器啟動失敗。 通過檢查服務(wù)器日志或使用手工啟動的方法(不做stdout和stderr的重定向), 就可以看到錯誤信息。下面我們更詳細(xì)地解釋了其中一些錯誤信息。
LOG:couldnotbindIPv4socket:Addressalreadyinuse HINT:Isanotherpostmasteralreadyrunningonport5432?Ifnot,waitafewsecondsandretry. FATAL:couldnotcreateTCP/IPlistensocket
就像它提示的那樣:你試圖在已經(jīng)有一個服務(wù)器運(yùn)行著的端口上再運(yùn)行了一個服務(wù)器。 不過,如果內(nèi)核的錯誤信息不是Address alreadyinuse或者是其它的變種,那就有可能是別的毛病。 比如,試圖在一個保留的端口上運(yùn)行服務(wù)器會收到下面這樣的信息:
$postgres-p666 LOG:couldnotbindIPv4socket:Permissiondenied HINT:Isanotherpostmasteralreadyrunningonport666?Ifnot,waitafewsecondsandretry. FATAL:couldnotcreateTCP/IPlistensocket
像這樣的信息:
FATAL:couldnotcreatesharedmemorysegment:Inval idargument DETAIL:Failedsystemcallwasshmget(key=5440001,size=4011376640,03600).
可能意味著內(nèi)核對共享內(nèi)存區(qū)的限制小于PostgreSQL 試圖分配的緩沖區(qū)大小(本例中是4011376640字節(jié))?;蛘呖赡芤馕吨愀? 就沒有配置System-V風(fēng)格的共享內(nèi)存支持。作為一個臨時的解決辦法, 你可以試著以小于正常數(shù)量的緩沖區(qū)數(shù)(shared_buffers)啟動服務(wù)器。 你最終還是會希望重新配置內(nèi)核,以增加共享內(nèi)存的尺寸。 如果你試圖在同一臺機(jī)器上啟動多個服務(wù)器,而且它們所需的總空間超過了內(nèi)核的限制, 也會報(bào)這個錯。
像下面這樣的錯誤:
FATAL:couldnotcreatesemaphores:Nospaceleftondevice DETAIL:Failedsystemcallwassemget(5440126,17,03600).
并不意味著著你已經(jīng)用光磁盤空間了。 它的意思是內(nèi)核的SystemV信號燈的限制小于PostgreSQL 想創(chuàng)建的數(shù)量。和上面一樣,你可以通過減少允許的連接數(shù)(max_connections) 來繞開,但最終你還是會希望修改內(nèi)核的限制。
如果你收到一個"illegalsystemcall"錯誤, 那么很有可能是內(nèi)核根本不支持共享內(nèi)存或者信號燈。如果是這樣的話, 你唯一的選擇就是重新配置內(nèi)核并且把這些特性打開。
關(guān)于配置系統(tǒng)SystemVIPC 資源的細(xì)節(jié)見Section 17.4.1。
盡管可能在客戶端出現(xiàn)的錯誤條件范圍寬廣,而且還和應(yīng)用相關(guān), 但的確有幾種錯誤與服務(wù)器的啟動方式直接相關(guān)。除了下面提到的幾種錯誤 以外的問題都應(yīng)該在相應(yīng)的客戶端應(yīng)用的文檔中。
psql:couldnotconnecttoserver:Connectionrefused Istheserverrunningonhost"server.joe.com"andaccepting TCP/IPconnectionsonport5432?
通常"Icouldn'tfindaservertotalkto"失敗。 當(dāng)試圖進(jìn)行TCP/IP通訊時它看起來像上面的樣子。 常見的錯誤是忘記把服務(wù)器配置成允許TCP/IP連接。
另外,當(dāng)試圖通過一個Unix套接字與本機(jī)服務(wù)器通訊時,你會看到這個:
psql:couldnotconnecttoserver:Nosuchfileordirectory Istheserverrunninglocallyandaccepting connectionsonUnixdomainsocket"/tmp/.s.PGSQL.5432"?
最后一行可以有效地驗(yàn)證客戶端進(jìn)行連接嘗試時是否連對了位置。 如果實(shí)際上沒有服務(wù)器在那里運(yùn)行,典型的內(nèi)核錯誤是像上面顯示的那樣 或者是Connectionrefused或 Nosuchfileordirectory。 尤其要注意的是這種環(huán)境下Connectionrefused 的信息顯示并不意味著服務(wù)器收到連接然后拒絕了連接。那 樣的話會產(chǎn)生一個不同的信息(像Section 19.4里面顯示的那樣)。 其它像Connectiontimedout 這樣的信息表示更基本的問題,比如缺少網(wǎng)絡(luò)連接等。