只有部分表格的Postgres转储用于开发快照,有什么工具推荐吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

在生产时,我们的数据库大小为几百GB。对于开发和测试,我们需要创建这个数据库的快照,这些快照在功能上是等效的,但其大小只有10或20个演出。

挑战在于我们的业务实体的数据分散在许多表格中。我们希望创建某种过滤快照,以便只有一些实体包含在转储中。这样我们每个月都可以为开发和测试获得新鲜的快照。

例如,假设我们拥有这些多对多关系的实体:

  • 公司有N个部门
  • 分部有N名员工
  • 员工有N份考勤记录

可能有1000家公司,2500个分部,175000名员工和数千万的出席记录。我们想要一种可复制的方式来拉动前100家公司及其所有组成部门,员工和考勤记录

我们当前使用pg_dump作为模式,然后使用--disable-triggers和--data-only运行pg_dump,以便从较小的表中获取所有数据。我们不希望编写自定义脚本来提取部分数据,因为我们有一个快速的开发周期,并且担心自定义脚本会很脆弱并且可能会过时。

我们应该怎么做?是否有第三方工具可以帮助从数据库中提取逻辑分区?这些工具叫做什么?

提问于
用户回答回答于

在你的大表上,你可以使用COPY命令来拉出子集......

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

应该考虑维护一组开发数据,而不是仅仅提取一部分产品。在你编写单元测试的情况下,你可以使用测试所需的相同数据,试图找到所有可能的用例。

用户回答回答于

我不知道任何已经做到这一点的软件,但我可以想到3种替代解决方案。不幸的是,他们都需要一些自定义编码。

  1. 在一个单独的模式中重新创建所有表,然后将这些数据的子集复制到这些表中,然后将其转储INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...
  2. 编写自己的脚本以将数据转储为SQL语句。过去我使用过这种方法,它只用了20-30行PHP。
  3. 修改pg_dump,以便在转储单个表时接受条件以及-t开关。

扫码关注云+社区

领取腾讯云代金券