Postgresql

如何等待 PostgreSQL 可啟動/可恢復?

  • October 23, 2012

我正在執行自定義 Linux 發行版的虛擬機上測試 PostgreSQL 8.2.1 到 9.2 的升級。升級過程如下:

  1. 啟動pg服務
  2. 清理所有數據庫(不確定是否需要)
  3. 備份與pg_dumpall
  4. 停止pg服務
  5. 移開儲存數據的目錄(/var/pg這是一個簡單的單伺服器設置)
  6. 安裝 PostgreSQL 9.2
  7. initdb
  8. 啟動伺服器
  9. 恢復轉儲的數據
  10. reindexdb所有數據庫
  11. 重新創建referential_constraints視圖
  12. 清理所有數據庫(此升級後需要 AFAIK)

此過程在一台主機上執行良好,備份和恢復都沒有問題。sleep 1在另一台具有不同數據庫點 1 到 7 的機器上工作正常,但除非我添加after ,否則伺服器不會啟動initdb,即使這樣,由於“數據庫系統正在啟動”,轉儲的數據也無法恢復。除了這些可怕的黑客攻擊之外,處理這個問題的標準方法是什麼:

  1. sleep荷蘭國際集團在任一操作之前的一些慷慨的時間,
  2. 循環直到它工作或直到達到一個慷慨的超時,或者
  3. 循環直到它接受一個簡單的查詢或達到超時。

編輯:“解決方案”畢竟沒有奏效。如何確保數據庫已準備好執行還原?

initdb 在完成之前不會返回,因此在它和伺服器啟動之間不需要任何暫停。PostgreSQL 中存在一些錯誤,儘管它在沒有先將所有內容刷新到磁碟的情況下完成。我現在不知道還有什麼,但錯誤的本質是你並不總是知道它們。

如果您使用pg_ctl命令啟動數據庫,請使用“-w”參數等待啟動完成後再返回。它沒有做任何花哨的事情——它只是做“它準備好了嗎?” 為你循環。

請注意,如果您在伺服器啟動之前遇到大量數據需要重播的伺服器崩潰,則 pg_ctl 等待上的“-t”設置的超時可能太低。

在對它們進行 pg_dump 之前,沒有理由對源數據庫進行 VACUUM。雖然它可能會加快轉儲速度,但真空本身需要的時間比改進要長。

在職的破壞的解決方案是修改初始化腳本以反複檢查相關埠是否正在使用中。如果一分鐘後沒有出現,則認為啟動失敗。虛擬碼:

start() {
   pg start
   checks=0
   while checks < 30:
       return true if the port is in use
       sleep 2
       checks++
   return false
}

編輯:事實證明這還不夠。還原步驟:

PGOPTIONS='--client-min-messages=warning' psql \
   --no-psqlrc \
   --variable=ON_ERROR_STOP=1 \
   --quiet \
   --log-file="$restore_log" \
   --single-transaction \
   --username postgres \
   --file="$sql_backup"

錯誤資訊:

psql: FATAL:  the database system is starting up

引用自:https://dba.stackexchange.com/questions/27033