在生产时,我们的数据库大小只有几百GB。对于开发和测试,我们需要创建此数据库的功能相同的快照,但其大小只有10或20个。
挑战在于我们的业务实体的数据分散在许多表中。我们想要创建某种过滤快照,以便只有某些实体包含在转储中。这样我们就可以每个月左右为开发和测试获取新的快照。
例如,假设我们拥有具有这些多对多关系的实体:
可能有1000家公司,2500个部门,175000名员工和数千万的出勤记录。我们想要一种可复制的方式来拉动前100家公司及其所有组成部门,员工和出勤记录。
我们当前使用pg_dump作为模式,然后使用--disable-triggers和--data-only运行pg_dump以从较小的表中获取所有数据。我们不希望编写自定义脚本来提取部分数据,因为我们有一个快速的开发周期,并担心自定义脚本会很脆弱,可能会过时。
我们怎么做?是否有第三方工具可以帮助从数据库中提取逻辑分区?这些工具叫做什么?
任何一般性建议也表示赞赏!
答案 0 :(得分:94)
在较大的表格中,您可以使用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
您应该考虑维护一组开发数据,而不仅仅是拉动一部分生产。如果您正在编写单元测试,则可以使用测试所需的相同数据,尝试查看所有可能的用例。
答案 1 :(得分:4)
我不知道任何已经这样做的软件,但我可以想到3种替代解决方案。不幸的是,它们都需要一些自定义编码。
在单独的架构中重新创建所有表,然后使用INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...
将转储的数据子集仅复制到这些表中并转储。
编写自己的脚本以将数据转储为SQL语句。我过去曾使用过这种方法,它只需要20到30行的PHP。
修改pg_dump,以便在转储单个表时接受条件和-t开关。
答案 2 :(得分:4)