簡體   English   中英

pg_restore 后缺少約束

[英]Constraints missing after pg_restore

轉儲表並將其導入另一個 postgres db 約束后丟失。

我用它來轉儲:

    pg_dump --host=local --username=user -W --encoding=UTF-8 -j 10 --file=dump_test --format=d -s --dbname=mydb -t addendum

這是要導入的:

    pg_restore -d myOtherdb --host=local -n public --username=user -W --exit-on-error --format=d -j 10 -t addendum dump_test/

我在生成的 toc.dat 中看到的是這樣的:

    ADD CONSTRAINT pk_addendum PRIMARY KEY (addendum_id);
    >   ALTER TABLE ONLY public.addendum DROP CONSTRAINT pk_addendum;

這看起來像是在創建和銷毀 PK,但我不確定我的解釋是否正確,因為該文件是二進制文件。

編輯:我使用的是 PostgreSQL 9.3

文檔

注意:當指定 -t 時,pg_dump 不會嘗試轉儲所選表可能依賴的任何其他數據庫對象。 因此,無法保證特定表轉儲的結果可以自行成功恢復到干凈的數據庫中。

因此,您有一些公認的不吸引人的選擇:

  1. 您可以手動重建約束,尤其是當您仍然擁有創建它們的 DDL 時。
  2. 您可以對文本執行數據庫范圍的pg_dump ,從那里獲取約束 DDL,請參閱步驟 1。
  3. 您可以執行數據庫范圍的pg_dump ,並完全恢復它。

我遇到了表已經存在但使用 pg_restore 刪除了表的約束的情況。 已經有一個可接受的答案,但我會嘗試為要恢復的表已經可用的情況提供答案。 在這種情況下,只有當您嘗試刪除並重新創建表(-c 或 -C)時,才會刪除約束。 而如果您只想要轉儲中的數據,您可以執行刪除表上的所有記錄(DELETE FROM tableName),然后使用帶有 -a 標志的 pg_restore。 因此,您可以從 pg_restore 命令中排除 -c 或 -C 標志。

聚會有點晚了,但這里有一些可能會有所幫助的東西。

如果您從大型轉儲文件中恢復單個表並且在使用 pg_restore 獲取索引時遇到問題(-t 不執行索引和約束)

 pg_restore db_dump_file.dump | awk '/table_name/{nr[NR]; nr[NR+1]}; NR in nr' > table_name_indexes_tmp.psql

您還需要在索引和約束匹配之后的后續行。 上面的 awk 命令在每次匹配后得到 line + 1。

此輸出文件應包含您的索引(假設轉儲文件實際上包含它們以及數據)。 然后,您可以將它們應用回作為單獨命令恢復的表。

不是一個完美的解決方案,但比嘗試手動重新創建它們更好。

暫無
暫無

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

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