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

Jon*_*son 87 postgresql

在生产时,我们的数据库大小只有几百GB.对于开发和测试,我们需要创建此数据库的功能相同的快照,但其大小只有10或20个.

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

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

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

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

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

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

任何一般建议也赞赏!

Ben*_*Ben 101

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

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

COPY mytable FROM 'myfile.tsv'
Run Code Online (Sandbox Code Playgroud)

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

您应该考虑维护一组开发数据,而不仅仅是拉动一部分生产.如果您正在编写单元测试,则可以使用测试所需的相同数据,尝试查看所有可能的用例.

  • 如果你想要快照的多个连接表,有没有办法让这个工作?COPY FROM不支持导入多个表. (4认同)
  • 请注意,此方法不会更新复制表上的序列,因此进一步插入可能会违反主键约束. (3认同)
  • 必须在第一条命令中复制\ copy而不是COPY。 (2认同)

Ale*_*tec 6

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

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

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

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


Pau*_*ato 6

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

  • 尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。 (11认同)
  • 也许如果您添加了有关如何使用此工具的有用说明,我们也许能够理解它如何实现目标 (8认同)
  • 这在这里真的没有意义。OP专门要求提供执行此操作的第三方工具的名称。因此,答案的实质只是“在此URL上有一个名为'Jailer'的第三方工具可以执行此操作”。该链接本身提供了所有必要信息。没有什么可添加的。如果该链接停止工作,则可以从URL轻松推断出“该程序称为Jailer”,因此添加该链接将是多余的。 (3认同)
  • 当然,链接现在已经断开,谷歌没有其他选择。 (2认同)
  • 该链接目前对我有效,谷歌搜索“jailer postgres”也出现了 https://github.com/Wisser/Jailer 。 (2认同)