如何将表数据的子集从生产数据库导出到本地测试数据库中?


10

我们有一个相对较大的基于postgres的数据库:〜20GB。PostgreSQL数据库托管在heroku上。

我想将表数据的一小部分复制到我的本地数据库中,这样我就可以对它们进行一些测试,而不必进行生产工作。

我不想自己生成样本数据,而是使用生产环境中已经存在的数据。

数据库中每个表的约100行就足够了。有没有简单的方法可以做到这一点?


1
只是出于好奇,为什么20GB的磁盘空间过多?我在VM的测试磁盘上分配了100GB的空间,仅用于DB暂存空间。
jcolebrand

由于有时我不随身携带外部HD,因此我的ssd根本无法提供足够的空间。另外,我真的只需要数据库中的示例数据,而不是整个数据库。
jottr 2012年

1
足够公平,但我仍然鼓励您发挥创造力。考虑将SD卡插入SD插槽,因为我从来没有遇到过更多数据问题:-),但这确实很糟糕:-\我的个人笔记本电脑的剩余可用空间为10GB。
jcolebrand

Answers:



1

在这种情况下,狱卒可以提供帮助。我正在与您的同一个主机上工作(试图获取每个表的约100条记录),这是我要做的步骤:-找到根实体(与几乎所有表相关的那个实体),并获取一个表的记录子集根行(例如,root是people,那么我将查找与people.id = 1 ...相关的所有记录)-完成步骤1之后,再次从另一个表(您希望拥有100条记录的表)开始)并从上面的结果中获取其子集。


1

另一种选择是什么,我刚刚碰到(当然,我还没有使用它,但计划很快)rdbms-subsetter

它比Jailer更加简单和轻便,并且具有一些不错的功能/特权:

  • CLI非常容易连接到现有工具
  • 开源的
  • 将遵循外键来获取一致的数据子集
    • 如果您没有明确定义的外键,则可以通过JSON配置文件提供这些关系。就我而言,我计划从存储在其他位置的架构元数据生成此配置(感谢Rails:\)
  • 您可以定位到特定行并获取所有相关记录(例如,特定客户遇到问题,因此您可以提取所有内容以使他们的帐户工作数据可以在本地访问)
  • 每个表可以采用恒定数量的记录,也可以采用对数以从较大的表中获取更多数据而不会花费过多。

值得一提的是专门针对Heroku数据库的另一种选择,我已经使用了很多(因为我曾经在那工作过)。

Heroku实际上非常快地创建了一个新的快照数据库,因为它首先提取预写日志以进行准备,然后连接到主数据库以进行追赶,然后停止对其进行跟踪。您可以跨应用创建这些“分支”,以避免对生产产生太大影响:

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

然后,您可以在本地启动指向该快照的应用程序。我经常使用它来进行数据或架构迁移的空运行或调试客户问题。

在上面的命令中,如果您有一个通过DATABASE_URLon 可以访问的数据库your-production-app,那么最终您将在另一个名为的应用程序中通过PRODUCTION_SNAPSHOT_URL(如果指定--as)访问一个DB some-other-app-to-own-forked-database


0

要获得随机的行集,可以使用LIMIT,如下所示:

SELECT * FROM my_table LIMIT 100

这是最简单的方法,只会选择PostreSQL遇到的前100行。它可能是最后插入的100个,也可能是前100个。如果您需要真正随机的东西,请查看此Stackoverflow答案


感谢您的帮助,但这不能回答我的问题。
jottr 2012年

我确实知道如何限制我的选择。我的问题是,我需要某种方式从heroku克隆数据库中的一部分数据。不能按照herokus手册中的描述转储整个数据库。
jottr 2012年

1
@elementz-您是否有理由不能仅遍历表并将COPY(SELECT ... LIMIT 100)复制到'filename'...?您不能在Heroku中复制吗?
rfusca 2012年

@rfusca-我不知道“复制到”存在。我会尽力回报。
jottr 2012年

3
@rfusca:使用简单LIMIT不会处理FK引用。例如:订单表中的100行可能包含从客户表中导出100行时不存在的客户。
a_horse_with_no_name 2012年
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.