我已经将错误的 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 找出哪些更改已提交,哪些未提交。
好吧,我搞砸了。
我使用以下命令转储了一个 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 找出哪些更改已提交,哪些未提交。