1

我正在尝试将我转储到其当前位置的表恢复。该表是使用以下方法转储的:

pg_dump -t table db > table.sql -U username

试图恢复,我正在使用:

pg_restore -c --dbname=db --table=table table.sql

我正在使用 -c 因为该表当前存在并且有数据,但是它返回:

pg_restore: [archiver] input file appears to be a text format dump. Please use psql.

我也试过:

-bash-4.2$ psql -U username -d db -1 -f table.sql

但是由于数据已经存在并且--clean这个 psql 命令没有选项(我相信),它返回:

psql:table.sql:32: ERROR:  relation "table" already exists

有没有办法正确使用 pg_restore 或使用带有 --clean 选项的 psql ?

4

1 回答 1

1

对你来说是个坏消息,朋友。您不能pg_restore从计划文本转储中获取。它在文档中:

“pg_restore 是一个实用程序,用于从 pg_dump 创建的一种非纯文本格式的存档中恢复 PostgreSQL 数据库。” https://www.postgresql.org/docs/9.6/static/app-pgrestore.html

如果您可以重新执行pg_dump,您可以使用-Fc标志执行此操作,这将产生一个您可以使用 恢复的工件pg_restore。如果您坚持使用table.sql纯文本格式,您确实有几个选择(我my_fancy_table在下面的两个示例中调用您的目标表):

选项1:

放下桌子:drop table my_fancy_table;

现在运行你的 psql 命令:psql <options> -f table.sql

如果您具有其他表需要存在行的引用完整性,则您可能无法删除该表。

选项 2: 从临时表中插入

您可以编辑 sql 文件(因为它是纯文本)并将表名更改为my_fancy_table_temp(或任何尚不存在的表名)。现在您将拥有两张表,一张来自 sql 文件的临时表和一直存在的真实表。然后,您可以编写一些 upsert SQL 来使用临时表中的行插入或更新真实表,如下所示:

insert into my_facy_table (column1, column2)
select column1, column2 from my_fancy_table_temp
on conflict (my_fancy_unique_index)
update my_fancy_table
set column1 = excluded.column1,
 column2 = excluded.column2
于 2017-12-07T19:46:59.927 回答