Liquibase runs the update command to execute the ChangeSet sequentially and if encounters any error then aborts the execution and logs the message. but sometimes, the requirement is to keep on executing the ChangeSet irrespective of errors. for this, Liquibase provides failOnError an attribute, by default failOnError has value true, hence execution fails if an error encounters, but if required, it can be set as false, and Liquibase will keep on executing the ChangeSet irrespective of errors.
the below changelog file contains 2 ChangeSet, 1 for inserting the data in the apple table, and the other for the creation of the vendor table. but the apple table doesn't exist in the database, hence Liquibase will be about the execution at apple table insertion ChangeSet and will not execute the vendor table creation ChangeSet.
changelog.mysql.sql
-- liquibase formatted sql
-- changeset wesome:1692446446077-1
INSERT INTO appledb.apple (apple_id, apple_name) VALUES (1, 'Macintosh');
-- changeset wesome:1692446446077-2
CREATE TABLE appledb.vendor (vendor_id BIGINT NOT NULL, vendor_name VARCHAR(20) NULL, active CHAR(1) NULL, apple_id INT NULL, CONSTRAINT PK_VENDOR PRIMARY KEY (vendor_id));changelog.mysql.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet author="shriksha (generated)" id="1692446190573-1">
<insert catalogName="appledb" tableName="apple">
<column name="apple_id" valueNumeric="1"/>
<column name="apple_name" value="Macintosh"/>
</insert>
</changeSet>
<changeSet author="shriksha (generated)" id="1692446190573-2">
<createTable catalogName="appledb" tableName="vendor">
<column name="vendor_id" type="BIGINT">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="vendor_name" type="VARCHAR(20)"/>
<column name="active" type="CHAR(1)"/>
<column name="apple_id" type="INT"/>
</createTable>
</changeSet>
</databaseChangeLog>changelog.mysql.yaml
databaseChangeLog:
- changeSet:
id: 1692446695953-1
author: wesome (generated)
changes:
- insert:
catalogName: appledb
columns:
- column:
name: apple_id
valueNumeric: 1
- column:
name: apple_name
value: Macintosh
tableName: apple
- changeSet:
id: 1692446695953-2
author: wesome (generated)
changes:
- createTable:
catalogName: appledb
columns:
- column:
constraints:
nullable: false
primaryKey: true
name: vendor_id
type: BIGINT
- column:
name: vendor_name
type: VARCHAR(20)
- column:
name: active
type: CHAR(1)
- column:
name: apple_id
type: INT
tableName: vendorchangelog.mysql.json
{
"databaseChangeLog": [
{
"changeSet": {
"id": "1692446435796-1",
"author": "wesome (generated)",
"changes": [
{
"insert": {
"catalogName": "appledb",
"columns": [
{
"column": {
"name": "apple_id",
"valueNumeric": 1
}
},
{
"column": {
"name": "apple_name",
"value": "Macintosh"
}
}
],
"tableName": "apple"
}
}
]
}
},
{
"changeSet": {
"id": "1692446435796-2",
"author": "wesome (generated)",
"changes": [
{
"createTable": {
"catalogName": "appledb",
"columns": [
{
"column": {
"constraints": {
"nullable": false,
"primaryKey": true
},
"name": "vendor_id",
"type": "BIGINT"
}
},
{
"column": {
"name": "vendor_name",
"type": "VARCHAR(20)"
}
},
{
"column": {
"name": "active",
"type": "CHAR(1)"
}
},
{
"column": {
"name": "apple_id",
"type": "INT"
}
}
],
"tableName": "vendor"
}
}
]
}
}
]
}liquibase.properties (update changeLogFile file format with SQL, XML, YAML, JSON as per changelog.mysql.<format>)
changeLogFile=changelog.mysql.xml
liquibase.command.url:jdbc:mysql://localhost:3306/AppleDb?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
liquibase.command.username: root
liquibase.command.password: rootrootcommand liquibase update will result into
Running Changeset: changelog.mysql.xml::1692446190573-1::wesome (generated)
Unexpected error running Liquibase: Migration failed for changeset changelog.mysql.xml::1692446190573-1::wesome (generated):
Reason: liquibase.exception.DatabaseException: Table 'appledb.apple' doesn't exist [Failed SQL: (1146) INSERT INTO appledb.apple (apple_id, apple_name) VALUES (1, 'Macintosh')]ChangeSet with failOnError as false
update the ChangeSet with failOnError="false" will make sure the ChangeSet execution will continue irrespective of error encounterd, and will create the vendor table in database.
changelog.mysql.sql
-- liquibase formatted sql
-- changeset wesome:1692446446077-1 failOnError="false"
INSERT INTO appledb.apple (apple_id, apple_name) VALUES (1, 'Macintosh');
-- changeset wesome:1692446446077-2
CREATE TABLE appledb.vendor (vendor_id BIGINT NOT NULL, vendor_name VARCHAR(20) NULL, active CHAR(1) NULL, apple_id INT NULL, CONSTRAINT PK_VENDOR PRIMARY KEY (vendor_id));changelog.mysql.xml
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
<changeSet author="wesome (generated)" id="1692446190573-1" failOnError="false">
<insert catalogName="appledb" tableName="apple">
<column name="apple_id" valueNumeric="1"/>
<column name="apple_name" value="Macintosh"/>
</insert>
</changeSet>
<changeSet author="wesome (generated)" id="1692446190573-2">
<createTable catalogName="appledb" tableName="vendor">
<column name="vendor_id" type="BIGINT">
<constraints nullable="false" primaryKey="true"/>
</column>
<column name="vendor_name" type="VARCHAR(20)"/>
<column name="active" type="CHAR(1)"/>
<column name="apple_id" type="INT"/>
</createTable>
</changeSet>
</databaseChangeLog>changelog.mysql.yaml
databaseChangeLog:
- changeSet:
id: 1692446695953-1
author: wesome (generated)
failOnError: false
changes:
- insert:
catalogName: appledb
columns:
- column:
name: apple_id
valueNumeric: 1
- column:
name: apple_name
value: Macintosh
tableName: apple
- changeSet:
id: 1692446695953-2
author: wesome (generated)
changes:
- createTable:
catalogName: appledb
columns:
- column:
constraints:
nullable: false
primaryKey: true
name: vendor_id
type: BIGINT
- column:
name: vendor_name
type: VARCHAR(20)
- column:
name: active
type: CHAR(1)
- column:
name: apple_id
type: INT
tableName: vendorchangelog.mysql.json
{
"databaseChangeLog": [
{
"changeSet": {
"id": "1692446435796-1",
"author": "wesome (generated)",
"failOnError": "false",
"changes": [
{
"insert": {
"catalogName": "appledb",
"columns": [
{
"column": {
"name": "apple_id",
"valueNumeric": 1
}
},
{
"column": {
"name": "apple_name",
"value": "Macintosh"
}
}
],
"tableName": "apple"
}
}
]
}
},
{
"changeSet": {
"id": "1692446435796-2",
"author": "wesome (generated)",
"changes": [
{
"createTable": {
"catalogName": "appledb",
"columns": [
{
"column": {
"constraints": {
"nullable": false,
"primaryKey": true
},
"name": "vendor_id",
"type": "BIGINT"
}
},
{
"column": {
"name": "vendor_name",
"type": "VARCHAR(20)"
}
},
{
"column": {
"name": "active",
"type": "CHAR(1)"
}
},
{
"column": {
"name": "apple_id",
"type": "INT"
}
}
],
"tableName": "vendor"
}
}
]
}
}
]
}liquibase.properties (update changeLogFile file format with SQL, XML, YAML, JSON as per changelog.mysql.<format>)
changeLogFile=changelog.mysql.xml
liquibase.command.url:jdbc:mysql://localhost:3306/AppleDb?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
liquibase.command.username: root
liquibase.command.password: rootroot
loglevel=INFOcommand liquibase update will result into
INFO [liquibase.ui] Running Changeset: changelog.mysql.xml::1692446190573-1::wesome (generated)
SEVERE [liquibase.changelog] ChangeSet changelog.mysql.xml::1692446190573-1::wesome (generated) encountered an exception.
INFO [liquibase.changelog] Changeset changelog.mysql.xml::1692446190573-1::wesome (generated) failed, but failOnError was false. Error: Table 'appledb.apple' doesn't exist [Failed SQL: (1146) INSERT INTO appledb.apple (apple_id, apple_name) VALUES (1, 'Macintosh')]
Running Changeset: changelog.mysql.xml::1692446190573-2::wesome (generated)
INFO [liquibase.ui] Running Changeset: changelog.mysql.xml::1692446190573-2::wesome (generated)
INFO [liquibase.changelog] Table vendor created