只有部分表格的Postgres转储为开发快照

在生产我们的数据库是几百千兆字节的大小。 对于开发和testing,我们需要创build这个数据库的快照,这些快照在function上是等效的,但只有10或20个演出。

面临的挑战是我们的业务实体的数据分散在许多表格中。 我们希望创build某种过滤快照,以便只有一部分实体包含在转储中。 这样我们每个月都可以得到新的快照,用于开发和testing。

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

  • 公司有N个部门
  • 分部有N名员工
  • 员工有N个考勤logging

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

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

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

任何一般build议也赞赏!

在你的大桌子上,你可以使用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

您应该考虑维护一组开发数据,而不是只是拉动您的生产的一个子集。 在你编写unit testing的情况下,你可以使用testing所需的相同数据,试图打击所有可能的用例。

我不知道任何已经做到这一点的软件,但是我可以考虑3个可选的解决scheme。 不幸的是,他们都需要一些自定义编码。

  1. 在一个单独的模式中重新创build所有的表,然后只使用INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...并转储它,将这些数据的子集复制到这些表中。

  2. 编写您自己的脚本来将数据转储为SQL语句。 过去我已经使用过这种方法,只用了20-30行PHP。

  3. 修改pg_dump,使其在转储单个表时接受条件以及-t开关。