Restore

pg_ctl 掛在 ssh 上

  • July 17, 2019

我正在設計一個過程來測試我的 postgresql 10.8 備份,方法是將它們還原到一次性虛擬機中的隨機時間點。我一直無法完全自動化這個過程。我在官方文件的第 8 步(第 25.3.4 節)被阻止

  1. 啟動伺服器。

執行pg_ctl startover ssh 時,命令會掛起,直到它被殺死。如果我直接 ssh 到 VM 上並執行pg_ctl start,那麼命令會按預期快速返回。

2012 年的這個文章似乎描述了類似的場景。*然而,在我的情況下,*即使呼叫會話在掛起時被終止,postgres 程序也會成功啟動(雖然可能在 9.0.5 和 10.8 之間有所改進?)。

這個 github 問題似乎是相關的,但遺憾的是通過用我不知道的語言進行長時間的重寫來“解決”並最終得出結論,這是pg_ctl二進製文件中的一個錯誤。

大問題

如何自動執行第 8 步,以便繼續對備份媒體進行後續驗證測試?

這是我需要破解的二進製文件中的一個突出錯誤嗎?還是我錯過了一個明智的實施?

看起來pg_ctl需要一個真正的輸出終端,ssh當您簡單地要求它執行命令時,它不會被分配。根據Postgres 手冊

在類 Unix 系統上,預設情況下,伺服器的標準輸出和標準錯誤被發送到 pg_ctl 的標準輸出(不是標準錯誤)。然後 pg_ctl 的標準輸出應該被重定向到一個文件或通過管道傳送到另一個程序,例如像 rotatelogs 這樣的日誌輪換程序;否則postgres會將其輸出寫入控制終端(從後台),並且不會離開 shell 的程序組。

$$ … $$-l可以通過使用將伺服器的輸出附加到日誌文件來更改這些預設行為。建議使用其中一個-l或輸出重定向。

因此,您要麼需要告訴ssh分配終端以pg_ctl使用-t選項( ) ssh -t somehost "pg_ctl start"要麼告訴pg_ctl不要寫入終端(或)ssh somehost "pg_ctl start >/dev/null"``ssh somehost "pg_ctl start -l /tmp/start.log "

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