【问题标题】:How can I force Liquibase to recalculate checksums without re-running the statements?如何强制 Liquibase 在不重新运行语句的情况下重新计算校验和?
【发布时间】:2015-07-25 01:02:18
【问题描述】:

我们将 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 版本)。

【问题讨论】:

    标签: checksum liquibase


    【解决方案1】:

    与其使用 SQL 自己清除校验和,不如让 Liquibase 使用clearCheckSums 命令来执行此操作会更好:

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

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

    【讨论】:

    • 嗨,我在上面列出的命令中添加了“--clearCheckSums”,但出现错误,“SEVERE 5/14/15 3:09 PM: liquibase: 无法解析 '--clearCheckSums' "
    • clearCheckSums 是一个命令(类似于更新)而不是一个选项 - 它不需要事先 --
    • update databasechangelog set md5sum=null where id like '%62%';
    • 如果使用gradle插件,可以启动为:gradlew clearChecksums
    • 如果使用 maven,则此 clearCheckSums 有目标 clearCheckSums
    【解决方案2】:

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

    mvn liquibase:clearCheckSums
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2021-07-17
      • 2014-01-16
      相关资源
      最近更新 更多