Liquibase:组织更改日志的最佳实践

时间:2014-01-22 09:10:28

标签: java mysql database-migration liquibase

我同意Liquibase Best Practices中的几乎所有字词,除了组织你的changeLogs

我有两个主要目标:

1)在application-7.0.0 deploy:

if not exists database 'app-db'
    create database 'app-db' using database-7.0.0.ddl
    sync database 'app-db' with changelog-7.0.0.xml
else
    update database 'app-db' with changelog-7.0.0.xml

2)关于application-7.0.0发布:

for each X : version of application (except 7.0.0)
    create database 'test-source' using database-X.0.0.ddl
    sync database 'test-source' with changelog-X.0.0.xml
    update database 'test-source' with changelog-7.0.0.xml

    create database 'test-target' using database-7.0.0.ddl
    sync database 'test-target' with changelog-7.0.0.xml

    diff databases 'test-target' with 'test-source'
    if are not equals 
        throw ERROR

我知道这有点多余,但我想要双重确定,也许你可以说服我(我希望如此)这不是必要的。

使用主从策略组织更改日志的第一个目标

是相当充分的,但对于第二个目标它不是,因为我没有每个版本的主。

所以我想出了一个新策略:

new_layout

其中每个changelog.xml的构建方式如下:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
    <include file="../2.0.0/changelog.xml"/>

    <changeSet author="Michele" id="3.0.0-1">
        <renameColumn tableName="PERSON" oldColumnName="NAME" newColumnName="FIRSTNAME" columnDataType="VARCHAR(255)"/>
    </changeSet>

    <changeSet author="Michele" id="3.0.0-2" >
        <addColumn tableName="PERSON">
            <column name="LASTNAME" type="VARCHAR(255)"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>

使用此递归布局,每个更改日志文件都可以单独使用,同步/更新。

您是否看到任何消极方面或者您有更好的策略?

我目前正在使用JPA 2.1(eclipselink 2.5.0),MySQL 5.7,Liquibase 3.1.0,maven 3(和glassfish 4.0)

1 个答案:

答案 0 :(得分:0)

如果每个版本的changeLog都包含对先前版本的更改日志的包含引用,那么您所拥有的内容在逻辑上与包含每个版本的主更改日志相同。 Liquibase将嵌套的更改日志展平为一个单独的changeSets列表,然后按顺序执行每个更改日志。

使用您的模型,您必须更改针对每个新版本运行“update”的changelog.xml文件,否则它的工作方式相同。

我不确定您的“使用* .ddl创建数据库”和“同步数据库”步骤是什么。您通常只需针对您的数据库运行liquibase update命令,liquibase跟踪哪些changeSets已执行,并且只运行那些尚未将其标记为已运行的那些。