2014-09-04 72 views
2

我们每晚对我们的数据库进行完整备份,然后使用该转储创建我自己的开发数据库。 dev-db的创建时间大约需要10分钟,所以每天早晨在我上班前通过cron安排。所以我现在可以使用几乎 live db。如何恢复/倒带我的PostgreSQL数据库

但是,当我测试的东西有时会方便回滚完全数据库或只是一些特定的表到初始备份。当然,我可以完全重新开发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-文件,然后启动数据库服务器。

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

+0

也不能有这帮助你吗? http://stackoverflow.com/questions/876522/creating-a-copy-of-a-database-in-postgres它询问有关pgAdmin,但由于该命令是常规的SQL,它应该是足够的。使用您的开发数据库作为模板,并在每次需要时从其创建一个新的数据库。 – DrColossos 2014-09-04 09:26:54

+0

PITR和WAL归档? – 2014-09-04 09:31:38

回答

1

我假设你问的数据库不是集群。我想到的第一件事是将备份恢复到2个不同的dbs,一个名称为dev_db,另一个名称为dev_db_back。然后,当你需要一个新的DB下降dev_db和重命名dev_db_backupdev_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; 
+0

这是一个很好的建议,让我更接近我想要的地方。仍然有限制,我只有一个热备份使用,然后它的10分钟再次等待得到一个新的备份。我可能会使用这样的东西! – UlfR 2014-09-04 09:05:23

+0

@UlfR看起来你需要交易。更新 – 2014-09-04 09:12:13