如何恢复/回放我的PostgreSQL数据库

How to restore/rewind my PostgreSQL database

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

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

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

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

1
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相比,更为残忍的方法是停止数据库服务器,复制数据库文件,然后启动数据库服务器。

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


我假设您询问的是数据库而不是集群。我首先想到的是将备份恢复到2个不同的数据库,一个使用dev_db名称,另一个使用dev_db_back名称。然后,当需要一个新的db时,放下dev_db并用将dev_db_backup重命名为dev_db

1
2
DROP DATABASE IF EXISTS dev_db;
ALTER DATABASE dev_db_backup RENAME TO dev_db;

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

如果通常需要每隔10分钟重复恢复,我认为您可以尝试在事务内部执行以下操作:

1
2
3
4
5
BEGIN;
-- alter the db
-- test the alterations
commit; -- or ...
-- rollback;