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

时间:2014-09-04 07:51:57

标签: postgresql restore database-restore pg-restore

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

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

1 个答案:

答案 0 :(得分: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;