我们每晚对数据库进行完整备份,然后使用该转储创建自己的dev数据库。dev-db的创建大约需要10分钟,所以它是由cron每天早上在我开始工作之前安排的。所以我现在可以使用几乎的live db。
但是,当我测试东西时,有时将完整的数据库或一些特定的表回滚到初始备份会很方便。当然,我可以完全重新创建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
的一个更暴力的替代方案是停止数据库服务器,复制数据库文件,然后启动数据库服务器
上面的两个备选方案都失败了,因为我有几个本地数据库在同一个集群中运行,这会导致磁盘上的大量数据。没有办法以这种方式分离数据库!所以这里的文件复制操作不会给我任何速度增益。
我假设您询问的是数据库而不是集群。我想到的第一件事是将备份恢复到两个不同的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;