我们有一个在生产中运行的PostgreSQL服务器和大量具有独立开发环境的工作站。每个都有自己的本地PostgreSQL服务器(没有与生产服务器复制)。开发人员需要定期接收存储在生产服务器中的更新。
我试图弄清楚如何从服务器转储几个选定表的内容,以便更新开发工作站上的表。最大的挑战是我正在尝试同步的表可能分歧(开发人员可以通过Django ORM添加 - 但不删除 - 表中的新字段,而生产数据库的模式保持不变需很长时间)。
因此,必须保留存储在工作站上的表的更新记录和新字段以防止覆盖。
我想直接转储(例如pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
)在这里不合适。
UPD :如果可能的话,我还希望在将数据从生产数据库传输到工作站时避免使用第三个(中间)数据库。
答案 0 :(得分:2)
我建议采用以下方法。
我将根据单个表customer
概述示例。
我们希望从生产中复制此表中的一些条目。显然,全表转储会破坏开发环境中存在的新东西;
因此,请创建一个具有相似结构但名称不同的表,例如customer_$
。另一种方法是为这种“复制”表创建专用模式。您可能还想在其中添加一些额外的列,例如copy_id
和/或copy_stamp
;
现在,您可以INSERT INTO customer_$ SELECT ...
使用想要的数据填充复制表。但是,您可能需要考虑如何执行此操作的方式。在我们使用的工具中,我们可以通过-w
开关提供谓词数据,例如-w "customer_id IN (SELECT id FROM cust2copy)"
;
在您填写复制表后,您可以转储它们。确保使用以下开关到pg_dump
:
--column-inserts
明确列出目标列,对于开发环境复制表可能已经改变了它的结构。对于大卷来说,这可能“慢”; --table / -t
指定要转储的表。在目标环境中,确保(1)清空复制表和(2)防止类似性质的并行活动;
将日期加载到复制表中;
最有趣的部分是:您需要检查,您在主表中发送到INSERT
的数据不会与表中定义的任何约束冲突。你可能有:
PRIMARY KEY
违规行为。您可以(1)替换现有条目或(2)将条目合并在一起或(3)从复制表中跳过条目或(4)选择在复制表中分配不同的ID
; UNIQUE KEY
违规行为,您很可能必须UPDATE
复制表中的某些列; FOREIGN KEY
违规行为,您要么放弃此类条目,要么复制制作中缺失的内容; CHECK
违规行为,您必须手动调查这些内容。完成检查并修复复制表中的数据后,您可以将其复制到主表中。
这是对该方法的非常正式的描述。比方说,对于步骤#7
,我们有大量额外工具可用于重新映射ID或ID范围,操作复制表中的数据,调整安全设置,所有权,某些默认值等。
此外,我们有一个所谓的此工具目录,它允许我们以通用名称对逻辑上绑定的表进行分组。比如说,要从生产中复制客户,我们必须检查50个表,以满足所有可能的依赖关系。
到目前为止,我还没有看到类似的工具。