【问题标题】:How to restore/rewind my PostgreSQL database如何恢复/倒带我的 PostgreSQL 数据库
【发布时间】:2014-10-28 21:09:41
【问题描述】:

我们每晚对数据库进行完整备份,然后我使用该转储创建自己的 dev-db。 dev-db 的创建大约需要 10 分钟,所以它每天早上在我开始工作之前由 cron 安排。所以我现在可以使用几乎实时数据库了。

但是当我测试一些东西时,有时将完整的数据库或一些特定的表回滚到初始备份会很方便。当然,我可以完全重建 dev-db,但这会让我再等 10 分钟才能再次运行测试。

那么有没有一种简单的方法可以将数据库/表恢复/倒回到特定时间点或从转储中恢复?

我曾尝试像这样使用pg_restore 来恢复特定表:

pg_restore -d my-dev-db -n stuff -t tableA -t tableB latest-live-db.dump

我也尝试过-c--data-only等选项。但是这里似乎有几个我没有预见到的问题:

  • 当恢复的数据复制回来时,旧数据不会自动删除。
  • 有几个外键约束使得这不可能(如果我错了,请纠正我),而无需在还原之前显式删除 FK,然后重新添加它们。
  • 在这一点上,我根本不关心出现故障的 PK 序列,但这也可能是一个问题。

编辑:我测试/研究的更多内容:

  • pg_basebackup
  • pg_basebackup 的更强力替代方法是停止 db-server,复制 db-files,然后启动 db-server。

上述两种选择都失败了,因为我有几个本地数据库在同一个集群中运行,并且汇总了磁盘上的大量数据。没有办法以这种方式分离数据库!所以这里的文件复制动作不会给我任何速度增益。

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/questions/876522/… 它询问 pgAdmin 但由于该命令是常规 SQL,因此应该足够了。使用您的开发数据库作为模板,并在每次需要时从中创建一个新的。
  • PITR 和 WAL 归档?

标签: postgresql restore database-restore pg-restore


【解决方案1】:

我假设您询问的是数据库而不是集群。我想到的第一件事是将备份恢复到 2 个不同的 dbs,一个名称为 dev_db,另一个名称为 dev_db_back。然后当你需要一个新的数据库删除dev_db 并将dev_db_backup 重命名为dev_db

drop database if exists dev_db;
alter database dev_db_backup rename to dev_db;

之后,要重命名另一个源,请再次将备份恢复到 dev_db_backup。这可以通过脚本来完成,因此删除、重命名和恢复将是自动化的。由于删除和重命名是即时的,只需启动脚本即可完成重命名,无需等待新的恢复。

如果需要在不到 10 分钟的间隔内重复恢复是很常见的,我认为您可以尝试在事务中执行您正在执行的操作:

begin;
-- alter the db
-- test the alterations
commit; -- or ...
-- rollback;

【讨论】:

  • 这是一个很好的建议,让我离我想去的地方更近了。仍然存在我只能使用一个热备份的限制,然后再次等待 10 分钟以获取新备份。不过我可能会使用这样的东西!
  • @UlfR 看起来您需要交易。更新
猜你喜欢
  • 2020-07-07
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 2014-09-03
  • 2015-03-30
相关资源
最近更新 更多