2015-08-26 127 views
0

在兩臺不連接的計算機上有2臺postgresql服務器。
每臺服務器都擁有一個具有相同模式的數據庫。
我希望其中一臺服務器成爲主服務器:該服務器應該存儲在兩個數據庫上插入的所有數據。
爲此,我想定期(例如每天)將數據從一個數據庫導入第二個數據庫。 這意味着,我應該能夠:在未連接的兩臺服務器之間複製數據

  1. 「轉儲」到文件(S),因爲一個給定的日期已經被存儲在第一數據庫中的所有數據。

  2. 導入導出的數據我還沒有看到來自pg_dump/pg_restore的命令,任何時間/日期選項的第二個數據庫


那我該怎麼做?

注意:數據被插入到數據庫中並且從未更新過。

+1

你需要的是postgresql複製http://www.postgresql.org/docs/9.3/static/high-availability.html和這個問題是這個網站的主題。 – e4c5

回答

0

我在pg_dump/pg_restore命令中沒有看到任何時間/日期選項。

沒有任何的,你不能這樣做的。您必須轉儲並恢復整個數據庫。

替代品有:

  • 使用WAL基於陣列的複製。讓主人使用archive_command將WAL寫入歸檔位置。如果要同步,請將所有新的WAL從主設備複製到副本,副本必須作爲主設備的pg_basebackup,並且必須具有合適的recovery.conf。複製品將重放主人的WAL以獲取所有主人最近的更改。

  • 使用基於自定義觸發器的系統記錄對日誌表的所有更改。 COPY將這些日誌表複製到外部文件,然後將它們複製到副本。使用自定義腳本將日誌表更改記錄應用於主表。

  • 將時間戳列添加到所有表中。記錄上次同步更改的時間。爲每個表做一個\COPY (SELECT * FROM sometable WHERE insert_timestamp > 'last_sync_timestamp') TO 'somefile',可能是腳本。將文件複製到輔助服務器。在那裏,自動執行\copy sometable FROM 'somefile'來從導出文件加載更改的過程。

在你的情況下,我可能會做基於WAL的複製。這確實意味着輔助數據庫必須是絕對只讀的。

+0

感謝您的回答。我可能會嘗試第二種方法:首先,它對數據庫模式沒有任何影響;其次,副本不是一個,因爲它有自己的記錄。 –

+0

@AlainEsparel酷。如果您使用的是PostgreSQL 9.4或更高版本,則還可以選擇使用邏輯解碼輸出插件來傳輸更改。有人正在研究我認爲的json輸出插件。 –