在 PostgreSQL 中备份和恢复数据以进行测试的最佳方法
Best way to backup and restore data in PostgreSQL for testing
我正在尝试将我们的数据库引擎从 MsSql 迁移到 PostgreSQL。在我们的自动化测试中,我们在每次测试开始时将数据库恢复到 "clean" 状态。我们通过比较数据库的工作副本与干净副本之间的 "diff"(table by table)来做到这一点。然后复制任何已更改的记录。或删除任何已添加的记录。到目前为止,这个策略对我们来说似乎是最好的方法,因为每次测试,不会更改很多数据,而且数据库的大小也不是很大。
现在我正在寻找一种方法来基本上做同样的事情,但使用 PostgreSQL。我正在考虑对 PostgreSQL 做同样的事情。不过在这样做之前,我想知道是否有其他人做过类似的事情以及您在自动化测试中使用什么方法恢复数据。
旁注 - 我考虑过使用 MsSql 的快照或 backup/restore 策略。这些方法的主要问题是每次测试后我都必须从应用程序重新建立数据库连接,目前这是不可能的。
如果您可以接受一些额外的存储空间,并且如果您(像我一样)对通过自己的代码检查差异方面的重新发明轮子特别不感兴趣,您应该尝试创建一个新的数据库(根据 运行)在 PostgreSQL 中通过 createdb command (or CREATE DATABASE 语句的模板特性)。
例如
(from bash) createdb todayDB -T snapshotDB
或
(from psql) CREATE DATABASE todayDB TEMPLATE snaptshotDB;
优点:
- 理论上,设计时总是完全相同的数据库(无自定义逻辑)
- 复制是文件传输(不是数据库还原)。到目前为止花费的时间少得多(即不再 运行 SQL,不重新创建索引/恢复表等)
缺点:
- 占用 2 倍的磁盘空间 space(尽管模板可能在低性能 NFS 等上)
针对我的具体情况。我决定回到原来的解决方案。这是将数据库的 "working" 副本与数据库的 "clean" 副本进行比较。
有 3 种类型的变化。
- 对于 INSERT 记录 - 从干净的 table 中找到 max(id) 并删除工作 table 上具有更高 ID
的任何记录
- 对于 UPDATE 或 DELETE 记录 - 在干净 table 中找到所有记录,但在工作 table 中找到的记录除外。然后将这些记录 UPSERT 到工作 table.
我正在尝试将我们的数据库引擎从 MsSql 迁移到 PostgreSQL。在我们的自动化测试中,我们在每次测试开始时将数据库恢复到 "clean" 状态。我们通过比较数据库的工作副本与干净副本之间的 "diff"(table by table)来做到这一点。然后复制任何已更改的记录。或删除任何已添加的记录。到目前为止,这个策略对我们来说似乎是最好的方法,因为每次测试,不会更改很多数据,而且数据库的大小也不是很大。
现在我正在寻找一种方法来基本上做同样的事情,但使用 PostgreSQL。我正在考虑对 PostgreSQL 做同样的事情。不过在这样做之前,我想知道是否有其他人做过类似的事情以及您在自动化测试中使用什么方法恢复数据。
旁注 - 我考虑过使用 MsSql 的快照或 backup/restore 策略。这些方法的主要问题是每次测试后我都必须从应用程序重新建立数据库连接,目前这是不可能的。
如果您可以接受一些额外的存储空间,并且如果您(像我一样)对通过自己的代码检查差异方面的重新发明轮子特别不感兴趣,您应该尝试创建一个新的数据库(根据 运行)在 PostgreSQL 中通过 createdb command (or CREATE DATABASE 语句的模板特性)。
例如
(from bash) createdb todayDB -T snapshotDB
或
(from psql) CREATE DATABASE todayDB TEMPLATE snaptshotDB;
优点:
- 理论上,设计时总是完全相同的数据库(无自定义逻辑)
- 复制是文件传输(不是数据库还原)。到目前为止花费的时间少得多(即不再 运行 SQL,不重新创建索引/恢复表等)
缺点:
- 占用 2 倍的磁盘空间 space(尽管模板可能在低性能 NFS 等上)
针对我的具体情况。我决定回到原来的解决方案。这是将数据库的 "working" 副本与数据库的 "clean" 副本进行比较。
有 3 种类型的变化。
- 对于 INSERT 记录 - 从干净的 table 中找到 max(id) 并删除工作 table 上具有更高 ID 的任何记录
- 对于 UPDATE 或 DELETE 记录 - 在干净 table 中找到所有记录,但在工作 table 中找到的记录除外。然后将这些记录 UPSERT 到工作 table.