我们对我们的数据库进行夜间完整备份,然后使用该转储创建自己的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
等选项。但这里似乎有几个问题我没有预见到:
编辑:我测试/研究过的更多内容:
pg_basebackup
pg_basebackup
的更强力的方法是停止db-server,复制db-files,然后启动db-server。上面的两个替代方案都失败了,因为我有几个本地数据库在同一个集群中运行,并且总计了磁盘上的大量数据。没有办法以这种方式分离数据库!因此,此处的文件复制操作不会给我任何速度增益。
答案 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;