从转储全部恢复到它的 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 在使用该数据库的网站上会丢失。
我能做些什么来补救这种情况吗?
没有主键,这很难。使用主键,这不可能发生。你能做的最好的事情是,恕我直言:
- 重命名所有模式(例如
schema
-> bad_schema
)
- 重新导入昨晚的转储(当然不删除数据库)
- 为所有新 table 添加 PK 约束(这需要手动操作!)
- 对于所有
schemas.tables
:添加从 bad_schema.tableXXX
到 schema.tableXXX
的行 如果 它们尚不存在(这可能需要(非-unique) bad_schema.XXX
上的索引,对应于预期的 FK)
- (可选)将序列调整为相应列中的现有最大值。
如果你不明白上面的内容(或者工作量太大),你就自负吧,安装昨天的备份。您可以先重命名损坏的数据库(或重命名模式),然后再尝试从中提取新记录。
总结:要意识到每个(部分)解决方案都以某种方式需要主键。没有PK的table是脆弱的,没有意义的
今天我不小心将一个 pg_dumpall 文件恢复到生成该 dumpall 的数据库中。此恢复导致大量重复某些 ID 等。
这是一个复杂的生产数据库,它并没有破坏整个数据库,但它确实影响了在使用它的站点上更改内容的能力。现在我知道我可以减少我的损失并将数据库重置为原始 pg_dumpall(它是昨晚最近的)但这意味着一整天的 work/posting 在使用该数据库的网站上会丢失。
我能做些什么来补救这种情况吗?
没有主键,这很难。使用主键,这不可能发生。你能做的最好的事情是,恕我直言:
- 重命名所有模式(例如
schema
->bad_schema
) - 重新导入昨晚的转储(当然不删除数据库)
- 为所有新 table 添加 PK 约束(这需要手动操作!)
- 对于所有
schemas.tables
:添加从bad_schema.tableXXX
到schema.tableXXX
的行 如果 它们尚不存在(这可能需要(非-unique)bad_schema.XXX
上的索引,对应于预期的 FK) - (可选)将序列调整为相应列中的现有最大值。
如果你不明白上面的内容(或者工作量太大),你就自负吧,安装昨天的备份。您可以先重命名损坏的数据库(或重命名模式),然后再尝试从中提取新记录。
总结:要意识到每个(部分)解决方案都以某种方式需要主键。没有PK的table是脆弱的,没有意义的