Liquibase 从 2.0.4 迁移到版本 3.4.0 后缺少列“CONTEXTS”

Posted

技术标签:

【中文标题】Liquibase 从 2.0.4 迁移到版本 3.4.0 后缺少列“CONTEXTS”【英文标题】:missing column 'CONTEXTS' after Liquibase migration to version 3.4.0 from 2.0.4 【发布时间】:2015-06-30 09:43:35 【问题描述】:

我尝试将 Liquibase 从旧版本 2.0.5 迁移到 3.4.0。我尝试的第一件事是状态命令,导致读取表'databasechangelog'时出现问题:

执行 SQL SELECT 时出错 文件名、作者、ID、MD5SUM、执行日期、执行顺序、执行类型、描述、评论、标签、LIQUIBASE、标签、上下文 来自 IDENTSERVICE.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC:ORA-00904:“上下文”

我似乎是表中的两个新列:LABELS 和 CONTEXTS Lquibase 网站告诉它只是一个替代品。

所以我的问题是:我是否需要先升级到 3.0.0 版,或者如何获得新列?手动操作不是一种选择。

【问题讨论】:

【参考方案1】:

查看´StandardChangeLogHistoryService´ 类。

搜索 hasContexts 例如有代码可以检查这些列是否存在。 因此,如果CONTEXTS 列的测试失败,则应该有一条日志行显示:

"Adding missing databasechangelog.contexts column"

你可以检查你的日志。

所以,是的,它应该是一个替代品。

【讨论】:

你提到的日志条目我找不到。我使用选项--logLevel=debug 将日志级别设置为调试。据我所知,liquibase 首先连接到数据库,然后加载dbchangelog-2.0.xsd。之后,它会查询失败的表 DATABASECHANGELOG 是的,但我认为检查现有的CONTEXTLABEL 列在init() 类的init() 方法中。我假设这是在对DATABASECHNAGELOG 表的任何查询之前运行的。但也许你在 liquibase 中发现了一个错误?我这里没有一个测试场景来重现这个,所以我真的不能告诉...... 据我了解 Liquibase 代码,在 reportStatus() 期间不会调用 init()。运行 update 命令后,将添加两列。但是对于旧版本的 Liquibase,我现在会遇到校验和错误。 校验和是通过使用字段id/author/filepath 创建的。也许你的文件路径改变了?如果您只是将文件放在不同的目录中,就会发生这种情况。当您迁移到新版本时,为什么还要使用旧版本? Status 和 updateSQL 不会更改数据库,这就是不调用 init() 的原因。 Liquibase 3.4.1 通过使用“SELECT *”而不是显式列出实际上可能不存在的列来解决该问题。【参考方案2】:

解决方案不是运行状态命令,而是运行运行良好的更新命令。 小心,你不能回到旧版本的 Liquibase。旧版本出现校验和错误。

【讨论】:

Liquibase 3.4.1 修复了该问题,因此您现在可以在运行更新之前运行状态。

以上是关于Liquibase 从 2.0.4 迁移到版本 3.4.0 后缺少列“CONTEXTS”的主要内容,如果未能解决你的问题,请参考以下文章

Flyway对比Liquibase(转)

如何在 SpringBootApplication 中的 MyBatis 映射之前启动 Liquibase 迁移?

linux测试系统使用expdp迁移数据到windos系统,11.2.0.4版本测试

第三篇:SpringBoot - 数据库结构版本管理与迁移

使用 liquibase 将数据从一个数据库复制到另一个数据库

将 liquibase 添加到现有 Spring Boot 项目的正确方法