2

我们每晚对我们的数据库进行完整备份,然后我使用该转储创建我自己的 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。

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

4

1 回答 1

1

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

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;
于 2014-09-04T08:53:07.133 回答