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。 是的,但我认为检查现有的CONTEXT
和LABEL
列在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”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SpringBootApplication 中的 MyBatis 映射之前启动 Liquibase 迁移?
linux测试系统使用expdp迁移数据到windos系统,11.2.0.4版本测试