Slides From Percona Live Talk

I posted the slides from my Percona Live talk at

I modified them from the actual talk slides to also include my speaking notes so they will be more helpful for those who were not able to make it to the talk or if you wish you took better notes.

I’m hoping to post a recorded version of the talk in the next few weeks as well.

Liquibase talk at Percona Live

I’ll be giving a talk at Percona Live in Santa Clara on April 3rd titled “Liquibase: Source Control For Your Schema“.

It is a beginner-level course covering Liquibase basics plus some best practices. More information

If you will be there, stop by and say hi. It’s always great to hear from people using or considering using Liquibase. If you have not yet registered, use the promotional code “SeeMeSpeak” for a 10% discount.

Liquibase-Hibernate Extension 3.3 Released

The Liquibase hibernate extension has been updated for both hibernate 3 and hibernate 4.

Major changes include:

  • Support for Liquibase 3.1.1
  • Support for Hibernate 4.3+ NOTE: Due to hibernate incompatibilities, Hibernate 4.0-4.2 requires the use of the liquibase-hibernate4.2 extension
  • Support for compound primary keys
  • Improved support for detecting auto-increment columns

See for more information and to download the 3.3 release.

The new versions are also working their way through the maven mirror system


Liquibase 3.1.1 Released

Liquibase 3.1.1 has been released with a few bug fixes.

The most important fixes reverts how <createProcedure> checksums are computed so they are compatible with 3.0 and fix the new <rowCount> and <tableIsEmpty> preconditions.

The newest version can be download from

Change log:

  • [CORE-1704] – Checksum errors for changeSets with createProcedure in 3.1.0 vs 3.0.x
  • [CORE-1707] – TableRowCountGenerator shouldn’t pass tableName as catalogName
  • [CORE-1710] – Oracle: NUMBER data type size specification is deployed with a precision specifier even though precision isn’t specified in the change log
  • [CORE-1711] – rowCount doesn’t work if only the tableName is given
  • [CORE-1713] – liquibase.precondition.core.ForeignKeyExistsPrecondition exception
  • [CORE-1715] – 2 -> 3.1 migration, 3.1 errors if there are single quotes in comments
  • [CORE-1709] – generateChangeLog returns tables created by Materialized Views as standard tables


Liquibase 3.1.0 Released

Liquibase 3.1.0 has been released.  For most people 3.1 is a drop in replacement for 3.0.

If you use <includeAll> with relative paths or are running against MaxDB, DB2 for iSeries, or InterSystems Cache make sure you read the  upgrade guide.


Besides bugfixes, 3.1 adds the following major features:

Offline Database Support!

One of the most requested features is the ability to use Liquibase when you do not have direct access to the database. We have always had updateSql support, but it still required a database connection to know what has been ran and what type of database to generate SQL for.

With the new “offline” support, you can now define a database connection URL like “offline:mysql” or “offline:oracle?version=11.1” when you run updateSql.

In offline mode, the change history is tracked in a local csv file which can be controlled with the “changeLogFile” URL parameter. For example: offline:mysql?changeLogFile:/home/db/changelog.csv

For more information, see the offline database documentation

Alternate Changelog History Tracking

With 3.1, you can now create extensions that manage changelog history tracking differently than the standard “DATABASECHANGELOG” table. For example, allows you to manage your changelog history using a local file rather than a table in the database.

New and Improved Change tags:

  • <createProcedure>now supports referencing an external file containing the procedure definition with a new “path” attribute
  • <createProcedure> now supports a dbms attribute to target the database(s) the procedure is compatible with. This allows you to have a single changeSet with a procedure definition for each supported database
  • New <dropProcedure> change
  • <addColumn> supports new “beforeColumn”, “afterColumn” and “position” attributes to control column ordering
  • <sqlFile> files support ${} parameters

New and Improved Precondition tags:

  • <foreignKeyConstraintExists> now supports checking based on table and column definition. Not just constraint name
  • New <tableIsEmpty> precondition
  • New <rowCount> precondition

Database Support Improvements

  • MySQL ENUM and SET type support improvements
  • MySQL support for date/time/timestamp size parameter
  • MySQL support for column remarks
  • MS SqlServer support for sequences (2012+)
  • Sybase general support improvements
  • DB2 general support improvements

Extension/API Improvements

  • liquibase.changelog.visitor.ChangeExecListener implementations are notified of precondition and change-level interactions
  • SnapshotGenerator extensions can block incorrect functionality from other SnapshotGenerators
  • Extensions can define custom XSDs and namespaces

Other Features and Improvements

  • Formatted SQL now supports a comma-separated list in “dbms” targeted changeSets
  • Maven support for futureRollbackSql command


