Postgresql Postgres仅为开发人员快照转储部分表

Postgresql Postgres仅为开发人员快照转储部分表,postgresql,Postgresql,在生产中,我们的数据库只有几百GB大小。对于开发和测试,我们需要创建此数据库的快照,这些快照在功能上是等效的,但大小只有10或20 Gig 挑战在于,我们业务实体的数据分散在许多表中。我们希望创建某种经过筛选的快照,以便转储中只包含一些实体。这样,我们可以每月左右获得新的快照,用于开发和测试 例如,假设我们有具有以下多对多关系的实体: 该公司有N个分部 该部门有N名员工 员工有N个考勤记录 大约有1000家公司、2500个部门、175000名员工和数千万的考勤记录。我们需要一种可复制的方法,比如

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

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

例如,假设我们有具有以下多对多关系的实体:

该公司有N个分部 该部门有N名员工 员工有N个考勤记录 大约有1000家公司、2500个部门、175000名员工和数千万的考勤记录。我们需要一种可复制的方法,比如说,提取前100家公司及其所有组成部门、员工和考勤记录

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

我们怎样才能做到这一点?是否有第三方工具可以帮助从数据库中拉出逻辑分区?这些工具叫什么


任何一般性的建议也将不胜感激

我不知道有哪种软件已经做到了这一点,但我可以想出3种替代方案。不幸的是,它们都需要一些自定义编码

在单独的架构中重新创建所有表,然后使用INSERT into copy.tablename SELECT*FROM tablename WHERE将要转储的数据子集复制到这些表中。。。把它扔了

编写自己的脚本,将数据转储为SQL语句。我在过去使用过这种方法,它只需要大约20-30行PHP

修改pg_dump,使其在转储单个表时接受条件和-t开关


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

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

COPY mytable FROM 'myfile.tsv'

你应该考虑维护一组开发数据,而不是仅仅拉动生产的一个子集。在编写单元测试的情况下,您可以使用测试所需的相同数据,尝试访问所有可能的用例。

做到了这一点。

我使用此技术非常成功地完成了与OP相同的工作。对于测试运行,我加载了COPY SELECT。。到将数据约束到模板数据库中,并用于创建数据库测试运行模板产品快照。当然,我将数据压缩到最低限度,以便加载产品快照和测试数据库创建操作足够快,不会成为团队的障碍。如果您有多个想要快照的联接表,有什么方法可以使此工作正常吗?复制自不支持导入多个表。您是。。。这使事情对我来说很容易,但目的不同。在多租户应用程序中,我使用它将数据从公共模式移动到特定于用户的模式。谢谢注意:此方法不会更新复制的表上的序列,因此进一步的插入可能会违反主键约束。我也必须使用\copy而不是copy,因为后者仅是超级用户。幸运的是,在9.1中,其他所有内容都运行良好,没有其他更改。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,只有链接的答案可能会变得无效。这在这里没有真正的意义。OP特别要求提供执行此操作的第三方工具的名称。因此,答案的本质只是,有一个叫做“狱卒”的第三方工具可以在这个URL上实现这一点。这种联系本身提供了所有必要的信息;没有其他补充。如果该链接停止工作,很容易从URL推断出该程序名为“狱卒”,因此添加该链接是多余的。当然,该链接现在已断开,谷歌也别无选择。该链接目前适用于我,而谷歌搜索狱卒博士后,也是。如果您添加了一个关于如何使用此工具的有用描述,我们也许能够理解它是如何实现目标的