我们有一个相对较大的基于postgres的数据库:〜20GB。PostgreSQL数据库托管在heroku上。
我想将表数据的一小部分复制到我的本地数据库中,这样我就可以对它们进行一些测试,而不必进行生产工作。
我不想自己生成样本数据,而是使用生产环境中已经存在的数据。
数据库中每个表的约100行就足够了。有没有简单的方法可以做到这一点?
我们有一个相对较大的基于postgres的数据库:〜20GB。PostgreSQL数据库托管在heroku上。
我想将表数据的一小部分复制到我的本地数据库中,这样我就可以对它们进行一些测试,而不必进行生产工作。
我不想自己生成样本数据,而是使用生产环境中已经存在的数据。
数据库中每个表的约100行就足够了。有没有简单的方法可以做到这一点?
Answers:
我没有使用过此工具,但Jailer承诺会做到这一点
数据库子集和浏览工具。从关系数据库(JDBC)导出一致的,参照完整的行集
另一种选择是什么,我刚刚碰到(当然,我还没有使用它,但计划很快)rdbms-subsetter
。
它比Jailer更加简单和轻便,并且具有一些不错的功能/特权:
值得一提的是专门针对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_URL
on 可以访问的数据库your-production-app
,那么最终您将在另一个名为的应用程序中通过PRODUCTION_SNAPSHOT_URL
(如果指定--as
)访问一个DB some-other-app-to-own-forked-database
。
要获得随机的行集,可以使用LIMIT,如下所示:
SELECT * FROM my_table LIMIT 100
这是最简单的方法,只会选择PostreSQL遇到的前100行。它可能是最后插入的100个,也可能是前100个。如果您需要真正随机的东西,请查看此Stackoverflow答案。
LIMIT
不会处理FK引用。例如:订单表中的100行可能包含从客户表中导出100行时不存在的客户。