Liquibase Pro
Liquibase Flows
Flow file variables are shared across "nested" flow files and can be passed through multiple flow files.
Flow files running policy checks will now exit with a return code from the highest return code triggered by any check.
Related tickets: [DAT-15130] [#1178], [DAT-15343] [#1172], [DAT-15511] [(#1173], [DAT-15753] [#1184], [DAT-15799][#1202], [#1207], [#1266].
Observability. Structured logging
You can now add custom (user-defined) tags into your structured logs. These tags can be used later to segment your reporting. For instance, you can add tags that indicate the team, pipeline, or environment (and any other attributes that are meaningful to your organization) when reporting on Liquibase events.
Custom data is now included in every log message. This enables you to use dashboard queries and reports, which depend on these custom key:values pairs. [DAT-15572] [#1150]
Custom data can also be communicated to Liquibase via environment variables and property substitution. DAT-15214] [#1165]
Security improvement: Sensitive information is now obfuscated for people using passwords in their JDBC URL strings in structured logging. [DAT-15860] [#4902] [#1233]
Liquibase Open Source and Liquibase Pro
Liquibase capability enhancements
The
generate-changeloganddiff-changelogcommands now support the--labelsand--contextFilterarguments. The specified values will be included as attributes for each generated changeset. [DAT-14793] [#4660]The
diff,diff-changelog, andsnapshot-referencecommands now allow you to specify thereferenceLiquibaseCatalogNameandreferenceLiquibaseSchemaNamearguments. [#4352]The
updatecommand summary reports that you can enable with the--show-summaryargument can now be selectively sent to theconsole,log, orallwith the--show-summary-outputargument (prior to this release, they went to both the console and log). [#4395] [#4574]The
includeAlltag now supports an optionalendsWithFilterattribute that directs Liquibase to only include files ending with the value specified by the new attribute. All other files located by the specifiedpathattribute will be skipped and will not be included as deployable changes. [#4402]Enhanced the
historycommand output to include a column for any tags created by the Liquibase "tag" command. [DAT-15244] [#4805]Enhanced
modifyChangeSetsto allow users to use bothincludeandincludeAllin the same changeset. Before this change, you could only use one or the other. [#4680]The new
removeChangeSetPropertyChange Type makes it possible to use modeled changes (XML/YAML/JSON) that have limited support across database platforms.removeChangeSetPropertydirects Liquibase to remove unavailable properties specified by the remove property from specific Change Types for the databases specified by thedbmsproperty.removeChangeSetPropertywill be applied to all Change Types in the changelog specified by thechangeproperty. [#3978]
User experience improvements
Liquibase changed how it tracks changes (the checksum algorithm) in 4.20.0. Some kinds of previously executed changes were being re-executed. This is now resolved - Liquibase will properly migrate those changes to the new checksum algorithm and no longer try to re-execute those changes. [#4762]
Detection of duplicate Liquibase Core and/or Commercial
.jarfiles in your Liquibase installation and error message alerting you to this (unlikely) situation. [DAT-15837] [#4905]Addressed issues that were keeping Liquibase from running on Windows installations where
JAVA_HOMEwas not set. [#4803] [#4845]Fixed a situation where Liquibase would not set the
DATABASECHANGELOGLOCKbefore executing theupdatecommand when--changelog-lock-wait-time-in-minutes=0. The improvement ensures that Liquibase creates theDATABASECHANGELOGLOCKbefore command execution. [#4609]The precondition check
RowCountPreconditionnow works correctly on tables containing more thanInteger.MAX_VALUE(2147483647) rows. In previous releases, the check threw aNumericOverflowexception. [#4725]Liquibase now correctly handles the case where the
primaryKeyTablespaceattribute of theconstraintstag is an empty string. The generated SQL now correctly omits theUSING INDEX TABLESPACEsyntax. In previous releases, this syntax was incorrectly included in the generated SQL without a corresponding (and required) tablespace name. [#4441]Increased tolerance of spaces in formatted SQL changelogs. [DAT-15221] [#4625]
Maven integration improvements
The Maven integration now supports the
logLevelproperty. This gives Maven integration users control over the severity level of log messages sent to the Liquibase logfile. [#4148]
Database platform improvements
MongoDB
MongoDB users can now manage their existing
mongoshscripts with Liquibase by adding comments containing Liquibase directives. This makes it easy to bring the power of Liquibase change management into an existing project team using MongoDB.For more information, see Liquibase MongoDB Pro 1.3.0 Release Notes.
SQL Anywhere
Improved stability and enhanced support:
MySQL and MariaDB
MySQL and MariaDB now support default values in the
snapshotcommand. [#4688]MySQL now correctly maintains
BIT(1)andTINYINT(1)data types. Prior to this improvement, MySQL Boolean incorrectly changedTINYINT(1)toBIT(1).[#4090]
Oracle
Liquibase now supports Oracle's new
BOOLEANdata type that was released in Oracle 23c. Prior to this update, Liquibase converted theBOOLEANdata type to the typeNUMBER(1). [#4579]To improve compatibility, the Oracle JDBC driver was downgraded to the most recent long-term support (LTS) version, series 19.x. The previously shipped Oracle JDBC driver was a development version (version 23.x). [#4909] [#1237]
DB2 LUW
DB2 LUW performance improvements for the
snapshotanddiffcommands. [#4799]DB2 LUW now supports XML data types in the
snapshotanddiffcommands. [DAT-12878] [#4827]DB2 LUW now supports the
replaceIfExists="true"attribute increateProcedurechangesets, enabling Liquibase to create SQL withREPLACE OR EXISTSprepended to procedure definitions. [#4404]
DB2 z/OS
DB2 z/OS performance improvements for the
snapshotanddiffcommands. [#4387]DB2 z/OS now supports the
replaceIfExists="true"attribute increateProcedurechangesets, enabling Liquibase to create SQL withREPLACE OR EXISTSprepended to procedure definitions. [#4404]
PostgreSQL
Fix bug in PostgreSQL
sequenceExistsprecondition validation check that caused it to return the incorrect result. [#4613]
H2
Update H2 to correctly support the database's reserved words for both H2 V1.0 and H2 V2.0. [#4052]
Fix in H2 for minor performance regression introduced in Liquibase 4.23.1 where the DATABASECHANGELOG table was initialized multiple times. It is now correctly initialized once, when the table doesn't already exist. [#4709]
HSQLDB
Fix in HSQLDB for minor performance regression introduced in Liquibase 4.23.1 where the DATABASECHANGELOG table was initialized multiple times. It is now correctly initialized once, when the table doesn't already exist. [#4709]
Performance improvements
Improved performance on all databases where Liquibase checks the table size (preconditions and snapshots). [#4834]
Improved Liquibase performance when managing large changelogs. [#4798]
JAVA API improvements
Liquibase 4.31.0 release notes
Last updated: September 2, 2025
Liquibase 4.31.0 is a major release. Liquibase 4.31.0 contains new capabilities and notable enhancements for Liquibase Open Source and Liquibase Pro users, including in-the-box support for Policy Checks, usability improvements to the policy checks and Liquibase Pro Custom Policy Checks creation flow, enhancements for Operation Reports, new parameters for the history command, and more.
See GitHub formatted release notes for more information. Full changelog: 4.30.0–4.31.0 (January 16, 2024)
UPDATE: Reported Problems with LogicalFilePath February 6, 2025
A few OSS users have reported a logicalfilepath bug, described below. This update aims to highlight potential trouble for users who meet three specific conditions:
Use Liquibase 4.31.0.
Use the
logicalfilepathattribute with different values at changelog and changeset levels.Use
include/includeAllto nest changelogs.
The Bug
The standard Liquibase practice is to accept the attribute closest to the changeset. But in 4.31.0, the parent logicalfilepath value will be used in DBCL/DBCLH as the changelogfilepath value.
What's Next?
Warning: If your workflow meets the conditions mentioned above, please avoid upgrading to version 4.31.0. The issue will be resolved in the upcoming 4.31.1 release.
Note: Liquibase 4.31.0 contains an expanded Checks Extension, and so the artifact size has increased.
Breaking Change
Changesets with entirely blank IDs will now fail validation. This change improves the reliability and diagnosability of database changes, and enforces the best practices specified in documentation and training.
This validation does not apply to changesets that have already been deployed. However, any changesets marked as runOnChange or runAlways will fail validation if they have an empty changeset ID.
Notable Changes
Liquibase Pro
New Checks extension delivered in the box
Policy Checks are one of Liquibase Pro's stickiest capabilities, for which we continually add database platforms, new checks, and customizations. However, to get these developments, users would need to download and upgrade to the latest version of Liquibase.
With this new checks extension, you can deploy the latest Policy Checks powers by optionally upgrading just the Check Extension at your own cadence. Conveniently, this extension is delivered "in the box" at /internal/extensions. You do not have to change anything about your current Policy Checks workflow.
Learn more: Liquibase Pro extensions
Other Checks Enhancements
Pro users can suppress SQL in reports with the new global parameters
--reports-suppress-exceptionand--reports-suppress-sql.New checks settings files can be created without CLI prompts by adding
--forceto thechecks showcommand.checks reports now show all checks run, including those not triggered.
We simplified the custom python check creation flow by removing the single-answer prompts.
Learn more: Policy Checks
Liquibase Open Source and Liquibase Pro
Liquibase capability enhancements
Added changeset execution time to output and logs.
Added a calculated checksum to the output of the
calculate-checksumcommand.Added two new command parameters to the
historycommand so users can better see tagged deployments without having to directly examine the DATABASECHANGELOG table.--show-tagswill return only the tagged deployment history.--tag-filterwill return deployment history for a specific tag or group of tags.Changesets with entirely blank IDs will fail validation.
Note: Validation should not fail for changes that have already been ran. Changes that have been ran with an empty changeset ID that are marked as
runOnChangeorrunAlwayswill fail validation.If an XML changelog is generated with the
generate-changelogcommand and fails to validate according to XML syntax, Liquibase will indicate where the codepoint where the XML failure is located.Added new Spring properties for the Liquibase Pro license key and to disable analytics.
Java API Changes
Added missing changeLogParameters argument to generateChangeLog, calculateCheckSum, doChangeLogSyncSql, and changeLogSync
Liquibase Pro Changelog
New Features
DAT-19367: undo UUID-ing of deployment ID in #2108 by @StevenMassaro
DAT-18519: Reverting
cloneTablegeneric changeType in #2068 by @SvampXDAT-19302: combined dependabot PRs in #2093 by @StevenMassaro
Feat: light build script to be triggered by liquibase oss builds in #2082 by @filipelautert
DAT-19242: Update error messaging for stub checks commands in #2081 by @abrackx
Fixed
dbclh-deployment_idcolumn size in #2078 by @rberezenDAT-19049 Complete work to move all checks-related code to a new extension in #2066 by @wwillard7800
DAT-19000: added '
cloneTable' changetype with no supported databases in #2064 by @SvampXDAT-17940: optionally suppress SQL in reports in #2036 by @StevenMassaro
Add
PRO_LICENSE_KEYtoliquibase-aws-extensionin #2058 by @sayaliM0412DAT-18892: create
checks showfiles without prompting in #2050 by @StevenMassaroDAT-18129: update
checks runoutput for checks that are disabled but requested to be run in #2049 by @StevenMassaroDAT-18777 Add a snippet of the matching SQL to the console output in #2020 by @wwillard7800
DAT-18868: Include successful checks in checks run report "Details by Check" section in #2048 by @abrackx
DAT-17901 Pass the database instance in the scope for changelog parsing in #2042 by @wwillard7800
DAT-18780: Add messaging for scripts that cannot execute when using
MaxAffectedchecks in #2039 by @abrackxDAT-18793: replace
slf4j-simplewithslf4j-nopin #2038 by @StevenMassaro[PRO license rotation] Fixed typo for yugabyte repo in #2047 by @jandroav
DAT-18836 - CPC: database scope checks should not ask "requires snapshot" in #2041 by @filipelautert
DAT-15504: Migrate
init projectto core in #2004 by @abrackxDAT-18328 Update to match core for
stripCommentsinmodifyChangeSetsin #1981 by @wwillard7800DAT-18841 Do not prompt for script type with CPC in #2027 by @wwillard7800
DAT-10610 Added a flag to help trim down exception logging in #1997 by @wwillard7800
Bug Fixes
DAT-19045: fix string wrapping when it contains newlines in #2104 by @StevenMassaro
DAT-19241 Help fixes for the stubs in #2077 by @wwillard7800
DAT-18842 Fix issue where we were passing the wrong argument to the executor in #2006 by @wwillard7800
Security, Driver, and Other Updates
Bump
actions/setup-pythonfrom 5.1.0 to 5.3.0 in #2008 by @dependabot botBump
com.github.jsqlparser:jsqlparserfrom 4.9 to 5.0 in #1866 by @dependabot botRevert "Bump
com.github.jsqlparser:jsqlparserfrom 4.9 to 5.0" in #2044 by @StevenMassaro
Liquibase Open Source and Liquibase Pro Changelog
(#6371) Implement logic to selectively include/exclude columns in
generate-changelog"data" export (Issue #3371, #6310) @catull(#6486) Update
release-published.ymlto get the previous version by @sayaliM0412(#6490) DAT-18995: populate proper
client_payloadfordry_runby @sayaliM0412(#6498) Change automated release file version to main by @tati-qalified
(#6497) DAT-18995: Default
dry_runvalue tofalseby @sayaliM0412(#6415) Add flag to top-level
Scopeto suppress logging of exceptions in certain cases by @wwillard7800(6472) Fail validation for blank changeset IDs (DAT-18773) by @abrackx
(#6451) Migrate
init projectcommand to core (DAT-15504) by @abrackx(#6514) DAT-18995 by @sayaliM0412
(#6515) Recognize
isIOenvironment variable for analytics (DAT-18906) by @StevenMassaro(#6509) Replace
slf4j-simplewithslf4j-nop(DAT-18793) by @StevenMassaro(#6373) Report which
codePointis illegal for XML data export by @catull(#6512) Liquibase API: Add missing
changeLogParametersargument by @MalloD12(#6436) Check if the next character is out of string length by @fntz
(#6494) Make changelog and changeset logical file path settings override
includeAllsetting (Issue #6493) by @wwillard7800(#6511) SQLFile: Add DBMS validation check by @MalloD12
(#6528) Revert refactoring that broke structured logging by @StevenMassaro
(6516) Add new properties to Spring configuration (analytics enabled and pro license) by @filipelautert
(#6553) Add
liquibase-checksproperty by @wwillard7800(#6529) Do not propagate logical file path to included changesets from raw SQL changelogs (DAT-19040) by @wwillard7800
(#6499) Optionally suppress SQL in reports (DAT-17940) by @StevenMassaro
(#6557) Avoid retrieving ran changesets without a database connection (DAT-19095) by @wwillard7800
(#6378) Ensure
GenerateChangelogCommandSteponly reports writing a changelog file if it actually did by @catull(#6555) Generate zip file via Maven, add zip and tar integration tests (DAT-18855) by @abrackx
(#6254) Output calculated checksum to
stdoutby @Ishad-M-I-M(#5595) Add changeset execution time to output by @jasonlyle88
(#6563) Revert "Add changeset execution time to output" by @filipelautert
(6556) Enhance history command to filter changesets by tags (DAT-19013) by @filipelautert
(#6565) Update changeset execution time to follow better practices by @jasonlyle88
(#6536) Implement
copymethod inFilesystemProjectCopier(DAT-18890) by @abrackx(#6328) Add
stubattribute toCommandStepinterface to recognize stub commands by @wwillard7800(#6558) Handle duplicates in sub-commands with
stubmethod (DAT-19049) by @wwillard7800(#6575) Add flag to turn off compatibility check for
liquibase-checksindrop-allby @wwillard7800(#5653) Deployment ID enhancements and execution property by @jasonlyle88
(#6570) Recognize flag to prevent exceptions for unsupported change types (DAT-19074) by @wwillard7800
(#6591) Remove stubs; now trap checks command in
Main(DAT-19268) by @wwillard7800(#6586) Build and test pro master branch with label
Build&TestProby @filipelautert(#6572) Ignore individual AWS extension jars if combined jar is present (DAT-19091) by @StevenMassaro
(#6593) Expire analytics cache after 60 minutes (DAT-19278) by @StevenMassaro
(#6597) Handle absence or older version of
checksJAR (DAT-19289) by @wwillard7800(#6617) Verify test count only if base branch is
masterby @filipelautert(#6630) Handle @ symbol when executing PostgreSQL
SET SEARCH_PATH(DAT-19258) @wwillard7800(6629) undo UUID-ing of deployment ID (DAT-19367) @StevenMassaro
Bug Fixes
(#6628) Fix
liquibase-maven-plugin: Allow null arguments toConfiguredValueModifierFactory.override(String)@facboy(#6540) Fix null value handling when loading resources @sapo-di
(#6621) DAT-19082: Fix issue with losing changed datatype attributes when one datatype is an int and the other is not @abrackx
(#6439) Fix issue with fail on error changeset accounting by @wwillard7800
(#6535) Fix only set Spring analytics scope parameter if it's defined by @filipelautert
(#6547) Fix build - remove empty space from string by @filipelautert
(#6542) Fix always set column properties before calculating checksum by @filipelautert
(#6523) Fix Sequence generator - cache size, data type - for various DBs by @Alienmario
(#6469) Fix README workflow status by @abrackx
(#6571) Fix breaking changes introduced in #6565 by @StevenMassaro
(#6524) Fix
NetUtilTestwhen dealing with IPv4/IPv6 addresses by @MalloD12(6495) Fix Maven issue that produces an exception when it finds a .pom file. by @wwillard7800
(#6453) Fix
FormattedSqlChangeLogSerializerso it includeslogicalFilePathin change-set info comments by @benjamin-bader(#6405) Fix ignore int sizes when diffing MSSQL by @filipelautert
(#6492) Fix (DAT-18813): classloader configuration in
LiquibaseCommandLineby @filipelautert(#6343) Fix #6342 - Liquibase Output changeset executes twice by @jasonlyle88
(#6519) Fix the XSD adding the
nullPlaceholderattribute forloadDatacolumn by @davidecavestro(#6578) Fix fossa ai execution for contributed PRs by @filipelautert
(#6590) Fix Checksum for SQL changes containing
dbmsattributes can get different values ifmd5sumcolumn isnullby @filipelautert(#6540) Fix null value handling when loading resources by @sapo-di
(#6623) Fix test counts in master by @filipelautert
(#6616) Fix "Attach Artifacts to Draft Release" failures (DAT-19292) by @sayaliM0412
(#6621) Fix issue with losing changed datatype attributes when one datatype is an int and the other is not (DAT-19082) by @abrackx
(#6481) Chore: bump
upload-artifactsto v4 by @filipelautert(#6306) Chore: refactor build scripts to remove duplication by @filipelautert
(#6595) Chore: update deprecated action across all locations by @filipelautert
(#6598) Chore: remove references to branch DAT-19069 by @filipelautert
(#6599) Chore: remove duplicated fossa config file by @filipelautert
(#6600) Chore: bump download actions versions by @filipelautert
(#6601) Chore: use target to get access to tokens by @filipelautert
(#6602) Chore: use target to get access to tokens by @filipelautert
(#6624) Chore: rollback test count changes as they are failing for master by @filipelautert
Security, Driver, and Other Updates
(#6626) DAT-18331 PRO: integrate checks extension into tarball/zip, not mac os dmg installer @jandroav
(#6582) Bump
org.junit.platform:junit-platform-suitefrom 1.11.3 to 1.11.4 @dependabot(#6433) Bump
org.firebirdsql.jdbc:jaybirdfrom 5.0.5.java8 to 5.0.6.java8 by @dependabot(#6477) Bump
org.apache.maven.plugins:maven-javadoc-pluginfrom 3.10.1 to 3.11.1 by @dependabot(#6468) Bump
wangyucode/sftp-upload-actionfrom 2.0.2 to 2.0.3 by @dependabot(#6467) Bump
org.apache.maven.plugins:maven-plugin-pluginfrom 3.15.0 to 3.15.1 by @dependabot(#6460) Bump
actions/setup-pythonfrom 5.2.0 to 5.3.0 by @dependabot(#6455) Bump
org.nanohttpd:nanohttpdfrom 2.2.0 to 2.3.1 by @dependabot(#6448) Bump
org.testcontainers:testcontainers-bomfrom 1.20.2 to 1.20.3 by @dependabot(#6449) Bump
actions/cachefrom 4.1.1 to 4.1.2 by @dependabot(#6479) Bump
org.apache.maven.plugins:maven-failsafe-pluginfrom 3.5.1 to 3.5.2 by @dependabot(#6478) Bump
org.apache.maven.plugins:maven-surefire-pluginfrom 3.5.1 to 3.5.2 by @dependabot(#6500) Bump
groovy.versionfrom 4.0.23 to 4.0.24 by @dependabot(#6454) Bump
org.xerial:sqlite-jdbcfrom 3.46.1.3 to 3.47.0.0 by @dependabot(#6480) Bump
org.hsqldb:hsqldbfrom 2.7.3 to 2.7.4 by @dependabot(#6475) Bump
net.snowflake:snowflake-jdbcfrom 3.16.1 to 3.20.0 by @dependabot(#6496) Bump
org.sonarsource.scanner.maven:sonar-maven-pluginfrom 4.0.0.4121 to 5.0.0.4389 by @dependabot(#6522) Bump
org.projectlombok:lombokfrom 1.18.34 to 1.18.36 by @dependabot(#6531) Bump
org.testcontainers:testcontainers-bomfrom 1.20.3 to 1.20.4 by @dependabot(#6527) Bump
commons-io:commons-iofrom 2.17.0 to 2.18.0 by @dependabot(#6603) Bump
org.liquibase.ext:liquibase-sdk-maven-pluginfrom 0.10.23 to 0.10.25 by @dependabot(#6594) Bump
org.assertj:assertj-corefrom 3.26.3 to 3.27.0 by @dependabot(#6584) Bump
org.junit.jupiter:junit-jupiterfrom 5.11.3 to 5.11.4 by @dependabot(#6581) Bump
junit-jupiter.versionfrom 5.11.3 to 5.11.4 by @dependabot(#6577) Bump
org.apache.commons:commons-textfrom 1.12.0 to 1.13.0 by @dependabot(#6568) Bump
org.apache.maven.plugins:maven-javadoc-pluginfrom 3.11.1 to 3.11.2 by @dependabot(#6561) Bump
org.apache.commons:commons-compressfrom 1.26.2 to 1.27.1 by @dependabot(#6614) Bump
org.xerial:sqlite-jdbcfrom 3.47.0.0 to 3.47.2.0 by @dependabot(#6582) Bump
org.junit.platform:junit-platform-suitefrom 1.11.3 to 1.11.4 by @dependabot