資料庫PostrageSQL 啟動資料庫伺服器

2021-10-09 11:20:25 字數 4985 閱讀 7754

在任何人可以訪問資料庫前,你必須啟動資料庫伺服器。 資料庫伺服器程式是postgres,它必須知道在**能找到它要用的資料。這是用-d選項實現的。 因此,啟動伺服器最簡單的方法是:

$ postgres -d /usr/local/pgsql/data
這將把伺服器放在前台執行。這個步驟同樣必須以postgresql使用者帳戶登入來操作。如果沒有-d選項,伺服器將嘗試使用環境變數pgdata命名的目錄。如果這個環境變數也沒有提供則導致失敗。

通常最好在後台啟動postgres。要這樣做,使用常用的 unix shell 語法:

$ postgres -d /usr/local/pgsql/data >logfile 2>&1 &

如上所示,把伺服器的stdout和stderr輸出儲存到某個地方是非常重要的。這將對審計目的和診斷問題有所幫助(更深入的有關日誌檔案處理的討論請見(section 24.3)。

postgres還接受其它一些命令列選項。更多的資訊請見postgres參考頁 和下面的chapter 19。這些 shell 語法很容易讓人覺得無聊。因此我們提供了包裝器程式pg_ctl以簡化一些任務。

例如:

pg_ctl start -l logfile
將在後台啟動伺服器並且把輸出放到指定的日誌檔案中。-d選項和postgres中的一樣。pg_ctl還可以用於停止伺服器。

通常,你會希望在計算機啟動的時候啟動資料庫伺服器。自動啟動指令碼是作業系統相關的。postgresql在contrib/start-scripts目錄中提供了幾種。安裝將需要 root 許可權。

不同的系統在引導時有不同的啟動守護程序的習慣。許多系統有乙個檔案/etc/rc.local或/etc/rc.d/rc.local。其他的使用init.d或rc.d目錄。不管你做什麼,伺服器必須由postgresql使用者賬戶而不是 root或任何其他使用者啟動。因此你可能應該在你的命令中使用su postgres -c '…'這種形式。例如:

su postgres -c 'pg_ctl start -d /usr/local/pgsql/data -l serverlog'
下面是一些更加與作業系統相關的建議(在每一種情況中要確保在我們展示通用值的地方使用正確的安裝目錄和使用者名稱).

if

[-x /usr/local/pgsql/bin/pg_ctl -a -x /usr/local/pgsql/bin/postgres ]

; then

su -l postgres -c '/usr/local/pgsql/bin/pg_ctl start -s -l /var/

postgresql/log -d /usr/local/pgsql/data'

echo -n ' postgresql'

fi

在使用systemd時,可以使用下面的服務單元檔案(例如/etc/

systemd/system/postgresql.service):

[unit]

description=postgresql database server

documentation=man:

postgres(1

)[service]

type=notify

user=postgres

execstart=

/usr/local/pgsql/bin/postgres -d /usr/local/pgsql/data

execreload=

/bin/kill -hup $mainpid

killmode=mixed

killsignal=sigint

timeoutsec=

0[install]

wantedby=multi-user.target

使用type=notify要求伺服器的二進位制檔案使用configure --with-systemd編譯。

要仔細地考慮超時設定。在寫作這份文件時,systemd的預設超時時長是 90 秒,並且將會殺死沒有在這段時間內報告準備好的程序。但是postgresql伺服器可能因為執行崩潰恢復而導致啟動過程大大超過這個預設時間。建議的值是 0 禁用超時邏輯。

su - postgres -c "/usr/local/pgsql/bin/pg_ctl start -l logfile -d /usr/local/pgsql/data"
然後在/etc/rc3.d中建立乙個符號鏈結s99postgresql指向它。

當伺服器在執行時,它的pid被儲存在資料目錄中的postmaster.pid檔案。這樣做 可以防止多個伺服器例項執行在同乙個資料目錄中,並且也可以被用來關閉伺服器。

有幾個常見的原因會導致伺服器啟動失敗。通過檢查伺服器日誌或使用手工啟動的方法(不做標準輸出或標準錯誤的重定向), 就可以看到出現什麼錯誤訊息。下面我們詳細地解釋一些最常見的錯誤訊息。

log: could not bind ipv4 address "127.0.0.1"

: address already in use

hint: is another postmaster already running on port 5432

? if not, wait a few

seconds and retry.

fatal: could not create any tcp/ip sockets

正如這個訊息所說的,這表示:你試圖在乙個已經有伺服器執行著的埠上再啟動另乙個伺服器。不過,如果核心錯誤訊息不是address already in use或其變體,那就有可能是別的問題。 例如,試圖在乙個被保留的埠上啟動伺服器會收到下面這樣的訊息:

$ postgres -p 666

log: could not bind ipv4 address "127.0.0.1"

: permission denied

hint: is another postmaster already running on port 666

? if not, wait a few

seconds and retry.

fatal: could not create any tcp/ip sockets

像這樣的訊息:

fatal: could not create shared memory segment: invalid argument

detail: failed system call was shmget

(key=

5440001

, size=

4011376640

,03600

).

可能意味著你的核心對共享記憶體區的限制小於postgresql試圖建立的工作區域(本例中是4011376640 位元組)。或者可能意味著根本就沒有 system-v 風格的共享記憶體支援被配置在你的核心中。作為一種臨時的解決方案, 你可以試著以小於正常數量的緩衝區(shared_buffers)啟動伺服器。 你最終還是會希望重新配置核心以增加共享記憶體允許的尺寸。 當你試圖在同一臺機器上啟動多個伺服器,並且它們所需的總空間超過了核心的限制,也會報這個錯。乙個這樣的錯誤:

fatal: could not create semaphores: no space left on device

detail: failed system call was semget

(5440126,17

,03600

).

並不意味著你已經用光了磁碟空間。它的意思是你的核心對system v訊號量的限制小於postgresql想建立的數量。和上面一樣,你可以通過減少允許的連線數(max_connections)來繞開這個限制,但最終你還是會希望提高核心的限制。

如果你收到乙個「illegal system call」錯誤, 那麼很有可能是你的核心根本不支援共享記憶體或者訊號量。這種情況下你唯一的選擇就是重新配置核心並且把這些特性開啟。關於配置system v ipc功能的細節請見section 18.4.1。

儘管可能在客戶端出現的錯誤情況範圍寬廣而且是應用相關的,但的確有幾種與伺服器的啟動方式直接相關。除了下面提到的幾種錯誤之外的問題都應該在相應的客戶端應用文件中。

psql: could not connect to server: connection refused

is the server running on host "server.joe.com" and accepting

tcp/ip connections on port 5432

?

這是常見的「i couldn』t find a server to talk to」失敗。上面的情況看起來是發生在嘗試 tcp/ip 通訊時。常見的錯誤是忘記把伺服器配置成允許 tcp/ip 連線。

另外,當試圖通過 unix 域套接字與本地伺服器通訊時,你會看到這個:

psql: could not connect to server: no such file or directory

is the server running locally and accepting

connections on unix domain socket "/tmp/.s.pgsql.5432"

?

最後一行可以驗證客戶端是不是嘗試連線到正確的位置。如果實際上沒有伺服器在那裡執行,典型的核心錯誤訊息將是connection refusedno such file or directory(值得注意的是這種環境中的connection refused並不表示伺服器得到了你的連線請求並拒絕了它。那種情況會產生乙個不同的訊息,如section 20.15中所示)。其它像connection timed out這樣的訊息可能表示更基礎的問題,如缺少網路連線。

資料庫PostrageSQL 架構

邏輯複製從拷貝發布者資料庫上的資料庫快照開始。拷貝一旦完成,發布者上的更改會在它們發生時實時傳送給訂閱者。訂閱者按照資料在發布者上被提交的順序應用資料,這樣任意單一訂閱中的publication的事務一致性才能得到保證。訂閱者資料庫上的應用程序總是將session replication role設...

資料庫PostrageSQL 鎖管理

deadlock timeout integer 這是進行死鎖檢測之前在乙個鎖上等待的總時間 以毫秒計 死鎖檢測相對昂貴,因此伺服器不會在每次等待鎖時都執行這個它。我們樂觀地假設在生產應用中死鎖是不常出現的,並且只在開始檢測死鎖之前等待一會兒。增加這個值就減少了浪費在無用的死鎖檢測上的時間,但是減慢...

資料庫PostrageSQL 預置選項

下列 引數 是唯讀的,它們是在編譯或安裝postgresql時決定的。同樣,它們被排除在postgresql.conf檔案例子之外。這些選項報告特定應用可能感興趣的多種postgresql行為,特別是管理前端相關的行為。block size integer 報告乙個磁碟塊的大小。它由編譯伺服器時bl...