如何恢复/倒带我的PostgreSQL数据库



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

相关内容

  • 没有找到相关文章

最新更新