Database 如何创建用于测试的生产数据库示例?

Database 如何创建用于测试的生产数据库示例?,database,postgresql,testing,Database,Postgresql,Testing,是否有一个工具(理想情况下,用于PosgreSQL)可以生成一个大数据库的小而一致的样本 问题是我们需要一个测试数据库,但我们不想完全复制生产数据库。首先,因为它太大,其次,测试的性质意味着测试数据库将在这个过程中重新创建好几次 显然,您不能简单地从一些表中获取随机行,因为这将违反外键的限制。所以,我想知道有没有一个工具可以做到这一点?您可以使用pg\u dump--schema only来只转储数据库的模式。然后使用pg_restore将转储加载到新数据库中。在这里,您有几个选择: 手工创建数

是否有一个工具(理想情况下,用于PosgreSQL)可以生成一个大数据库的小而一致的样本

问题是我们需要一个测试数据库,但我们不想完全复制生产数据库。首先,因为它太大,其次,测试的性质意味着测试数据库将在这个过程中重新创建好几次


显然,您不能简单地从一些表中获取随机行,因为这将违反外键的限制。所以,我想知道有没有一个工具可以做到这一点?

您可以使用
pg\u dump--schema only
来只转储数据库的模式。然后使用
pg_restore
将转储加载到新数据库中。在这里,您有几个选择:

  • 手工创建数据;这将允许您覆盖边缘情况,但如果您想在大量数据上进行测试,则需要一段时间

  • 编写一些查询脚本以导入数据库中每个表的随机部分。正如您所说,这将违反外键约束,但当它确实违反外键约束时,将忽略失败。跟踪成功的数量,并一直保持下去,直到您拥有所需的尽可能多的数据项。但是,如果您有非常严格的约束,这可能不起作用,这取决于您的模式,因为可能需要很长时间才能找到后续数据


  • 我曾经为IDMS系统构建过这样一个工具

    当我们合并的公司的经理告诉我,我不能继续把时间浪费在这些无用的、不必要的软件上时,我也正在努力使它为SQL系统工作


    直到今天,我还没有看到或听说过任何与我当时所取得的成就相匹配的商业产品。

    在我的Oracle时代,我们将拥有一个带有非常小的自动生成数据集的测试数据库。当时它大约是生产数据库大小的五分之一。我们将从生产数据库中复制统计数据,并将它们放入测试数据库中,使其认为表中有数十亿行,而实际上只有500000行。这使我们能够在测试中得到我们将在生产中得到的解释计划。它有它的价值,但并不能解决你所有的问题,我也不确定搞乱PostgreSQL的统计数据有多容易,甚至有多可行。

    如果有一个工具,比如,您可以创建自定义脚本来创建有意义的生产数据副本,或使用商业产品,如或是,我编写了一个工具来实现这一点:

    自述文件:

    pg_sample是一个实用程序,用于从 更大的PostgreSQL数据库。输出和命令行选项 与pg_转储备份实用程序非常相似(尽管只有 支持纯文本格式)

    生成的示例数据库包括原始数据库中的所有表, 保持引用完整性,并支持循环依赖关系


    您可以通过cmd行导入数据库。在测试阶段之前,是否使用批处理文件导入数据库?您是否实际导出和导入了数据库以查看实际需要多长时间?它可能没有你想象的那么糟糕。事实上,您已经有了好的数据,我会尽可能地利用这些数据。大数据库有什么问题?实际上,我更喜欢使用大型数据库进行测试,因为在测试时,它还会告诉您性能危害在哪里。在任何情况下,我都不知道现在有什么工具可以做到这一点。@mezzie,当你进行正常测试时,也就是当你测试应用程序时,它是可以的。但首先,您要测试更新过程,每次它失败时,您都必须重新创建数据库,坦率地说,这比我想承认的更频繁:)我明白您的意思,但您不需要一直使用pg_dump/pg_restore。如果需要重新加载,您只需将数据目录压缩并解压缩即可。它也会更快。看起来很有希望。我想我会试试这个方法,谢谢@不客气。我是Benerator的一个非常满意的用户,我相信你会喜欢它的。