Postgres:如何备份和恢复 table
Postgres: How to Backup & Restore a table
我想 运行 通过 table 更新查询,但在我这样做之前,我想确保我可以恢复 table 以防查询出错。因此,我认为一个简单的过程变得困难,因为恢复不起作用。
我正在使用 PgAdmin3,在我的 table 上单击鼠标右键并 selecting 'Backup'
在文件选项中,我 selecting 自定义。我没有 selecting 任何压缩、编码或角色名称,在转储选项中我只是 selecting 'Sections/Data'。备份字符串看起来像这样:
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 'Custom or Tar' 的文件名和格式,没有其他恢复选项 selected。
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 是怎么回事?
我想要恢复整个 table,包括 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;
您正在尝试将数据副本添加回 table,而旧版本仍然存在。因此,您违反了唯一键约束。在恢复新数据之前,您必须截断旧数据。但是如果您尝试这样做,您可能会遇到外键问题。
只需使用“like”关键字创建一个新的 table 并复制所有数据。
创建 table“tableA_bkp”(类似于“tableA”)
插入“tableA_bkp”select * 来自“tableA”
我想 运行 通过 table 更新查询,但在我这样做之前,我想确保我可以恢复 table 以防查询出错。因此,我认为一个简单的过程变得困难,因为恢复不起作用。
我正在使用 PgAdmin3,在我的 table 上单击鼠标右键并 selecting 'Backup' 在文件选项中,我 selecting 自定义。我没有 selecting 任何压缩、编码或角色名称,在转储选项中我只是 selecting 'Sections/Data'。备份字符串看起来像这样:
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 'Custom or Tar' 的文件名和格式,没有其他恢复选项 selected。
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 是怎么回事? 我想要恢复整个 table,包括 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;
您正在尝试将数据副本添加回 table,而旧版本仍然存在。因此,您违反了唯一键约束。在恢复新数据之前,您必须截断旧数据。但是如果您尝试这样做,您可能会遇到外键问题。
只需使用“like”关键字创建一个新的 table 并复制所有数据。
创建 table“tableA_bkp”(类似于“tableA”)
插入“tableA_bkp”select * 来自“tableA”