【问题标题】:Postgres backup and overwrite one tablePostgres 备份并覆盖一张表
【发布时间】:2016-05-05 22:43:17
【问题描述】:

我有一个 postgres 数据库,我正在尝试使用以下方式备份一个表:

pg_dump --data-only --table=<table> <db> > dump.sql

然后几天后我试图通过以下方式覆盖它(基本上是想擦除所有数据并从我的转储中添加数据):

psql -d <db> -c --table=<table> < dump.sql

但它不会覆盖,它会在不删除现有数据的情况下添加它。

任何建议都会很棒,谢谢!

【问题讨论】:

  • 这是意料之中的——转储只是 sql COPY 语句。您可以在数据加载之前使用 TRUNCATE &lt;table&gt;,或者将其添加到 dump.sql 文件的顶部。
  • 或者,运行 pg_dump--clean 以“在输出创建数据库对象的命令之前输出命令以清理(删除)数据库对象。”

标签: postgresql postgresql-9.1 psql pg-dump


【解决方案1】:

您基本上有两种选择,具体取决于您的数据和 fkey 约束。

如果表没有 fkey,那么最好的办法是在加载表之前截断表。请注意,截断在事务中的行为有点奇怪,所以最好的做法是(在事务块中):

  1. 锁定表格
  2. 截断
  3. 加载

这将避免其他事务看到空表。

如果您有 fkey,那么您可能希望加载到临时表中,然后执行 upsert。在这种情况下,如果其他事务可能想要写入表(也在事务块中),您可能仍希望锁定表以避免竞争条件:

  1. 将数据加载到临时表中
  2. 锁定目标表(可选,见上文)
  3. 使用可写的 cte 在表中“更新插入”。
  4. 使用单独的删除语句从表中删除数据。

第 3 阶段有点棘手。您可能需要就它提出一个单独的问题,但基本上您将有两个阶段(并在与文档协商后编写):

  1. 更新现有记录
  2. 插入不存在的记录

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    相关资源
    最近更新 更多