Liquibase - 校验和因不同的数据库供应商而异

Posted

技术标签:

【中文标题】Liquibase - 校验和因不同的数据库供应商而异【英文标题】:Liquibase - checksum differs with different database vendors 【发布时间】:2014-11-13 17:40:11 【问题描述】:

当我尝试在 MSSQL 和 mysql 上运行 Liquibase 校验和时遇到问题。

在我的 MSSQL 库中,我有一个带有此校验和的更改日志条目:

3:cf2f5de7a1dcc738bbc185e25fbcf6c9

当我针对这个数据库运行我的 liquibase 时,它​​工作得很好。

然后,我将更改日志条目复制到我的 MySQL 数据库并尝试运行,并收到此错误:

myLiquibase.xml::1::Tobb is now: 3:cedf7a8ba54ea3f83141f79

我尝试在我的 MSSQL 中将校验和设置为 null 以重新生成校验和,然后校验和恢复为

3:cf2f5de7a1dcc738bbc185e25fbcf6c9

当在 MySQL 中做同样的事情时,我得到了这个校验和:

3:cedf7a8ba54ea3f83141f7987007deb7

因此,据我所知,根据它是在 MSSQL 还是 MySQL 中运行,Liquibase 会生成不同的校验和。这怎么可能发生?我以为校验和只取决于 liquibase-script 的实际内容?

【问题讨论】:

【参考方案1】:

是的,它取决于内容和 DB 类型,因为实际上校验和不取决于您的 changeset 文本,而是取决于为当前 DB 生成的 sql,它不同的数据库会略有不同。

如果你想避免校验和错误,你可以在变更集中使用validCheckSum标签。

【讨论】:

我明白了,但是validCheckSum 会一起禁用校验和检查吗?知道脚本已在其当前状态下运行,它将消除一些安全性..【参考方案2】:

校验和实际上是根据变更集文本的规范化版本计算的,而不是 SQL,并且应该与数据库类型无关。

您是否针对不同的数据库在不同的操作系统版本上运行?

【讨论】:

MySQL 正在本地运行,在 Windows7 64 位上。 MSSQL 在 Windows Server 2008 R2 上运行。我们使用的是 Liquibase 2.0.1 版。可能是因为覆盖了数据类型? 谢谢,Windows 7 vs. 2008r2 不应该影响校验和。你如何覆盖数据类型?只是允许 liquibase 像往常一样转换它们,还是使用更改日志参数? 我们使用的是 modifySql-element:<modifySql dbms="mysql"> <replace replace="NUMBER(19,0)" with="bigint(20)"/> </modifySql> 好的。我不记得这如何影响 2.0 中的校验和,但可能是问题所在。如果您像@Andremoniy 建议的那样使用 ,您可以只列出已知有效的校验和,它仍然会在所有其他校验和上失败。 这不是大量的更改,我通过手动确保所有更改都生效(它是本地数据库,因此架构由 Hibernate 生成),然后将所有更改都归零校验和,以便将它们设置为适当的值。我想升级 Liquibase-version 应该在我的 TODO 列表中..

以上是关于Liquibase - 校验和因不同的数据库供应商而异的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase 校验和验证失败

使用不同 DBMS 的 Liquibase 数据库迁移

在 Liquibase 中指定不同的“TAG”列名

Liquibase 和 Spring 如何使用单独的用户进行架构更改

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

Liquibase命令所产生的结果与直接在SQL中运行它的结果不同