簡體   English   中英

pg_dump 和 pg_restore(如果存在則丟棄)

[英]pg_dump and pg_restore (DROP IF EXISTS)

我想要一個完全基於 shell 的解決方案來測試我的數據庫,方法是允許我通過運行終端命令將其恢復到一致的 state。

我像這樣轉儲我的數據庫:

pg_dump -F c -b -f -i -h domain.edu -p 5432 -n myschema -U me mydatabase -W -f mydump.sql

然后我想像這樣恢復它:

pg_restore -h domain.edu -p 5432 -U me -d mydatabase -W mydump.sql

但它不起作用,因為我遇到了很多這樣的錯誤:

pg_restore: [archiver (db)] could not execute query: ERROR:  constraint "settings_person_id_fkey" for relation "settings" already exists
    Command was: ALTER TABLE ONLY settings
    ADD CONSTRAINT settings_learner_id_fkey FOREIGN KEY (person_id) REFERENCES pe...

基本上只有一堆東西需要在重新添加之前先刪除( DROP TABLE <whatever> IF EXISTS ,與類型相同,等等)。

我怎樣才能用 Postgres 做到這一點? 我不想使用psql控制台,只想使用 linux 終端。

如果您想將數據庫恢復到一致的狀態,我建議您在恢復轉儲之前刪除並重新創建它:

dropdb -h domain.edu -U me mydatabase
createdb -h domain.edu -U me -T template0 mydatabase # adjust encoding/locale if necessary
pg_restore -h domain.edu -p 5432 -U me -d mydatabase -W mydump.sql

您可以在 pg_dump 中使用--clean來首先刪除對象:

pg_dump --clean

備份

pg_dump --clean -U user database > database.sql

恢復

psql -U user -d database -f database.sql

恢復數據時可以使用--clean --if-exists

pg_restore -h domain.edu -p 5432 -U me --clean --if-exists -d mydatabase -W mydump.sql

--clean使 pg_restore 首先drop所有對象,而--if-exists防止不存在的對象導致失敗。

請注意, --if-exists沒有在pg_restore 的 postgres 文檔中作為單獨的選項列出,但在--clean選項的描述中提到了它:

 -c --clean

在重新創建數據庫對象之前清理(刪除)它們。 (除非使用 --if-exists,如果目標數據庫中不存在任何對象,這可能會生成一些無害的錯誤消息。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM