Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I force Liquibase to recalculate checksums without re-running the statements?

We're using Liquibase 3.2 with Java 6. Is there a way I can force Liquibase to recalculate checksums without re-running the same statements from our Liquibase files? In our database, I run this ...

update DATABASECHANGELOG set md5sum = null where 1; 

However, when I run my Liquibase change scripts, certain executions still fail with the following errors ...

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) 

Here is one of the change sets that the script is complaining about …

    <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> 

As I said, I only want to recalculate checksums (have to do this because we're changing Liquibase versions).

like image 897
Dave A Avatar asked May 13 '15 16:05

Dave A


People also ask

How do you run a Liquibase clear checksum?

To run the clear-checksums command, specify the database driver, classpath, and URL the Liquibase properties file. For more information, see Specifying Properties in a Connection Profile. You can also specify these properties in your command line.

How does Liquibase calculate checksum?

When running the calculate-checksum command, the DATABASECHANGELOG table calculates an MD5 checksum for each entry based on the SQL script of the changeset. This checksum helps Liquibase detect differences between the changesets you want to deploy and the changesets that have already been run against the database.


2 Answers

Rather than clearing the checksums yourself using SQL, it will probably be better to let Liquibase do that by using the clearCheckSums command:

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

Removes current checksums from database. On next run checksums will be recomputed.

like image 95
SteveDonie Avatar answered Nov 28 '22 09:11

SteveDonie


Use the command below if you are using maven:

mvn liquibase:clearCheckSums 
like image 28
Mohamed Taher Alrefaie Avatar answered Nov 28 '22 08:11

Mohamed Taher Alrefaie