Postgres转储仅一部分表以获取开发快照


95

在生产中,我们的数据库大小为数百GB。为了进行开发和测试,我们需要创建此数据库的快照,这些快照在功能上等效,但大小仅为10或20个演出。

挑战在于我们业务实体的数据分散在许多表中。我们想要创建某种过滤后的快照,以便转储中仅包含某些实体。这样,我们可以每个月左右获取新的快照以进行开发和测试。

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

  • 公司有N个部门
  • 部门有N名员工
  • 员工有N个出勤记录

可能有1000家公司,2500个部门,175000名员工以及数千万的出勤记录。我们希望采用一种可复制的方式来获取前100家公司及其所有组成部门,员工和出勤记录

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

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

任何一般建议也表示赞赏!

Answers:


108

在较大的表上,可以使用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

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


我使用这项技术取得了巨大的成功,完成了与OP相同的操作。对于测试运行,我将COPY(SELECT ..)TO ..约束的数据加载到“模板”数据库中,并使用CREATE DATABASE test_run_XX TEMPLATE product_snapshot_XX。我当然将数据精简到最低限度,因此加载的产品快照和测试数据库创建操作足够快,不会成为团队的障碍。
Trey

5
如果您有多个想要快照的联接表,有什么方法可以使它起作用?COPY FROM不支持导入多个表。
mlissner 2013年

1
你是男人...这对我来说让事情变得如此轻松,但是出于不同的目的。我用它在多租户应用程序中将数据从公共模式迁移到用户特定的模式。谢谢 !
杰里米·F

5
注意,此方法不会更新复制表上的序列,因此进一步的插入可能会违反主键约束。
user2859458 '18

1
我必须使用\copy而不是COPY,因为后者是仅限超级用户的。幸运的是,在9.1中没有其他更改的情况下,其他所有功能都可以完美运行。
PJSCopeland '19

8

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

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

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

  3. 修改pg_dump,以便在转储单个表时与-t开关一起接受条件。


6

http://jailer.sourceforge.net/执行此操作。


12
尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
talonmies 2012年

3
这在这里真的没有意义。OP专门要求提供执行此操作的第三方工具的名称。因此,答案的实质是,“在此URL上有一个名为'Jailer'的第三方工具可以执行此操作。” 该链接本身提供了所有必要的信息。没有什么可添加的。如果该链接停止工作,则可以从URL轻松推断出“该程序称为Jailer”,因此添加该链接将是多余的。
Paul Legato

2
当然,链接现在已经断开,谷歌没有其他选择。
owensmartin 2014年

1
该链接目前对我有用,并且在Google搜索“ jailer postgres”时也打开了github.com/Wisser/Jailer
Paul Legato 2014年

8
也许如果您添加了关于how使用此工具的有用说明,我们也许能够理解它如何实现该目标
Bryan Ash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.