PostgreSQL:使用远程服务器上同一个表中的新记录更新表

时间:2014-10-07 13:52:15

标签: django postgresql

我们有一个在生产中运行的PostgreSQL服务器和大量具有独立开发环境的工作站。每个都有自己的本地PostgreSQL服务器(没有与生产服务器复制)。开发人员需要定期接收存储在生产服务器中的更新。

我试图弄清楚如何从服务器转储几个选定表的内容,以便更新开发工作站上的表。最大的挑战是我正在尝试同步的表可能分歧(开发人员可以通过Django ORM添加 - 但不删除 - 表中的新字段,而生产数据库的模式保持不变需很长时间)。

enter image description here

因此,必须保留存储在工作站上的表的更新记录和新字段以防止覆盖。

我想直接转储(例如pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db)在这里不合适。

UPD :如果可能的话,我还希望在将数据从生产数据库传输到工作站时避免使用第三个(中间)数据库。

1 个答案:

答案 0 :(得分:2)

我建议采用以下方法。

我将根据单个表customer概述示例。

  1. 我们希望从生产中复制此表中的一些条目。显然,全表转储会破坏开发环境中存在的新东西;

  2. 因此,请创建一个具有相似结构但名称不同的表,例如customer_$。另一种方法是为这种“复制”表创建专用模式。您可能还想在其中添加一些额外的列,例如copy_id和/或copy_stamp;

  3. 现在,您可以INSERT INTO customer_$ SELECT ...使用想要的数据填充复制表。但是,您可能需要考虑如何执行此操作的方式。在我们使用的工具中,我们可以通过-w开关提供谓词数据,例如-w "customer_id IN (SELECT id FROM cust2copy)";

  4. 在您填写复制表后,您可以转储它们。确保使用以下开关到pg_dump

    • --column-inserts明确列出目标列,对于开发环境复制表可能已经改变了它的结构。对于大卷来说,这可能“慢”;
    • --table / -t指定要转储的表。
  5. 在目标环境中,确保(1)清空复制表和(2)防止类似性质的并行活动;

  6. 将日期加载到复制表中;

  7. 最有趣的部分是:您需要检查,您在主表中发送到INSERT的数据不会与表中定义的任何约束冲突。你可能有:

    • PRIMARY KEY违规行为。您可以(1)替换现有条目或(2)将条目合并在一起或(3)从复制表中跳过条目或(4)选择在复制表中分配不同的ID;
    • UNIQUE KEY违规行为,您很可能必须UPDATE复制表中的某些列;
    • FOREIGN KEY违规行为,您要么放弃此类条目,要么复制制作中缺失的内容;
    • CHECK违规行为,您必须手动调查这些内容。
  8. 完成检查并修复复制表中的数据后,您可以将其复制到主表中。

  9. 这是对该方法的非常正式的描述。比方说,对于步骤#7,我们有大量额外工具可用于重新映射ID或ID范围,操作复制表中的数据,调整安全设置,所有权,某些默认值等。

    此外,我们有一个所谓的此工具目录,它允许我们以通用名称对逻辑上绑定的表进行分组。比如说,要从生产中复制客户,我们必须检查50个表,以满足所有可能的依赖关系。

    到目前为止,我还没有看到类似的工具。