Liquibase正在尝试执行已执行的脚本

时间:2019-10-14 18:04:04

标签: spring spring-boot database-migration liquibase

我们需要重命名已由liquibase执行的changelog文件,以使用主文件的相对路径。

当我们更改主更改日志中的文件名时 从

<include file="src/main/resources/db/changelogs/changelog-1.26.xml"/>` 

<include relativeToChangelogFile="true" file="db/changelogs/changelog-1.26.xml"/>

从此更改开始,Liquibase总是尝试执行过去执行的相同脚本。

您能告诉我如何解决吗?我们确实需要更改此路径,以便能够从测试范围执行脚本。

2 个答案:

答案 0 :(得分:0)

没有细节,几乎不可能给出有效的建议。但是,Liquibase在数据库的更改日志表中为其执行的每个“更改”创建一个条目。它为每个与每个更改相关的值组成的校验和进行计算。如果您修改了任何更改,则计算出的校验和将不再相同,并且将与存储在数据库中的校验和不匹配,然后Liquibase将尝试执行“更新的”更改。如果您可以避免不对以前的liquibase变更集进行更改,那么我建议您采用这种方法。但是,如果必须进行更改,则可以使用指定的null来防止描述的错误。

答案 1 :(得分:0)

当 Liquibase 尝试执行脚本时,该脚本会比较校验和以查看是否有任何更改要完成,并且您将看到类似这样的内容(在日志中):

1 change sets check sum
          [filename]::[id]::[author]was: 7:eec7ef2a0dd6f5dc96c7a488f3943ff0 
          but is now: 7:6e98cd45fc25cf5fc182fb751b5349ff

因此,您可以使用以下内容更新 DATABASECHANGELOG 表中的记录:

UPDATE DATABASECHANGELOG SET MD5SUM = '7:6e98cd45fc25cf5fc182fb751b5349ff' 
WHERE (ID = [id]) and (AUTHOR = [author]) and (FILENAME = [filename]);

这将阻止同一脚本的新执行。

如果有人知道 Liquibase 如何计算校验和,那就太棒了,现在我只能在执行后(从日志中)获取校验和,我尝试从终端获取校验和,但是它与 Liquibase 的不匹配