我已经将错误的 psql 转储加载到我的数据库中,无论如何要恢复?

I have loaded wrong psql dump into my database, anyway to revert?

好吧,我搞砸了。

我使用以下命令转储了一个 psql (9.6.18) 登台数据库

pg_dump -U postgres -d <dbname> > db.out

在做了一些测试之后,我使用以下命令“恢复”了数据。

psql -f db.out postgres

注意到没有 -d 选项了吗?是的。那应该是用户名。

由于数据库碰巧与其用户同名,因此它覆盖了 'default' 数据库 (postgres),该数据库具有其他 QA 正在使用的数据。

我意识到自己的错误后立即取消了操作,但损坏仍然存在。大约 1/3 ~ 1/2 的数据库与登台数据库大致相同 - 至少在架构方面。

有什么办法可以恢复吗?如果这些人中的任何一个做了一个,我还在寻找任何其他转储。但我认为没有过去两三个月。看来我别无选择,只能在早上承认并向他们道歉。

如果没有最近的转储或某种 PITR 复制设置,您将无法轻松取消还原。唯一的选择是手动查看已恢复内容的日志并 remove/alter 在 postgres 数据库中。这将适用于架构,数据是另一回事。仅供参考,postgres 数据库不应该真正用作 'working' 数据库。那里有一个数据库可以连接以执行其他操作,例如 CREATE DATABASE 或 bootstrap 您进入集群的方式。如果保留为空,则上述内容将不是问题。您可以从另一个数据库完成 DROP DATABASE postgres; 然后 CREATE DATABASE postgres.

您是否捕获了 psql -f db.out postgres 运行 的输出?

因为 pg_dump 没有指定 --clean-c,它不应该覆盖任何东西,只是追加。如果您的 table 具有唯一键或主键,则大多数数据复制操作应该因唯一键违规而失败并回滚。即使是一个重叠行(每个 table)也会回滚该 table 的整个数据集。

没有输出,很难弄清楚实际造成了什么损坏。

您还应该立即将 pg_xlog 数据复制到安全的地方。如果归根结底,您也许可以使用 pg_xlogdump 找出哪些更改已提交,哪些未提交。