迁移技术:将整个数据库复制到v2或始终在同一数据库版本上更改?

时间:2012-12-12 11:56:02

标签: database migration

我知道标题可能会让人感到困惑,但这是我能用来解释这个问题的最好方法。

背景

我有一个域,一个域有2个数据库:一个nosql(Mongodb)和一个sql(Postgres);每个数据库都有自己的模型例如,如果域名是“myapp”且版本是“v01”,那么它将在sql和nosql中都有一个名为“myapp_v01”的数据库。

迁移 - 复制数据库:

当我迁移时,我通常会创建一个名为“myapp_v02”的新数据库(注意2)。然后迁移脚本将克隆表或从“myapp_v01”获取数据以某种方式改变它并以不同的方式将其保存到“myapp_v02”。我不知道这是否具有很大的可扩展性,或者在进行迁移需要1小时的时候会如何?

迁移 - 复制表格

我可以简单地创建一个新的临时表来进行迁移更改(从表“cars”复制到“cars_temp”,然后删除“cars”表并将“cars_temp”的名称更改为“cars”)。 / p>

迁移 - 更改表格

这有点棘手,因为我们都有sql数据库。 在sql中,我需要先创建alter schema,然后在需要时以某种方式更新每一行。

结论: 我认为第3个是最快的,但我真的不知道这里的最佳做法是什么。

由于

1 个答案:

答案 0 :(得分:1)

我认为第三种是默认方法。它有几个赞成的论点:

  1. 您不必触摸不改变的事物。它只是保持原样。

  2. 您可以轻松地进行分阶段更改,例如在v1中添加列,在第一版的生命周期内开始填充数据,可能是批量生成,在v2中主动使用它,也可能在v3中删除旧列当你确定所有的新东西都很好的时候。在其他方面做这件事听起来很麻烦。

  3. 使用大型数据库复制所有数据可能会非常昂贵(更多考虑时间和I / O而不是磁盘空间)

  4. 更新回答评论

    中的其他问题

    如果要将A列和B列合并到新列C中,您可以根据问题的第三种方法选择各种选项:

    安全方式: - 停止申请,所以没人能写信。

    • 创建并填写C列

    • 可能会删除A和B上的非空和类似约束

    • 部署并启动仅使用C列的新版应用程序。

    • 以后任何时候都会删除A列和B列,可能只有几周后才会发布下一个版本。

    快速的方式 - 停止申请,所以没人能写信。

    • 创建并填写C列

    • 删除A和B

    • 部署并启动仅使用C列的新版应用程序。

    由于您的应用程序和未使用的列似乎有问题,因此可能需要这样做。

    遗产代码的方式 - 创建列C(注意:所有应用程序仍在运行)

    • 创建使A,B和C保持同步的触发器(这也可以通过视图和可能的其他供应商特定的RDBMS功能完成)

    • 部署并启动仅使用C列的新版应用程序。

    • 将所有其他应用程序迁移到仅使用C

    • 随后可能会在几年之后丢弃A列和B列。

    这适用于您使用数据库的许多应用程序无法一次更改的情况。

    我不知道猫鼬的续集......对我来说听起来像童话般的冒险: - )