【问题标题】:Is Liquibase recommended for migrating production data from an old database schema to a new one?是否建议使用 Liquibase 将生产数据从旧数据库模式迁移到新模式?
【发布时间】:2011-04-07 14:14:09
【问题描述】:

我是数据迁移领域的新手,我正在研究如何将使用 OurApp 1.0 的客户数据迁移到具有与 OurApp 2.0 兼容的架构的新数据库中。我见过不少人推荐 Liquibase 用于数据库更改管理和数据库重构任务,在我的新手耳中,这听起来可能接近我们的需要。

但是,在阅读了 www.liquibase.org 上的材料后,我觉得 Liquibase 更多的是保持架构最新,而不是转换大量现有数据,以便它可以持久保存在新架构。

假设我想将 Employee 表中名为 name 的列拆分为 firstname 和 lastname 列。 Liquibase 将能够通过删除 name 列并添加 firstname 和 lastname 列来更改表。但是,我觉得 Liquibase 并不是真正为我构建的,它可以插入转换代码,将数据库中现有记录的名称字段解析为名字和姓氏,并将它们存储在各自的列中。

例如,假设我的桌子看起来像这样

id | name             | position
*********************************
12   Horace Slughorn    Professor
13   Albus Dumbledore   Headmaster

在我运行 Liquibase 之后,name 列将被替换为 firstname 和 lastname 列,因此我的数据库架构将是正确的。但我猜 Liquibase 不是一个框架,它允许我插入一些代码,将“Horace Slughorn”解析为“Horace”和“Slughorn”,并将这些值存储在该记录的名字和姓氏列中。

id | firstname   |  lastname  | position
*****************************************
12   Horace         Slughorn         Professor
13   Albus          Dumbledore       Headmaster

因此,Liquibase 可让您的架构保持最新,但并非旨在帮助您转换现有数据以使其与新架构匹配。那正确吗?

【问题讨论】:

    标签: data-migration liquibase


    【解决方案1】:

    Liquibase 的目标是允许您将数据库从一个版本移动到新版本。它有许多内置的数据库“重构”,但它没有像您描述的那样拆分您的数据,因为您如何分解现有字符串非常依赖于您的实现。

    Liquibase 允许您在 1.9 中创建自定义更改类 (http://www.liquibase.org/manual/custom_refactoring_class),并在 2.0 (http://liquibase.org/extensions) 中提供更强大的自定义更改支持。它是基于 java 的,所以你的脚本需要用 java 编写,但是你可以做任何你需要的数据读取和操作。

    注意:如果你有很多数据,将记录读入java,然后将它们写回会很慢。在这种情况下,您可以使用 liquibase 的标签并创建基于数据库的 sql 语句和/或存储过程,以在数据库中进行拆分。 Liquibase 仍将非常有助于跟踪拆分已完成且不应再次执行。

    【讨论】:

    • @Jason - 我很想知道你走了哪条路线。您是否编写了自定义类来拆分表,或者您是否使用了 Liquibase 的自定义 SQL 工具?还是您选择了完全不同的方法?
    • 我已经完成了这两种方法,具体取决于具体问题。如果可能,我建议使用自定义 SQL 调用。它通常是最容易写入和读取的,并且执行速度最快,因为它在数据库中运行。如果您无法让 SQL 调用正常工作,或者您发现它们开始看起来令人费解,请回退到自定义类。当我有一个需要一次又一次应用的转换并且我想将 SQL 存储在一个位置而不是为每次使用复制它时,我也使用了自定义类。
    【解决方案2】:

    如果您想编写自定义 SQL,也可以使用 dbdeploy。 Liquibase 也支持编写自定义 SQL,有 DBMaintain 或 iBatis Migrator。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 2011-01-24
    • 1970-01-01
    • 2015-06-22
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多