Liquibase 3.0.8 Released

Liquibase 3.0.8 is officially released. It is purely a bugfix release that covers improvements to data type handing, performance improvements, and much more.


Download Liquibase from or from the Maven repository as it winds its way through the mirror process. Visit the user forums if you have any questions.

All Closed Issues

  • [CORE-1224] – Enum column types are not appropriately represented in the change log created by generateChangeLog
  • [CORE-1299] – modifyDataType does not auto reorg on DB2
  • [CORE-1302] – MySQL syntax for autoincrement column with start value
  • [CORE-1357] – Postgresql sequences create error in log files
  • [CORE-1368] – Unable to recreate DB from generated change logs
  • [CORE-1427] – Not generateChangeLog properly for INT2 type for Postgres
  • [CORE-1430] – When I was in sybase database using liquibase create the index, reported “information_schema.constraints” not found error
  • [CORE-1432] – Liquibase H2 InsertOrUpdateGeneratorH2 fails if primary key column name contains $ character
  • [CORE-1446] – Liquibase changelog generation can add linefeed to defaultValueComputed if last column
  • [CORE-1454] – Precondition negation does not seem to work
  • [CORE-1455] – Value not taken into account when inserting data with YAML
  • [CORE-1484] – very poor performance of dropAll on Oracle
  • [CORE-1496] – Custom Change validation happening before being fully initialized
  • [CORE-1531] – includeAll with relativeToChangeLogFile fails under certain conditions
  • [CORE-1537] – Liquibase: diffChangeLog on DB2 performing out of order steps
  • [CORE-1538] – diffChangeLog for DB2 injects invalid characters in xml
  • [CORE-1540] – Call ‘Reorg table’ after modifyDataType on DB2
  • [CORE-1541] – Column type=”LONGVARCHAR” fails
  • [CORE-1545] – Oracle wrong LONG datatype declaration
  • [CORE-1547] – CLONE – H2 (and other) support for BLOB and CLOB is incorrect
  • [CORE-1548] – Oracle Data Type: DATE – defaultValueComputed should be defaultValue
  • [CORE-1549] – Oracle Data Type: INTERVAL YEAR TO MONTH – returned at “INTERNAL(2) YEAR”
  • [CORE-1550] – Oracle Data Type: NCLOB – Receive SQL error when specifying NCLOB size
  • [CORE-1551] – Oracle Data Type: NCHAR
  • [CORE-1552] – Oracle Data Type: NVARCHAR2 – Column sizing is wrong
  • [CORE-1553] – dropDefaultValue does not work on SQL Server
  • [CORE-1554] – dbDoc for Informix IDS
  • [CORE-1555] – Oracle UID reserved word not detected
  • [CORE-1557] – Mysql: BLOB type changes to LONGBLOB
  • [CORE-1559] – Columns defined as “serial” are created as “int” without autoincrement in Postgres
  • [CORE-1562] – update throws Recoverable Exception
  • [CORE-1564] – Broken links in dbDoc
  • [CORE-1566] – DB2 Datatype – DBCLOB, GRAPHIC, VARGRAPHIC doubling datatype size
  • [CORE-1567] – DB2 Datatype – defaultValueComputed being used instead of defaultValue for DBCLOB, TIME, TIMESTAMP, DATE
  • [CORE-1568] – DB2 Datatype – REAL and XML should not have datatype sizes
  • [CORE-1571] – updateDatabase can’t find a changelog
  • [CORE-1572] – Regression: diff generates full schema instead of changes when using liquibase-hibernate4
  • [CORE-1580] – Mysql SET type not handled correctly
  • [CORE-1581] – modifyDataType ignores additional info of newDataType
  • [CORE-1582] – SQLServer datatype for TIMESTAMP
  • [CORE-1583] – Wrong datatype with renameColumn
  • [CORE-1584] – Unable do rollback not in transaction block
  • [CORE-1586] – MySQL DataType – defaultValueComputed being injected into TIMESTAMP, VARBINARY, BINARY, YEAR
  • [CORE-1587] – MySQL Datatype – VARBINARY vs LONGBLOB confusion
  • [CORE-1588] – MySQL DataType – BIT size and default not captured on Snapshot
  • [CORE-1589] – MySQL DataType – BLOB becomes LONGBLOB
  • [CORE-1590] – MySQL DataType – DOUBLE sizing not persisted on snapshot
  • [CORE-1591] – MySQL DataType – TIME not persisting seconds (getting hours and I’ve got that going for me.)
  • [CORE-1592] – MySQL DataType – TEXT converted to LONGTEXT
  • [CORE-1594] – PostgreSQL ‘bigserial’ type is automatically converted to ‘bigint’
  • [CORE-1595] – Schema version incompatibility is logged as INFO instead of WARN
  • [CORE-1596] – Liquibase 3.0.5 will not create tables in dbo schema in SQL Server
  • [CORE-1597] – ORA-01000: maximum open cursors exceeded
  • [CORE-1600] – “Collation” and “Lateral” are not escaped in Postgres (new reserved words in v9.3)
  • [CORE-1602] – DatabaseException in changesets that include date fields with default values
  • [CORE-1603] – MySQL Datatype – BIGINT, INT, MEDIUMINT, SMALLINT, TINYINT all “shaving” off sizes
  • [CORE-1606] – MySQL – TEXT vs. LONGTEXT for diffChangeLog presents CLOB
  • [CORE-1607] – MSSQL java.sql.Types.TIMESTAMP should map to DateTime
  • [CORE-1610] – MSSQL – NTEXT type being snapshot with MSSQL driver default size parameter.
  • [CORE-1611] – Avoid reverse DNS lookup with getLocalHost().getHostName();
  • [CORE-1612] – YAML/JSON changelogs not picking up “value” attribute on column configs
  • [CORE-1614] – mysql case insensitive affects databasechangelog creation
  • [CORE-1615] – Failed to drop default value in MSSQL
  • [CORE-1616] – SQLFileChange uses too many file descriptors
  • [CORE-1619] – MSSQL: preconditions treat object names in a case-sensitive way
  • [CORE-1622] – Ant not respecting diffTypes=data
  • [CORE-1623] – MSSQL: precondition primaryKeyExists doesn’t work
  • [CORE-1625] – H2 Blob Type support is incorrect
  • [CORE-1626] – createIndex does not work for function based indexes anymore
  • [CORE-1627] – Option ‘diffTypes’ does not accept type ‘indexes’
  • [CORE-1632] – It’s impossible to setup Logger’s log level with system property ‘liquibase.defaultlogger.level’
  • [CORE-1636] – Case sensitivity issue with tableExists precondition
  • [CORE-1640] – foreignKeyExists precondition always failing
  • [CORE-1641] – Add column with foreign key throws NPE
  • [CORE-1644] – ValidationFailedException after update to 3.0.7
  • [CORE-1646] – Exception when comparing two schemas
  • [CORE-1647] – Mysql enum default values not quoted
  • [CORE-1648] – Mysql columns with colons and other special chars are not quoted
  • [CORE-1664] – MSSQL. “DATE” type doesn’t exist for MSSQL 2005 and 2000.
  • [CORE-1382] – Allow to create DATABASECHANGELOG* tables in another schema
  • [CORE-1546] – Schema-Support on Informix
  • [CORE-1577] – Oracle tinyint, smallint, int being created as number(38,0)
  • [CORE-1604] – Minor maven pom cleanups
  • [CORE-1635] – Generated changelog missing unique constraints should be output before foreign keys

