当前位置: 首页 > 知识库问答 >
问题:

如何强制 Liquibase 在不重新运行语句的情况下重新计算校验和?

居焱
2023-03-14

我们使用Liquibase 3.2和Java 6。有没有一种方法可以强制Liquibase重新计算校验和,而不需要从我们的Liquibase文件中重新运行相同的语句?在我们的数据库中,我运行这个...

update DATABASECHANGELOG set md5sum = null where 1;

但是,当我运行Liquibase更改脚本时,某些执行仍然失败,并出现以下错误……

invoking liquibase change script with file /tmp/deploywork/db.changelog-master.xml
running /usr/java/liquibase/liquibase  --logLevel=info --driver=com.mysql.jdbc.Driver --classpath=/usr/java/jboss/modules/com/mysql/main/mysql-connector-java-5.1.22-bin.jar --changeLogFile=/tmp/deploywork/db.changelog-master.xml --url="jdbc:mysql://myservername:3306/my_db" --username=username --password=password update 
INFO 5/13/15 2:15 PM: liquibase: Successfully acquired change log lock
INFO 5/13/15 2:15 PM: liquibase: Reading from my_db.DATABASECHANGELOG
INFO 5/13/15 2:15 PM: liquibase: Successfully released change log lock
Unexpected error running Liquibase: Validation Failed:
     3 change sets check sum
          db.changelog-1.0.xml::1357593229391-25::rob (generated) is now: 7:5cfe9ecd779a71b6287ef2360a6979bf
          db.changelog-7.0.xml::create-address-email-index::davea is now: 7:da0132e30ebd6a1bc52d9a39bb8c56d7
          db.changelog-7.0.xml::add-myproject-event-object-id-col::davea is now: 7:2eab5d784647ce33ef3488aa8c383443


SEVERE 5/13/15 2:15 PM: liquibase: Validation Failed:
     3 change sets check sum
          db.changelog-1.0.xml::1357593229391-25::rob (generated) is now: 7:5cfe9ecd779a71b6287ef2360a6979bf
          db.changelog-7.0.xml::create-address-email-index::davea is now: 7:da0132e30ebd6a1bc52d9a39bb8c56d7
          db.changelog-7.0.xml::add-myproject-event-object-id-col::davea is now: 7:2eab5d784647ce33ef3488aa8c383443

liquibase.exception.ValidationFailedException: Validation Failed:
     3 change sets check sum
          db.changelog-1.0.xml::1357593229391-25::rob (generated) is now: 7:5cfe9ecd779a71b6287ef2360a6979bf
          db.changelog-7.0.xml::create-address-email-index::davea is now: 7:da0132e30ebd6a1bc52d9a39bb8c56d7
          db.changelog-7.0.xml::add-myproject-event-object-id-col::davea is now: 7:2eab5d784647ce33ef3488aa8c383443

    at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:181)
    at liquibase.Liquibase.update(Liquibase.java:191)
    at liquibase.Liquibase.update(Liquibase.java:174)
    at liquibase.integration.commandline.Main.doMigration(Main.java:997)
    at liquibase.integration.commandline.Main.run(Main.java:170)
    at liquibase.integration.commandline.Main.main(Main.java:89)

这是脚本抱怨的更改集之一……

    <changeSet author="davea" id="add-myproject-event-object-id-col">
        <addColumn tableName="sb_myproject_event">
            <column name="OBJECT_ID" type="VARCHAR(32)"/>
        </addColumn>
        <createIndex indexName="SB_myproject_EVENT_IDX"
            tableName="sb_myproject_event"
            unique="false">
            <column name="OBJECT_ID" type="varchar(32)" />
        </createIndex>
        <sql>update sb_myproject_event set object_id=LEFT(SUBSTRING_INDEX(event_data, '&quot;id&quot;:&quot;', -2), 24) where object_id is null and event_data is not null;</sql>
        <!--  Delete older events that no longer need to be processed -->
        <sql>delete from sb_myproject_event where id not in (select q.* from (select e.id FROM sb_myproject_event e, (select object_id, max(date_processed) d from sb_myproject_event group by object_id) o where e.object_id = o.object_id and e.date_processed = o.d) q);</sql>
    </changeSet>

正如我所说,我只想重新计算校验和(必须这样做,因为我们正在更改Liquibase版本)。

共有3个答案

尹俊雅
2023-03-14

对于那些对液化基础感兴趣的人:clearCheckSums的作用是它基本上运行这个sql

UPDATE databasechangelog SET MD5SUM = NULL

或者,您可以截断“databasechangelog”表;新的变更日志条目将在下次运行liquibase时插入。

如果您使用jHipster,他们会在v7. x中修复此行为,以便liquibase知道重新计算校验和。(这是如果您收到与校验和验证失败相关的错误,并且您确定您拥有的更改日志条目是正确的)。

壤驷升
2023-03-14

如果使用maven,请使用以下命令:

mvn liquibase:clearCheckSums
都阳辉
2023-03-14

与其使用SQL自己清除校验和,不如让Liquibase使用< code > clear checksum 命令来清除校验和:

https://docs.liquibase.com/commands/community/clearchecksums.html

从数据库中删除当前校验和。下次运行时,将重新计算校验和。

 类似资料:
  • 我试图用多个if语句构建一个简单的javascript页面。其思想是根据一堆if语句的计算结果添加到一个列表中。问题是,如果其中任何一个失败,就会触发else语句。我只想在它们都失败的情况下触发else。 当我运行它并且满足所有条件时,我会得到: 当我运行此程序且不满足任何条件时,我将得到: 但如果任何一个条件不满足,我会得到: 或 我试过使用,但它在第一次“匹配”后退出。所以在上面的例子中,如果

  • 我有一个用户名列表,用户名列表根据用户输入的数量而增加。问题是,当用户输入用户名时,列表会被输入填充,只有当我的页面重新加载时,我的页面才会更新。这是我迄今为止尝试过的代码。 我无法在外页重新加载的情况下更新数据。请建议我如何更新ui:在外页重新加载的情况下重复数据。提前谢谢。

  • 当我在一个节点上做了一个紧凑的工作时,它会抛出以下例外情况:

  • 尝试以60FPS的速度在屏幕上设置一个具有绝对位置的元素的动画,我注意到大多数CPU时间都由使用。 我可以在不触发重新计算样式的情况下更改 属性吗? 目前我像这样更改位置:; 下面是一个演示:http://jsfiddle.net/pLtvxv41/您可以使用GoogleChrome性能开发工具查看重新计算样式函数的用法。 这能以更有效的方式改变吗?

  • 问题内容: 我有一个页面正在从第三方(新闻提要)加载脚本。脚本的url在加载时动态分配(根据第三方代码)。 然后从中加载的脚本创建并加载具有新闻提要中各种内容的元素,并以漂亮的格式等将元素加载到其中(传入ID“ div1287”,以便脚本知道在何处加载内容)。 唯一的问题是,它只会加载一次。我希望它每n秒重新加载一次(从而显示新内容)。 所以,我想我会尝试一下: div清除后,我得到警报,但是没有

  • 问题内容: 我在程序开始时,根据数据库中的某些内容,以编程方式在JScrollPane中添加了许多组件(JPanels,JLabels等)。 似乎对于GUI(?)而言,此过程太快了,因此JScrollPane并不总是正确更新,即,即使内部JPanel大于可见区域,滚动条也不可见。 调整窗口大小(JFrame)可以解决此问题,因为我认为Java在调整组件大小时会重新打印它们。 作为测试,我添加了一个