【问题标题】:Restoring the data from pg_dump doesn't overwrite the data but it appends the data to the original database从 pg_dump 恢复数据不会覆盖数据,但会将数据附加到原始数据库
【发布时间】:2017-09-26 06:49:05
【问题描述】:

我正在使用“pg_dump database_name > backup.sql”转储 postgres 数据库。稍后我对原始数据库(database_name)进行一些修改,然后从备份文件(backup.sql)中恢复数据。但结果是,数据库并没有恢复到原始状态,而是将原始数据添加到修改后的数据(修改+原始)。我只是希望它恢复到原始状态,我应该删除所有在从备份文件恢复之前从数据库中获取数据,因为它给出了数据库的原始状态。或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: postgresql backup psql restore pg-dump


    【解决方案1】:

    default formatpg_dump 很简单,所以它创建了一个 COPY 语句。因此,当您 psql backup.sql 时,您只需在现有数据上运行那些 copy。要重写数据,您应该先删除表或pg_dump -F candpg_restore -c

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

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

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

    【讨论】:

    • 通常最好删除并重新创建数据库。这样你就知道你删除了数据类型、模式和其他任何东西。
    • 是的 - OP 没有向我们显示 dbname,所以他要么隐藏它,要么在 env 中,或者在 postgres 中工作。我不敢让他放弃 db :)
    • 那么在恢复之前我应该​​从数据库中删除哪些东西呢?我应该删除“表”、“视图”、“模式”还是什么?如果我必须从数据库中删除所有表,那么我怎么能在一个查询中完成而不写所有表的名称,因为它是一个包含 107 个表的巨大数据库?
    • 请引用您用于备份的确切命令并提及您使用的数据库名称。最简单干净的方法 - 删除 db 并从备份中重新创建它
    • "filename=bc_"$(date +\%s)".sql
    【解决方案2】:

    使用-c 选项进行转储:pg_dump -c database_name > backup.sql。请参阅pg_dump 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多