问题描述
我们有几个基于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语法编写某些内容,而不要使用某些抽象。