繁体   English   中英

Postgres:如何备份和恢复表

[英]Postgres: How to Backup & Restore a table

我想对表运行更新查询,但在此之前我想确保我可以恢复表以防查询出错。 因此,由于还原不起作用,我认为一个简单的过程变得困难。

我正在使用 PgAdmin3,在我的桌子上我右键单击并选择“备份”在文件选项中我选择自定义。 我没有选择任何压缩、编码或角色名称,在转储选项中我只选择“部分/数据”。 备份字符串看起来像这样:

pg_dump.exe --host localhost --port 5432 --username "postgres" --no-password --format custom --section data --verbose --file "D:\TEMP\TableBackup.backup" --table "mytable" "myDatabase"

然后我立即通过恢复它和 select 来测试这个备份,“自定义或 Tar”的文件名和格式,并且没有选择其他恢复选项。

pg_restore.exe --host localhost --port 5432 --username "postgres" --dbname "myDatabase" --no-password --table myTable --schema mySchema --verbose "D:\TEMP\TableBackup.backup"

并返回以下错误:

pg_restore: connecting to database for restore
pg_restore: implied data-only restore
pg_restore: processing data for table "myTable"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2305; 0 18581 TABLE DATA myTable mySchema
pg_restore: [archiver (db)] COPY failed for table "myTable": ERROR:  duplicate key value violates unique constraint "myTemplate_pk"
DETAIL:  Key (oid)=(618001) already exists.
CONTEXT:  COPY myTable, line 1
pg_restore: setting owner and privileges for TABLE DATA myTable
WARNING: errors ignored on restore: 1
Process returned exit code 1.

什么是重复密钥?

我该如何处理?

OID=618001 是怎么回事? 我希望恢复整个表,包括 OID,那么为什么这个字段会出错? 我会认为它只会恢复顶部的所有内容?

提前致谢

您可以通过在显式事务中运行UPDATE来避免整个问题,如果出现问题,您可以回滚:

/* start a transaction */
START TRANSACTION;

/* run your UPDATE */
UPDATE ...

/*
 * Now check if your UPDATE did the right thing.
 * If it did, run COMMIT to complete the transaction.
 * If not, run ROLLBACK to undo everything that happened in the transaction.
 */
COMMIT;  -- or ROLLBACK;

您正在尝试将数据的副本添加回表中,而旧版本仍然存在。 因此,您违反了唯一键约束。 在恢复新数据之前,您必须截断旧数据。 但是如果您尝试这样做,您可能会遇到外键问题。

只需使用“like”关键字创建一个新表并复制所有数据。

创建表“tableA_bkp”(如“tableA”)
插入“tableA_bkp” select * 从“tableA”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM