【问题标题】:How to clone a postgreSQL database with partial data [closed]如何使用部分数据克隆 postgreSQL 数据库 [关闭]
【发布时间】:2020-12-01 17:25:03
【问题描述】:
我面临的任务是克隆 PostgreSQL 数据库,保留所有约束、索引等,并包括与特定列值相关的所有记录。
换句话说,它是一个独立于多个较小数据库的大数据库。
例如,我的原始数据库有许多模式,每个模式中有许多表,每个表中都有关于多人的记录。我想将其克隆到新数据库,但仅克隆与具有人员 ID 的特定人员相关的记录(克隆所有具有 person_id = xxx 的表中的所有记录)。
是否有此任务的工具或任何建议? (我熟悉Java和Python)
【问题讨论】:
标签:
java
python
postgresql
【解决方案1】:
我发现最好的方法是首先使用带有-s 标志的pg_dump 工具导出完整的架构(仅转储架构,而不是数据),然后单独导出数据。
要从一个全新的空数据库加载您的架构,请使用pg_restore。它将读取来自pg_dump 的输出并使用它来构建数据库。
导出数据时,需要对每张表进行分类(可以编写辅助脚本,或者使用excel等...):
- 根据某些条件(即
person_id 中的某个值),您希望从中获取数据子集的表
- 要完整复制的表(例如维度表,例如
calendar 和 company_locations)
- 您不需要任何数据的表
对于 (1),您需要编写一个适当的 SELECT 查询,以返回您要复制的数据子集。将这些查询放在一个脚本中,并让每个查询将结果写入一个名为<schema>.<table> 的单独文件中。最后,使用psql 实用程序将数据加载到测试数据库。 psql 有一个特殊的 \copy 命令可以轻松完成。它可以从这样的终端使用:
psql --c "\copy schema.table FROM ‘~/dump_data/schema.table’ WITH DELIMITER ‘,’ CSV;"
再次使用 pg_dump 来处理所有属于 (2) 的问题,使用 -t <table name> 标志仅转储命名表,并使用 -a 仅转储数据(无模式)。这也可以添加到 (1) 的脚本中,只需为 (2) 中的每个表添加不合格的SELECT * 并以相同的方式加载数据。
属于 (3) 的表已由初始导出处理。