A new Liquibase-Redshift extension is now available at https://github.com/liquibase/liquibase-redshift. 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.
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 https://github.com/liquibase/liquibase-hibernate 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.
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.
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.
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.
Lots of good bugfixes in 3.0.7, but major improvements are:
- Significantly decreased memory usage, especially with large sql files
- Improved checksum performance
- Fixed SQLite support
- Improvements to data type handling, especially in MS SqlServer
Discovered Checksum Issue: It was recently discovered that a change in the 3.0.5 release caused changeSets with <update> and <delete> changeSets with <where> clauses to compute a different checksum version than the 3.0.0-3.0.4 release. I decided to leave the 3.0.5 fix in because at this point, people would be affected by either leaving or reverting the change and keeping it in will preserve the bugfix. If you are upgrading from 2.x or 3.0.5+, this will not affect you. If you are upgrading from 3.0.0 through 3.0.4 and have no <update> or <delete> changeSets, this will not affect you. If you do run into this, you simply have to null out the md5sum column in databasechangelog for the affected changesets. This can be done either through an “update databasechangelog set md5sum=null” call or a more targeted ”update databasechangelog set md5sum=null where id=’AFFECTED_ID’ and author=’AFFECTED AUTHOR’”. There is also a “liquibasec learCheckSums” command that runs the update query.
Download Liquibase from http://liquibase.org/download 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-1247] – [Sqlite] bad syntax in create table statements with single autoincrement primary key
- [CORE-1275] – LoadData insert statements do not escape column names containing an open paren
- [CORE-1312] – Error when creating changelog tables
- [CORE-1399] – IncludeAll Failing when running in WAR files
- [CORE-1440] – Invalid Reorg table statement gets generated on DB2
- [CORE-1504] – dbDoc should html-encode author names
- [CORE-1506] – updateSQL generates invalid SQL for oracle
- [CORE-1507] – dropAll fails with NullPointerException
- [CORE-1509] – Memory improvements for large sqlFile files
- [CORE-1510] – Maven plugin fails to configure parameters within property file with trailing spaces, error message misleading
- [CORE-1511] – modifyDataType truncates enum values
- [CORE-1512] – Insert with valueClobFile fails with unicode encoding.
- [CORE-1515] – Liquibase MSSQL: Snapshot incorrectly injecting size for some datatypes
- [CORE-1516] – Liquibase MSSQL: Snapshot recording incorrect size for VARBINARY
- [CORE-1517] – Liquibase MSSQL: Autoincrement property of decimal datatype not supported
- [CORE-1518] – Liquibase MSSQL: Incorrect datatypes captured in the snapshot
- [CORE-1520] – Liquibase Snapshot: Default datetime is wrong
- [CORE-1521] – When generateChangeLog is run, objects do not always come back in a consistent order
- [CORE-1522] – PreparedStatement.setCharacterStream() not supported by Postgres JDBC driver.
- [CORE-1524] – Ant diff command running diffChangeLog
- [CORE-1525] – Liquibase MSSQL: Snapshot not capturing alter statements that add default values
- [CORE-1526] – Unicode string escaping in MSSQL
- [CORE-1530] – Column called VERSION is quoted in PostgreSQL
- [CORE-1531] – includeAll with relativeToChangeLogFile fails under certain conditions
- [CORE-1532] – NPE in ChangedIndexChangeGenerator
- [CORE-1534] – Single quotes in liquibase.bat causing issues
- [CORE-1519] – Allow relative file paths for valueClobFile and valueBlobFile inserts/updates.
- [CORE-1533] – Performance improvements in dropAll
There has been a lot of activity the last couple weeks on the Liquibase extensions I manage and/or have source access to. There were a few running up against the Oct 15th jira-svn-shutdown deadline and also several that had not been updated to support Liquibase 3.0 yet.
For all of the extensions, I have moved their source repository out of the shared liquibase.jira.com subversion repository and into their own repositories at https://github.com/liquibase. They all now have their own issue tracking, wiki, and releases tab in their Github projects, which is the pattern I will be using for all the Liquibase-managed extensions.
I also released the new builds into Maven under the org.liquibase.ext group (some may still be propagating through the mirrors).
The recently updated extensions are:
Oracle Database Support (https://github.com/liquibase/liquibase-oracle)
Improved support for Oracle database. Adds additional refactoring tags and snapshot support for Oracle-specific object types
Hana Database Support (https://github.com/liquibase/liquibase-hanadb)
Support for SAP’s Hana Database
Teradata Database Support (https://github.com/liquibase/liquibase-teradata)
Adds support for Teradata database. Still in beta because I am looking for Teradata users to test it
No Change Log Update (https://github.com/liquibase/liquibase-nochangelogupdate)
Makes Liquibase run without updating the DATABASECHANGELOG table. Not what you normally want, but there are times it is handy
java.util.Logger Support (https://github.com/liquibase/liquibase-javalogger)
Log through java.util.Logger rather than STDERR
Sequence Table (https://github.com/liquibase/liquibase-sequencetable)
Support “sequence tables” like Hibernate can use for databases that do not support native schemas
Modify Column (https://github.com/liquibase/liquibase-modify-column)
Support for the deprecated <modifyColumn> change from Liquibase 1.x
The main “Liquibase Extension Portal” is still at liquibase.org/extensions, the above extensions are simply the subset of extensions that I tend to manage. In the upcoming weeks, I will be working to improve the extension portal and the extension writing process in general (including better documentation)
After far too long, a new version of the Liquibase-Hibernate extension has been released!
Downloads, documentation, and issue tracking is hosted at github.com/liquibase/liquibase-hibernate. The extension is also available through Maven with group org.liquibase.ext, artifacts liquibase-hibernate3 and liquibase-hibernate4.
Liquibase 3.0 Support
If you’ve been stuck on Liquibase 2.0 because of the old hibernate integration, the wait is over. The extension requires Liquibase 3.0.6+, so make sure you are on the newest version of Liquibase.
Hibernate 4 Support
There are two separate jar files available: liquibase-hibernate3.jar and liquibase-hibernate4.jar. Use the version that corresponds to your Hibernate version
EJB3 Configuration Support
If you are using the EJB3-style persistence.xml file, you can now use a database url of “hibernate:ejb3:yourPersistenceUnit“.
Spring Configuration Support
If your Hibernate configuration is specified in Spring, you can now use a database of “hibernate:spring:your/path/spring.xml?bean=sessionFactory” to pull the Hibernate configuration from your spring context.
Programmatic Configuration Support
You can now create your Hibernate configurations dynamically by implementing liquibase.ext.hibernate.customfactory.CustomClassicConfigurationFactory or liquibase.ext.hibernate.customfactory.CustomEjb3ConfigurationFactory and reference the classes in your database url. For example, “hibernate:classic:com.example.YourFactory” or ”hibernate:ejb3:com.example.YourFactory”
- The standard database url has changed from “hibernate:path/to/your/file.xml” to “hibernate:classic:path/to/your/file.xml”
- Requires Liquibase 3.0.6+
- Jar name has changed from liquibase-hibernate.jar to liquibase-hibernate3.jar (or liquibase-hibernate4.jar)
I’m happy to announce Liquibase 3.0.6 has been released. While the previous release focused on performance, this release was focused on catching up with pull requests and resolving some of the higher value bugs.
Some highlights and important notes:
- IMPORTANT: CDI support has been pulled into a separate liquibase-cdi module. If you are using the CDI integration you need to download the additional jar from http://search.maven.org/#search%7Cga%7C1%7Cliquibase-cdi
- IMPORTANT: The DatabaseChangeLog table no longer contains a primary key which allows us to increase the column sizes without running into index limitations. Author, Id, and Path can all be 255 characters now. This just applies to new changelog tables, though. Liquibase will not adjust an existing changelog table to increase the size.
- New liquibase.integration.spring.MultiTenantSpringLiquibase integration that runs Liquibase against all database instances in a JNDI subtree
- Command line supports prompting for command line variables by using PROMPT as a value in the passed arguments. For example “liquibase –username=test –password=PROMPT”
- Added support for Sybase IQ
- Fixed Firebird support
- Fixed include relativeToChangeLog
- Improvements to Fixes in case [in]sensitive comparison logic
- Corrections in the Oracle data type snapshot process
- Better handling of Mysql keywords
Download Liquibase from http://liquibase.org/download 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-1088] – Derby fails to create databasechangelog tables
- [CORE-1093] – generateChangeLog fails on MSSQL with coalation CS on views named in lowerCase
- [CORE-1158] – Escaping of reserved keywords in HSQLDB
- [CORE-1170] – loadUpdateData sometimes needs / and sometimes not
- [CORE-1177] – Failure to write a change set to the DATABASECHANGELOG table still applies the change set
- [CORE-1325] – CDI injection does not work with openwebbeans
- [CORE-1343] – Include SQL file with relativeToChangelogFile doesn’t work
- [CORE-1378] – Deploy fails on Glassfish
- [CORE-1409] – Package CDI support as a separate module
- [CORE-1436] – loadUpdateData does not escape apostrophes
- [CORE-1437] – Diff is case-sensitive on column names
- [CORE-1440] – Reorg Table gets called before table is created on DB2
- [CORE-1441] – Drop table with cascade does not work on MS SQL Server
- [CORE-1443] – Documentation for liquibase maven logging configuration needs update
- [CORE-1445] – Mysql Reserved Words Not quoted
- [CORE-1449] – Liquibase throws null pointer if included file does not exist
- [CORE-1464] – SQL changelog are not correctly handled (NPE)
- [CORE-1465] – GetViewDefinitionGeneratorMSSQL generates UPPER case view name
- [CORE-1469] – GenerateChangelog not working on Firebird
- [CORE-1470] – Use NUMERIC instead of NUMBER for Sybase ASE
- [CORE-1478] – MySQL keywords `key’ not quoted as a column name
- [CORE-1479] – MySQL 5.5.27 fails to create DATABASECHANGELOG table (Liquibase support fully broken)
- [CORE-1480] – ChangedPrimaryKeyChangeGenerator missing name
- [CORE-1481] – Schema.toString NPE
- [CORE-1482] – Update fails with “Table DATABASECHANGELOGLOCK already exists”
- [CORE-1483] – Boolean values of “false” being incorrectly handled
- [CORE-1488] – Encoding issue with UpdateSQL
- [CORE-1490] – Oracle 10g: Changelog generation changes type NUMBER(*,0) to NUMBER(22)
- [CORE-1491] – Oracle 10g: changelog generation converts VARCHAR2(n CHAR) to VARCHAR2(n BYTE)
- [CORE-1497] – SQL SERVER: sysdiagram table is captured during generateChangeLog if system diagrams are enabled.
- [CORE-1499] – null appearing in liquibase maven output
- [CORE-1500] – Snapshots do not order objects alphabetically
- [CORE-1501] – Incorrect SQL generated for default column value in PostgreSQL for text columns
- [CORE-602] – Increase the default size of the FILENAME column
- [CORE-1475] – Support entering password(s) interactively on the command line
- [CORE-1477] – Support overriding LockService changeLogWaitTime
- [CORE-1485] – Extract CDI support into a separate module
- [CORE-1492] – DatabaseChangelog Description useless
- [CORE-1502] – CLONE – UpdateSQL needs to append a “/” to the end of createProcedure for Oracle
- [CORE-1448] – Throw a more helpful error message and continue on if snakeyaml isn’t in the classpath
- [CORE-1471] – Add support for Sybase IQ
- [CORE-1472] – Support multi-tenant spring applications
For the last two months I have been working full time as an employee with Datical, a startup that is building an enterprise-ready database change management solution on top Liquibase.
For me, it has been great because I am now able to devote considerably more time to Liquibase than I ever have before. Since starting Liquibase 7 years ago, I’ve ran it as a side hobby–spending a few night and weekend hours doing what I can to progress the project. However, as the community and user base has grown it had become difficult to keep pace. You may have noticed that during the 3.0 development timeline, I tended to oscillate between spending all my time writing code without answering any user questions and answering questions without writing code simply because I just didn’t have enough time to do everything I needed to.
So what does this change in employment mean for Liquibase? Nothing but good things!
Liquibase remains and always will be a freely available open source project. At Datical, we know the value of a strong open source project and community, and my primary responsibility at Datical is to spend as much time on Liquibase as possible in order to improve it for ourselves and for everyone else. In short, my job is to do what I have always done but with more focus and more resources.
Now that I have full days worth of time to spend on Liquibase, I have already been able to pick up the pace of Liquibase releases plus keep up with the user forums. It has been great!
In the coming months, look for more great changes to Liquibase including:
- Improved Documentation
- More extensions (New Liquibase/Hibernate Extension should be out this week)
- Regular and frequent releases
- Easier use
- Enhanced extension portal
- More community interaction
- Streamlined extension writing tools
- More support and training options and opportunities
If you would like more information on Datical and DaticalDB you can read their official launch announcement. Or, as always, ask questions in the blog comments, in the Liquibase forum, or contact me directly at firstname.lastname@example.org.
The major focus of this release is performance improvements:
- Startup time is significantly improved for larger databases
- Preconditions now snapshot far less of the database
- Running generateChangeLog on a test MySQL database with over 4000 tables went from crashing after an hour to completing in 30 seconds. Even an Oracle database with the same structure finished in a couple minutes.
If you are still seeing any unexpected performance problems, file a bug report
You can download 3.0.5 from http://liquibase.org/download and through the maven repository system once it gets mirrored through. If you have any questions or problems, visit the forums or bug tracker
- Multi-column foreign keys are snapshotted correctly now
- Improved case-sensitive/insensitive handling
Three bug fixes related to data type translations went into 3.0.5 which may cause issues for people that had been relying on incorrect behavior
- MS SQLServer “DATE” columns are now translated to “DATE” rather than SMALLDATETIME
- MySQL TIMESTAMP columns are now nullable if you do not specify that they should be not null
- H2 and HSQL CLOB columns are now translated as CLOB rather than LONGVARCHAR
Full Change Log
- [CORE-845] – “DATE” data type is deployed as “SMALLDATETIME” in SQL 2008
- [CORE-859] – Nullable TIMESTAMP columns in MySQL are not nullable.
- [CORE-1257] – Oracle: generateChangeLog exports a column of type “NUMBER” as “NUMBER(0,-127)”
- [CORE-1288] – H2 (and other) support for BLOB and CLOB is incorrect
- [CORE-1338] – Using apostrophe in changeset’s ID causes SQL error
- [CORE-1360] – Confirmation message of a custom change change is only printed if loglevel is debug
- [CORE-1364] – SQL Server incorrect INFORMATION_SCHEMA table case in native query
- [CORE-1365] – SQL Server: “Database ‘dbo’ does not exist” error
- [CORE-1401] – Unnecessary snapshot on liquibase update
- [CORE-1415] – Liquibase tables are not detected in oracle running in the SYSTEM schema
- [CORE-1426] – ORACLE: Check for existing tables is case sensitive
- [CORE-1429] – Random order of UniqueConstraint and ForeignKey drop statements
- [CORE-1459] – Maven updateSQL creates databasechangelog table, should only output SQL to do it
- [CORE-1462] – renameColumn with ‘text’ data type improperly trying to use ‘clob’ against MySql
- [CORE-1433] – Handle changes in column datatypes in diffChangeLog
- [CORE-1434] – Formatted Changelog format not parsing UTF8 .sql files with BOM
- [CORE-1453] – Multi-column foreign keys not snapshotted correctly