从转储全部恢复到它的 postgres 数据库中删除重复项 schema/tables

Removing duplicate schema/tables from a postgres database that had a dump all restored to it

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

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

我能做些什么来补救这种情况吗?

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

  1. 重命名所有模式(例如 schema -> bad_schema
  2. 重新导入昨晚的转储(当然不删除数据库)
  3. 为所有新 table 添加 PK 约束(这需要手动操作!)
  4. 对于所有 schemas.tables:添加从 bad_schema.tableXXXschema.tableXXX 的行 如果 它们尚不存在(这可能需要(非-unique) bad_schema.XXX 上的索引,对应于预期的 FK)
  5. (可选)将序列调整为相应列中的现有最大值。

如果你不明白上面的内容(或者工作量太大),你就自负吧,安装昨天的备份。您可以先重命名损坏的数据库(或重命名模式),然后再尝试从中提取新记录。


总结:要意识到每个(部分)解决方案都以某种方式需要主键。没有PK的table是脆弱的,没有意义的