我正在尝试恢复我转储到其当前位置的表。该表使用以下方式转储:
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
但由于数据已存在且此psql命令没有--clean
选项(我相信),它会返回:
psql:table.sql:32: ERROR: relation "table" already exists
有没有办法正确使用pg_restore或者使用带有--clean选项的psql?
答案 0 :(得分: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