从pg_dump中恢复数据不会覆盖原始数据库中的数据,而是将数据追加到原始数据库中。

14
我正在使用 "pg_dump database_name > backup.sql" 命令对 postgres 数据库进行备份。稍后,我会对原始数据库(database_name)进行一些修改,然后从备份文件(backup.sql)中恢复数据。但结果是,数据库并没有被恢复到原始状态,而是将原始数据与修改后的数据相加(modified + original)。我只想将其恢复到原始状态,那么在从备份文件还原之前,我应该删除数据库中的所有数据吗?因为这将提供数据库的原始状态。或者有其他方法可以解决这个问题吗?
2个回答

18

默认格式pg_dump 是普通的,所以它会创建一个 COPY 语句。因此,当你执行 psql backup.sql 时,你只是运行那些 copy 来覆盖现有数据。要重写数据,你应该先删除表格,或者使用 pg_dump -F c pg_restore -c

警告 - 在这两种情况下,它都会破坏旧数据(尽管这似乎是你想要的)

-c --clean 在重新创建数据库对象之前清除(删除)它们。(除非使用 --if-exists,否则如果在目标数据库中不存在任何对象,则可能会生成一些无害的错误消息。)

正如 @Craig Ringer 建议的那样,从备份中删除/重新创建会更容易和更清洁。要删除数据库,您需要运行 DROP DATABASE au - 请注意,没有连接的用户才能成功。然后您需要创建数据库:CREATE DATABASE au 并运行 psql -f backup.sql -d au


1
通常最好删除并重新创建数据库。这样你就知道你删除了数据类型、模式和其他任何东西。 - Craig Ringer
是的- OP没有展示给我们dbname,所以要么他隐藏了它,要么在环境变量中,或者使用postgres。我不敢建议他删除数据库 :) - Vao Tsun
那么在恢复之前,我应该从数据库中删除哪些内容呢?我应该删除“表”、“视图”、“模式”还是其他什么?如果我必须从数据库中删除所有表格,那么如何在单个查询中执行此操作而不编写所有表格的名称,因为它是一个包含107个表格的大型数据库? - SonamGupta
请引用您用于备份的确切命令并提到使用的数据库名称。最简单和干净的方式是从备份中删除数据库并重新创建它。 - Vao Tsun
文件名=bc_$(date +%s).sql - SonamGupta
"filename=bc_"$(date +%s)".sql " 和 "pg_dump au > $filename" 是我现在使用的来创建备份文件的命令,数据库的名称是“au”。而且为了进行备份,我使用的是“psql au < bc_1493202909.sql”,其中“bc_1493202909.sql”是已经创建好的备份文件。如果我使用“_drop db_”,那么它不会删除整个数据库吗?而且为了进行恢复,我们需要创建一个新的数据库,是吗? - SonamGupta

8

使用-c选项备份数据库: pg_dump -c database_name > backup.sql。参见pg_dump文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接