从postgres数据库中删除重复的架构/表,并将转储全部恢复到该

时间:2016-06-09 02:46:40

标签: database postgresql dump pg-dumpall

今天我不小心将pg_dumpall文件恢复到生成该dumpall的数据库。这种恢复导致了大量的某些ID等重复。

这是一个复杂的生产数据库,它没有损坏整个数据库,但它确实影响了在使用它的网站上更改内容的能力。现在我知道我可以减少损失并将数据库重置为原始的pg_dumpall(它与昨晚相同),但这意味着在使用数据库的网站上进行一整天的工作/发布将会丢失。

我有什么办法可以解决这种情况吗?

1 个答案:

答案 0 :(得分:1)

没有主键,这很难。使用主键,这不可能发生。你能做的最好的事情是,恕我直言:

  1. 重命名所有架构(例如schema - > bad_schema
  2. 重新导入昨晚的转储(当然没有丢弃数据库)
  3. 为所有新表添加PK约束(这需要手动工作!)
  4. 适用于所有schemas.tables:添加从bad_schema.tableXXXschema.tableXXX 的行如果它们尚不存在(这可能需要(非唯一) bad_schema.XXX上的索引,对应于预期的FK'
  5. (可选)将序列调整为相应列中的现有max(值)。
  6. 如果您不了解上述内容(或者如果工作量太大),只需承担损失,并安装昨天的备份。您可以首先重命名已损坏的数据库(或重命名模式),并尝试稍后从中提取新记录。

    总结:确实意识到每个(部分)解决方案都需要以某种方式使用主键。没有PK的桌子很脆弱,毫无意义。