2009-11-26 73 views
1

有時我需要同步兩個PostgreSQL數據庫(從開發數據庫到生產數據庫的一些表)。PostgreSQL,使用pg_restore更新現有行

所以我想出了這個腳本:

[...] 
pg_dump -a -F tar -t table1 -t table2 -U user1 dbname1 | \ 
pg_restore -a -U user2 -d dbname2 
[...] 

的問題是,這個工程只是新添加的行。當我編輯非PK列時,我得到約束錯誤並且行未更新。對於每個轉儲的行,我需要檢查它是否存在於目標數據庫(通過PK),如果是這樣,請在INSERT/COPY之前將其刪除。

感謝您的建議。

回答

1

這樣做:

pg_dump -t table1 production_database > /tmp/old_production_database_table1.sql 
pg_dump -t table1 devel_database > /tmp/devel_database_table1.sql 
psql production_database 
truncate table1 
\i /tmp/devel_database_table1.sql 
\i /tmp/old_production_database_table1.sql 

你會得到很多關於第二\i重複主鍵錯誤的,但它會做你想要什麼:從devel的所有行會被更新,所有的行不devel不會被更新或刪除。

如果您有任何對table1的引用,那麼您必須先刪除它們,然後在導入後重新創建它們。特別檢查on delete cascadeset nullset default對table1的引用 - 如果您有其他表,則會丟失其他表中的數據。

+0

謝謝,就是這樣。然而,我將不得不備份許多'連接表'(''在刪除級聯'FKs上),但這不應該成爲問題。 – woky 2009-11-27 14:59:15

+0

不要備份連接表 - 只是暫時刪除此表中的所有FK。否則,您將不得不備份引用表,引用這些表的表等。很容易錯過重要的事情。我真的建議將所有FK轉換爲「on delete no action」或「on delete restrict」。 – Tometzky 2009-11-27 17:42:20