【问题标题】:Porting Liquibase changelog to different RDBMS将 Liquibase 变更日志移植到不同的 RDBMS
【发布时间】:2020-09-07 08:05:42
【问题描述】:
我们有几个基于 Spring Boot 的服务,它们使用 Liquibase 作为架构迁移工具(基于 Spring Boot 提供的集成)。
由于历史原因,变更日志目前与数据库无关,即它们使用 Oracle 特定的数据类型。但是,我们希望在不久的将来从 Oracle 切换到 PostgreSQL。为了使现有的变更日志与 PostgreSQL 兼容,必须对其进行修改,使 DATABASECHANGELOG 表的现有内容无效,并且服务可能会拒绝启动。
解决这种迁移问题的合适方法是什么?扔掉变更日志历史,使用修改后的变更日志从头开始重建模式,然后迁移数据?有更好的方法吗?
【问题讨论】:
标签:
spring-boot
liquibase
【解决方案1】:
您可以修改您的变更集以使其对 oracle 和 postgresql 有效,然后在其中提供有效的校验和(也许还有创建它的方法)。
<changeSet id="id" author="author">
<validCheckSum></validCheckSum>
...
</changeSet>
当您下次运行 liquibase 时,它会根据有效校验和检查校验和,如果没问题,则不会失败。
有时您会发现最好使用特定数据库中的某些类型(例如 text vs 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 语法编写一些东西,而不是使用一些抽象。