Postgresql
如何防止更改我的 PostgreSQL 數據庫?
我的步驟:
pg_dumpall
在伺服器上執行決賽prod-server-old
- 永遠關閉
prod-server-old
。- 將輸出複製到不同的伺服器 (
prod-server-new
)- 在那裡恢復數據庫。
- 所有流量都到
prod-server-new
現在如何避免在
pg_dumpall
(step1和step2之間)對數據庫進行修改,使這段時間的修改不會失去?在我的情況下,有一小段停機時間是 100% 可以的。
“集群”中有幾個數據庫(順便說一句,我不喜歡“集群”這個詞。我想大多數人認為“集群”是一組多台電腦,但在這種情況下它意味著一個 Postgres 伺服器,它擁有幾個數據庫)。
我的問題被標記為可能與“使 Postgres 數據庫暫時只讀(用於執行卷快照)”重複。我不認為它是重複的,因為在我的情況下是不同的,因為我不要求臨時只讀狀態。
一種解決方法:
更改 PostgreSQL 的埠
prod-server-old
。這樣,客戶端不太可能在pg_dumpall --port=OTHER_PORT
.
有兩種方法可以做到這一點:
- 如果您不介意停機時間(簡單方法):
撤銷對該組的
connect
特權public
。這將阻止除超級使用者之外的所有人進行連接。然後重新啟動伺服器或終止所有連接,然後使用超級使用者帳戶繼續備份。REVOKE CONNECT TO DATABASE (database) FROM public
- 如果您確實介意停機時間:
將您的數據庫置於只讀模式:
ALTER DATABASE (database) SET default_transaction_read_only = true;
繼續
pg_dumpall
。無需重新啟動,也無需停機。當然,您必須在要“鎖定”的每個數據庫上重複此操作。如果您有大量數據庫,您可以將整個集群設為只讀:
default_transaction_read_only = on;
在您的 postgresql.conf 中設置,然後重新載入 postgres 服務。請注意,我沒有測試任何這些命令,風險自負。