Liquibase 校验和验证失败

Posted

技术标签:

【中文标题】Liquibase 校验和验证失败【英文标题】:Liquibase checksum validation failed 【发布时间】:2016-05-24 08:39:37 【问题描述】:

我在 Springboot 应用程序中使用 Liquibase (3.5.1)。我正在使用基于 SQL 的更改日志文件。添加新的变更集最终显示了前一个变更集的校验和验证错误。

初始变更日志文件 -

--liquibase formatted sql
--changeset tanmoy:1
create table serviceInstances (
    serviceId varchar(60),
    orgId  varchar(60),
    spaceId varchar(60),
    primary key (serviceId,orgId)
);

当添加这样的新变更集时 -

--changeset tanmoy:2
create table serviceBindings (
    bindingId varchar(30) primary key,
    serviceId varchar(30),
    appId varchar(30),
    timeStamp BIGINT
);

迁移失败并显示此错误日志 -

Caused by: liquibase.exception.ValidationFailedException: Validation Failed:
     1 change sets check sum
          classpath:/db/changelog/db.changelog-master.sql::1::tanmoy was: 7:d15516f48de6531d1727cca8c56ec95a but is now: 7:3c7718f34f78701e0d2cadbf8278c1fa

    at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:266) ~[liquibase-core-3.5.1.jar:na]
    at liquibase.Liquibase.update(Liquibase.java:210) ~[liquibase-core-3.5.1.jar:na]
    at liquibase.Liquibase.update(Liquibase.java:192) ~[liquibase-core-3.5.1.jar:na]
    at liquibase.integration.spring.SpringLiquibase.performUpdate(SpringLiquibase.java:434) ~[liquibase-core-3.5.1.jar:na]
    at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:391) ~[liquibase-core-3.5.1.jar:na]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    ... 16 common frames omitted

不明白为什么前一个变更集的校验和被改变并且没有被验证。是因为我在更改日志文件中添加了一个新的更改集吗?如果是,我该如何添加新的变更集?

【问题讨论】:

只要您添加了一个新的变更集标签,即使在同一个 .xml 文件中也应该可以正常工作 也许您需要将每个 SQL 更改放在一个文件中?并将每个 SQL 更改包含在主 xml 更改日志文件中。现在,您似乎有一个文件db.changelog-master.sql,其中直接插入了 SQL。我不确定使用原始 SQL 文件时如何计算校验和。可能整个文件都包含在校验和计算中。然后,一旦运行变更集,您就必须打开新文件。 您的期望是正确的,第一个变更集校验和应该是完整的。我们对每个纯 sql 文件使用多个变更集,它按预期工作。请仔细检查:1)第一个变更集并没有真正改变。空白更改通常是罪魁祸首,但当前幸运的是 liquibase 将它们排除在校验和计算之外。 2) 仔细检查您是否正确启动了第二个变更集。有时我们会在那里犯错,因此 liquibase 会认为它是先前变更集的一部分,随之而来的校验和也发生了变化。 @MykolaGurov 你知道 Liquibase 计算校验和时是否考虑了行尾 (EOL) 或文件尾 (EOF)? 【参考方案1】:

在进程的层面上,所有的进程都完成了incrementally。例如,当我们创建一个表并想要对表进行更改时,我们会给您一个新的增量编号。有了这个数字,我们就可以确定我们在我们创建的那个中创建的changes。就像您在为您的问题添加新内容一样。因此,您需要在liquibase.xml 文件中增加id。如果您对当前图表进行了更改,请执行以下操作。

<changeSet id="73" author="fcelik">
    <comment>This change adds to customer_order table.</comment>
    <addColumn tableName="customer_order">
        <column name="owner_id" type="BIGINT">
            <constraints nullable="false"/>     
        </column>  
    </addColumn>
</changeSet>

您的文件必须是与您的liquabase.xml 不匹配的值。您想要在创建文件之间执行的操作(通常是跟踪增量路径。)。例如,我在这里向customer_order 表添加了一个新列。使用标签时请注意&lt;addColumn&gt;

【讨论】:

以上是关于Liquibase 校验和验证失败的主要内容,如果未能解决你的问题,请参考以下文章

手机支付宝验证码校验失败啥问题

手机支付宝验证码校验失败啥问题

iOS 应用上传警告:校验和验证失败

手机上下游戏,每次下完都是显示hash校验失败,然后重新下载安装的时候也显示hash校验失败怎么弄

原因:org.flywaydb.core.api.FlywayException:验证失败。迁移 2 的迁移校验和不匹配

潇湘单招报名hash校验值失败是啥意思