将Liquibase变更日志移植到其他RDBMS

问题描述

我们有几个基于Spring Boot的服务,这些服务使用Liquibase作为架构迁移工具(基于Spring Boot提供的集成)。

由于历史原因,更改日志当前与数据库无关,即它们使用Oracle特定的数据类型。但是,我们希望在不久的将来从Oracle切换到Postgresql。为了使现有的变更日志与Postgresql兼容,必须对其进行修改,使DATABASECHANGELOG表的现有内容无效,并且服务可能会拒绝启动。

什么是解决此迁移的合适方法?丢弃变更日志历史记录,使用修改后的变更日志从头开始重建架构,然后迁移数据?有更好的方法吗?

解决方法

您可以修改变更集以使其对oracle和postgresql有效,然后在其中提供有效的校验和(也许还有创建方法)。

<changeSet id="id" author="author">
    <validCheckSum></validCheckSum>
    ...
</changeSet>

下次运行liquibase时,它将根据有效校验和检查校验和,如果可以,则不会失败。

有时候,您会发现最好使用特定数据库中的某些类型(例如text与varchar2),以便可以对它们进行参数化。而且不仅限于类型。

<property dbms="postgres" name="texttype" value="TEXT"/>
<property dbms="oracle" name="texttype" value="VARCHAR2"/>

<changeSet id="id" author="author">
    <createTable tableName="testtable">
        <column name="test" type="${texttype}" />
    </createTable>
</changeSet>

从前面的示例中,您可以看到在某些liquibase元素中使用了属性dbms。有时,最好使用特定的dbms语法编写某些内容,而不要使用某些抽象。