我们每晚对数据库进行完整备份,然后使用该转储创建自己的dev数据库。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服务器,复制db文件,然后启动db服务器。
以上两种方法都失败了,因为我有几个本地数据库在同一个集群中运行,这些数据库在磁盘上总计有很多数据。无法用这种方式分离数据库!所以这里的文件复制操作不会给我任何速度增益。

最佳答案

我猜你问的是数据库而不是集群。我首先想到的是将备份恢复到两个不同的数据库,一个数据库名为dev_db,另一个数据库名为dev_db_back。然后当您需要一个新的db dropdev_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;

09-26 17:31
查看更多