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-changelog
anddiff-changelog
commands now support the--labels
and--contextFilter
arguments. The specified values will be included as attributes for each generated changeset. [DAT-14793] [#4660]The
diff
,diff-changelog
, andsnapshot-reference
commands now allow you to specify thereferenceLiquibaseCatalogName
andreferenceLiquibaseSchemaName
arguments. [#4352]The
update
command summary reports that you can enable with the--show-summary
argument can now be selectively sent to theconsole
,log
, orall
with the--show-summary-output
argument (prior to this release, they went to both the console and log). [#4395] [#4574]The
includeAll
tag now supports an optionalendsWithFilter
attribute that directs Liquibase to only include files ending with the value specified by the new attribute. All other files located by the specifiedpath
attribute will be skipped and will not be included as deployable changes. [#4402]Enhanced the
history
command output to include a column for any tags created by the Liquibase "tag
" command. [DAT-15244] [#4805]Enhanced
modifyChangeSets
to allow users to use bothinclude
andincludeAll
in the same changeset. Before this change, you could only use one or the other. [#4680]The new
removeChangeSetProperty
Change Type makes it possible to use modeled changes (XML/YAML/JSON) that have limited support across database platforms.removeChangeSetProperty
directs Liquibase to remove unavailable properties specified by the remove property from specific Change Types for the databases specified by thedbms
property.removeChangeSetProperty
will be applied to all Change Types in the changelog specified by thechange
property. [#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
.jar
files 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_HOME
was not set. [#4803] [#4845]Fixed a situation where Liquibase would not set the
DATABASECHANGELOGLOCK
before executing theupdate
command when--changelog-lock-wait-time-in-minutes=0
. The improvement ensures that Liquibase creates theDATABASECHANGELOGLOCK
before command execution. [#4609]The precondition check
RowCountPrecondition
now works correctly on tables containing more thanInteger.MAX_VALUE
(2147483647) rows. In previous releases, the check threw aNumericOverflow
exception. [#4725]Liquibase now correctly handles the case where the
primaryKeyTablespace
attribute of theconstraints
tag is an empty string. The generated SQL now correctly omits theUSING INDEX TABLESPACE
syntax. 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
logLevel
property. 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
mongosh
scripts 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
snapshot
command. [#4688]MySQL now correctly maintains
BIT(1)
andTINYINT(1)d
ata types. Prior to this improvement, MySQL Boolean incorrectly changedTINYINT(1)
toBIT(1).
[#4090]
Oracle
Liquibase now supports Oracle's new
BOOLEAN
data type that was released in Oracle 23c. Prior to this update, Liquibase converted theBOOLEAN
data 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
snapshot
anddiff
commands. [#4799]DB2 LUW now supports XML data types in the
snapshot
anddiff
commands. [DAT-12878] [#4827]DB2 LUW now supports the
replaceIfExists="true"
attribute increateProcedure
changesets, enabling Liquibase to create SQL withREPLACE OR EXISTS
prepended to procedure definitions. [#4404]
DB2 z/OS
DB2 z/OS performance improvements for the
snapshot
anddiff
commands. [#4387]DB2 z/OS now supports the
replaceIfExists="true"
attribute increateProcedure
changesets, enabling Liquibase to create SQL withREPLACE OR EXISTS
prepended to procedure definitions. [#4404]
PostgreSQL
Fix bug in PostgreSQL
sequenceExists
precondition 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
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
logicalfilepath
attribute with different values at changelog and changeset levels.Use
include/includeAll
to 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-exception
and--reports-suppress-sql.
New checks settings files can be created without CLI prompts by adding
--force
to thechecks show
command.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-checksum
command.Added two new command parameters to the
history
command so users can better see tagged deployments without having to directly examine the DATABASECHANGELOG table.--show-tags
will return only the tagged deployment history.--tag-filter
will 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
runOnChange
orrunAlways
will fail validation.If an XML changelog is generated with the
generate-changelog
command 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
cloneTable
generic 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_id
column 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_KEY
toliquibase-aws-extension
in #2058 by @sayaliM0412DAT-18892: create
checks show
files without prompting in #2050 by @StevenMassaroDAT-18129: update
checks run
output 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
MaxAffected
checks in #2039 by @abrackxDAT-18793: replace
slf4j-simple
withslf4j-nop
in #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 project
to core in #2004 by @abrackxDAT-18328 Update to match core for
stripComments
inmodifyChangeSets
in #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-python
from 5.1.0 to 5.3.0 in #2008 by @dependabot botBump
com.github.jsqlparser:jsqlparser
from 4.9 to 5.0 in #1866 by @dependabot botRevert "Bump
com.github.jsqlparser:jsqlparser
from 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.yml
to get the previous version by @sayaliM0412(#6490) DAT-18995: populate proper
client_payload
fordry_run
by @sayaliM0412(#6498) Change automated release file version to main by @tati-qalified
(#6497) DAT-18995: Default
dry_run
value tofalse
by @sayaliM0412(#6415) Add flag to top-level
Scope
to suppress logging of exceptions in certain cases by @wwillard7800(6472) Fail validation for blank changeset IDs (DAT-18773) by @abrackx
(#6451) Migrate
init project
command to core (DAT-15504) by @abrackx(#6514) DAT-18995 by @sayaliM0412
(#6515) Recognize
isIO
environment variable for analytics (DAT-18906) by @StevenMassaro(#6509) Replace
slf4j-simple
withslf4j-nop
(DAT-18793) by @StevenMassaro(#6373) Report which
codePoint
is illegal for XML data export by @catull(#6512) Liquibase API: Add missing
changeLogParameters
argument 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
includeAll
setting (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-checks
property 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
GenerateChangelogCommandStep
only 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
stdout
by @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
copy
method inFilesystemProjectCopier
(DAT-18890) by @abrackx(#6328) Add
stub
attribute toCommandStep
interface to recognize stub commands by @wwillard7800(#6558) Handle duplicates in sub-commands with
stub
method (DAT-19049) by @wwillard7800(#6575) Add flag to turn off compatibility check for
liquibase-checks
indrop-all
by @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&TestPro
by @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
checks
JAR (DAT-19289) by @wwillard7800(#6617) Verify test count only if base branch is
master
by @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
NetUtilTest
when 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
FormattedSqlChangeLogSerializer
so it includeslogicalFilePath
in change-set info comments by @benjamin-bader(#6405) Fix ignore int sizes when diffing MSSQL by @filipelautert
(#6492) Fix (DAT-18813): classloader configuration in
LiquibaseCommandLine
by @filipelautert(#6343) Fix #6342 - Liquibase Output changeset executes twice by @jasonlyle88
(#6519) Fix the XSD adding the
nullPlaceholder
attribute forloadData
column by @davidecavestro(#6578) Fix fossa ai execution for contributed PRs by @filipelautert
(#6590) Fix Checksum for SQL changes containing
dbms
attributes can get different values ifmd5sum
column isnull
by @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-artifacts
to 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-suite
from 1.11.3 to 1.11.4 @dependabot(#6433) Bump
org.firebirdsql.jdbc:jaybird
from 5.0.5.java8 to 5.0.6.java8 by @dependabot(#6477) Bump
org.apache.maven.plugins:maven-javadoc-plugin
from 3.10.1 to 3.11.1 by @dependabot(#6468) Bump
wangyucode/sftp-upload-action
from 2.0.2 to 2.0.3 by @dependabot(#6467) Bump
org.apache.maven.plugins:maven-plugin-plugin
from 3.15.0 to 3.15.1 by @dependabot(#6460) Bump
actions/setup-python
from 5.2.0 to 5.3.0 by @dependabot(#6455) Bump
org.nanohttpd:nanohttpd
from 2.2.0 to 2.3.1 by @dependabot(#6448) Bump
org.testcontainers:testcontainers-bom
from 1.20.2 to 1.20.3 by @dependabot(#6449) Bump
actions/cache
from 4.1.1 to 4.1.2 by @dependabot(#6479) Bump
org.apache.maven.plugins:maven-failsafe-plugin
from 3.5.1 to 3.5.2 by @dependabot(#6478) Bump
org.apache.maven.plugins:maven-surefire-plugin
from 3.5.1 to 3.5.2 by @dependabot(#6500) Bump
groovy.version
from 4.0.23 to 4.0.24 by @dependabot(#6454) Bump
org.xerial:sqlite-jdbc
from 3.46.1.3 to 3.47.0.0 by @dependabot(#6480) Bump
org.hsqldb:hsqldb
from 2.7.3 to 2.7.4 by @dependabot(#6475) Bump
net.snowflake:snowflake-jdbc
from 3.16.1 to 3.20.0 by @dependabot(#6496) Bump
org.sonarsource.scanner.maven:sonar-maven-plugin
from 4.0.0.4121 to 5.0.0.4389 by @dependabot(#6522) Bump
org.projectlombok:lombok
from 1.18.34 to 1.18.36 by @dependabot(#6531) Bump
org.testcontainers:testcontainers-bom
from 1.20.3 to 1.20.4 by @dependabot(#6527) Bump
commons-io:commons-io
from 2.17.0 to 2.18.0 by @dependabot(#6603) Bump
org.liquibase.ext:liquibase-sdk-maven-plugin
from 0.10.23 to 0.10.25 by @dependabot(#6594) Bump
org.assertj:assertj-core
from 3.26.3 to 3.27.0 by @dependabot(#6584) Bump
org.junit.jupiter:junit-jupiter
from 5.11.3 to 5.11.4 by @dependabot(#6581) Bump
junit-jupiter.version
from 5.11.3 to 5.11.4 by @dependabot(#6577) Bump
org.apache.commons:commons-text
from 1.12.0 to 1.13.0 by @dependabot(#6568) Bump
org.apache.maven.plugins:maven-javadoc-plugin
from 3.11.1 to 3.11.2 by @dependabot(#6561) Bump
org.apache.commons:commons-compress
from 1.26.2 to 1.27.1 by @dependabot(#6614) Bump
org.xerial:sqlite-jdbc
from 3.47.0.0 to 3.47.2.0 by @dependabot(#6582) Bump
org.junit.platform:junit-platform-suite
from 1.11.3 to 1.11.4 by @dependabot