【问题标题】:Restore PostgreSQL dump with new primary key values使用新的主键值恢复 PostgreSQL 转储
【发布时间】:2014-10-22 09:27:44
【问题描述】:

我遇到了 PostgreSQL 转储/恢复问题。我们有一个使用 PostgresSQL 8.4 运行的生产应用程序。我需要在测试环境的数据库中创建一些值,然后将这块数据导入生产环境。数据由应用程序生成,我需要使用这种方法,因为它需要在投入生产之前进行测试。

现在我已经描述了环境,这是我的问题:

在测试数据库中,我只留下需要移动到生产数据库的数据。数据分布在多个表中,这些表与具有多个级别的外键链接(如树)。然后我使用 pg_dump 将所需的表导出为二进制格式。

当我尝试导入时,数据库将正确导入具有新主键值的根表条目,但不会从其他表中导入任何数据。我认为问题在于子表上的外键不再识别新的主键。

有没有办法实现这样的导入,它将更新树中所有受影响表的所有主键值以自动更正序列(自动递增)值,并根据这些新的主键值更新所有外键?

我已经知道如何在连接到两个数据库的同时借助编程语言来实现这一点,但这对我来说很难实现,因为我无法直接访问客户的生产服务器。

提前致谢!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    在我看来,那是一个复杂的迁移问题。您可以使用插入创建 PL/pgSQL 迁移脚本,并使用返回来获取序列并用作树上其他表的外键。我不知道你的树的结构,但在某些情况下,由于复杂性或性能原因,可能需要提前将序列值读取到数组中。

    其他方法可以是检查生产序列值并估计在不久的将来不会使用的序列值。在测试环境中制造测试数据,使其具有不会与生产序列值冲突的序列值。然后将该数据加载到 prod 数据库中并调整 prod 环境的序列值,以便不使用测试序列值。它会在您的 ID 序列中留下一个空白,因此您必须检查是否有任何东西(如其他进程)依赖于序列值是连续的。

    【讨论】:

    • 感谢您的快速答复!这个差距可能是个问题,因为客户在发票、报价等中使用了各种记录的 ID。但我会研究 PL/pgSQL 语言。我对它不是很有经验,但我知道我能用它做什么。
    • 您的测试数据将占用序列值,因此无论如何都要准备好有间隙。当然,您可以删除测试数据并修改序列,但是如果用户在测试时间范围内使用生产环境,您就不能这样做,因为您的数据库会变得混乱。数据库工具可以将数据导出为插入语句,可以作为导出数据的起点。您可以使用 INSERT INTO table (cols) VALUES (vals) RETURNING idcolumn 来获取 ID 的值。您也可以将 INSERT 与子选择一起使用。 INSERT WITH 也是一个方便的工具。祝你好运:)
    • 感谢彼得的建议。我实际上想出了另一种可能性 - 它可以创建小的间隙,但我有更多的控制 - 我创建了一个脚本,该脚本在所有受影响的表中按我希望插入的行数来推进生产环境中的序列,+ 一些小的预订。然后我生成了要在生产“间隙”开始时插入起始序列的数据,然后简单地插入:-)。该解决方案有效,产生的差距很小。我接受了你的回答,因为这个想法产生了。谢谢。
    • 看看例子会很棒
    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2016-05-21
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多