While starting a SpringBoot/JHipster MariaDB application, I ran into this Liquibase database update error:
liquibase.exception.MigrationFailedException: Migration failed for changeset config/liquibase/changelog/00000000000000_initial_schema.xml
This was not a fresh database initialization, but an upgrade of an existing databse wich was recently moved to a new MariaDB server. Yet the error pointed to the initialization changeset.
The issue came from the liquibase change log tables, named DATABASECHANGELOG and DATABASECHANGELOGLOCK, uppercase. Our database naming convention required lower case table names, hence the conversion to lower case of the liquibase change log table names. On the previous MariaDB Server, table names where case insensitive, this was not the case anymore on the new server, leading to the creation by Liquibase of two empty DATABASECHANGELOG and DATABASECHANGELOGLOCK tables, next to the databasechangelog and databasechangeloglock existing ones. Consequence: Liquibase was trying to initialize an already initialized database.
Here are three ways to solve this problem
Option 1 : Switch back to Liquibase default change log table names
That may not be elegant, but switching back to the default Liquibase change log table names will fix the issue, and prevent similar future issues. For example, when using SpringBoot, I had to rename the tables in two places : in the SpringBoot “application.yml” file, and in the Maven “pom.xml” file. That wouldn’t have been required would I have stuck to the default table names.
Option 2 : Disable case sensitivity for MariaDB table names
Changing the database configuration ensures that you won’t encounter the issue with any Liquibase application. However, when ever you change server you’ll have to enable this setting, and this may be an issue in the unlikely case where a database has two tables with the same name but different case.
The MariaDB ‘lower_case_table_names’ setting in my.cnf enables table name case insensitivity, by forcing all table names to be lowercase. To check if it’s enabled, use :
SHOW GLOBAL VARIABLES LIKE ‘lower_case_table_names’;
SHOW GLOBAL VARIABLES LIKE 'lower_case_table_names';
If ‘lower_case_table_names’ = 0, follow this procedure to change the parameter value in the MariaDB configuration files :
[mariadb]
lower_case_table_names=1
Option 3 : Specify Liquibase change log table names in SpringBoot application.properties file
Eventually, you can specify your Liquibase change log table names in your application.properties or application.yml file, as explained here, using the spring.liquibase.database-change-log-lock-table and spring.liquibase.database-change-log-table properties.
For example, in an application.yml file :
spring:
liquibase:
database-change-log-lock-table: 'databasechangeloglock'
database-change-log-table: 'databasechangelog'