Experimental Amazon Redshift Support

A new Liquibase-Redshift extension is now available at If you are interested in trying out Liquibase with Amazon Redshift, give it a try and let me know how well it works.

You can download the most recent builds from the “releases” tab.

Liquibase-Hibernate Extension 3.1 Released

The Liquibase hibernate extension has been updated for both hibernate 3 and hibernate 4.

This release adds support for catching changes to sequences and unique constraints as well as a few bugs around data type handling.

See for more information and to download the 3.1 release.

 UPDATE: A null pointer issue was found in the 3.1 release and fixed in a now available 3.2 release.

Liquibase Survey Ends November 15th

If you haven’t yet filled out the Liquibase 2013 Survey now is the time–it will be available only through the end of Friday, November 15th.

There have been some great comments and feedback so far and thank you to everyone who has taken the time so far to submit a response.

For those interested, I will post a summary of the results before the end of November.

—–> Liquibase Survey 2013 Form <—–


Liquibase Survey 2013

One problem with running an open source project is that we don’t really have “customers” to contact for feedback and product suggestions. I can definitely just add features that I think make sense, but one thing I’ve learned is that people use Liquibase in amazing ways I would never have imagined.

That is where the Liquibase survey comes in: it is your chance to provide feedback on how you use Liquibase and what is important to you so that I can better prioritize efforts over the next year.

Your participation and time is greatly appreciated.

—–> Liquibase Survey 2013 Form <—–


If you know others that use Liquibase, please forward them the survey as well.

Even better, if you know someone who is NOT using Liquibase, send them the survey as well.

The more information I can gather the better picture I will have.