介绍

增量软件开发过程需要增量数据库迁移策略。

我记得在一个企业应用程序上工作,其中hibernate.hbm2ddl.auto是默认的数据迁移工具。

更新生产环境需要进行大量准备,并且迁移脚本仅在现场创建。 意外错误可能导致生产数据损坏。

救援的增量更新

增量数据库更新是一项技术功能,在最初的应用程序开发迭代中需要解决。

我们过去经常开发自己的自定义数据迁移实现,而花时间在编写/支持框架上总是与您当前的项目预算相抵触。

项目必须包含应用程序代码和所有关联的数据库架构/数据更新脚本。 使用增量迁移脚本可以使我们自动化部署过程并利用连续交付的优势。

如今,您不必实施数据迁移工具, Flyway的工作要比我们以前所有的自定义框架都要好。 必须按照定义明确的命名约定将所有数据库架构和数据更改记录在增量更新脚本中。

RDBMS迁移计划同时解决架构和数据更改。 分离架构和数据更改总是好的。 集成测试可能仅将架构迁移脚本与测试时间相关的数据结合使用。

Flyway支持所有主要的关系数据库系统,但对于NoSQL(例如MongoDB),您需要查找其他地方。

蒙吉兹

Mongeez是一个开源项目,旨在自动化MongoDB数据迁移。 MongoDB是无架构的,因此迁移脚本仅针对数据更新。

整合mongeez

首先,您必须定义一个mongeez配置文件:

mongeez.xml

<changeFiles>
    <file path="v1_1__initial_data.js"/>
    <file path="v1_2__update_products.js"/>
</changeFiles>

然后添加实际的迁移脚本:

v1_1__initial_data.js

//mongeez formatted javascript
//changeset system:v1_1
db.product.insert({
    "_id": 1,
    "name" : "TV",
    "price" : 199.99,
    "currency" : 'USD',
    "quantity" : 5,
    "version" : 1
});
db.product.insert({
    "_id": 2,
    "name" : "Radio",
    "price" : 29.99,
    "currency" : 'USD',
    "quantity" : 3,
    "version" : 1
});

v1_2__update_products.js

//mongeez formatted javascript
//changeset system:v1_2
db.product.update(
    {
        name : 'TV'
    },
    {
         $inc : {
             price : -10,
             version : 1
         }
    },
    {
        multi: true
    }
);

而且您还需要添加MongeezRunner:

<bean id="mongeez" class="org.mongeez.MongeezRunner" depends-on="mongo">
	<property name="mongo" ref="mongo"/>
	<property name="executeEnabled" value="true"/>
	<property name="dbName" value="${mongo.dbname}"/>
	<property name="file" value="classpath:mongodb/migration/mongeez.xml"/>
</bean>

跑步mongeez

当应用程序首次启动时,将分析增量脚本,并且仅在必要时运行:

INFO  [main]: o.m.r.FilesetXMLReader - Num of changefiles 2
INFO  [main]: o.m.ChangeSetExecutor - ChangeSet v1_1 has been executed
INFO  [main]: o.m.ChangeSetExecutor - ChangeSet v1_2 has been executed

Mongeez使用单独的MongoDB集合来记录以前运行的脚本:

db.mongeez.find().pretty();
{
        "_id" : ObjectId("543b69eeaac7e436b2ce142d"),
        "type" : "configuration",
        "supportResourcePath" : true
}
{
        "_id" : ObjectId("543b69efaac7e436b2ce142e"),
        "type" : "changeSetExecution",
        "file" : "v1_1__initial_data.js",
        "changeId" : "v1_1",
        "author" : "system",
        "resourcePath" : "mongodb/migration/v1_1__initial_data.js",
        "date" : "2014-10-13T08:58:07+03:00"
}
{
        "_id" : ObjectId("543b69efaac7e436b2ce142f"),
        "type" : "changeSetExecution",
        "file" : "v1_2__update_products.js",
        "changeId" : "v1_2",
        "author" : "system",
        "resourcePath" : "mongodb/migration/v1_2__update_products.js",
        "date" : "2014-10-13T08:58:07+03:00"
}

结论

要使部署过程自动化,您需要创建自包含包,其中包含字节码和所有关联的配置(xml文件,资源包和数据迁移脚本)。 在开始编写自己的自定义框架之前,您应该始终调查可用的开源替代方案。

  • 代码可在GitHub上获得 。

翻译自: https://www.javacodegeeks.com/2014/10/mongodb-incremental-migration-scripts.html