Using Liquibase with MySQL
MySQL is a fast, multi-user SQL database service. MySQL Server is intended for mission-critical, heavy-load production systems as well as for embedding into mass-deployed software. For more information, see the MySQL documentation page.
Verified database versions
MySQL Server, AWS Aurora – MySQL, AWS RDS – MySQL, Azure Database for MySQL
- 8.0
- 5.7
Google Cloud SQL – MySQL
- 8.0
Deprecated Versions
- Amazon AWS RDS for MySQL 5.7 is deprecated as of December 1, 2023.
- Liquibase support for AWS RDS for MySQL 5.7 ends on February 29, 2024.
- This does not affect Amazon Aurora MySQL 5.7, Google Cloud SQL MySQL 5.7, or Microsoft Azure Database Flexible Server for MySQL 5.7.
- MySQL Server 5.7 is deprecated as of October 21, 2023.
- Liquibase support for MySQL Server ends on January 19, 2024.
- This does not affect AWS Aurora 5.7, AWS RDS - MySQL 5.7, or Azure Database for MySQL 5.7.
Prerequisites
- Introduction to Liquibase: Dive into Liquibase concepts.
- Install Liquibase: Download Liquibase on your machine.
- Ensure Java is installed: Liquibase requires Java to run. If you used the Liquibase Installer, Java is included automatically. Otherwise, you must install Java manually.
- Get Started with Liquibase: Learn how to use Liquibase with an example database.
- Design Your Liquibase Project: Create a new Liquibase project folder and organize your changelogs.
- How to Apply Your Liquibase Pro License Key: If you use Liquibase Pro, activate your license.
Install drivers
CLI users
To use Liquibase and MySQL, you need the JDBC driver JAR file (Maven download).
liquibase/lib
directory.
Maven users
To use Liquibase with Maven, pom.xml
file. Using this information, Maven automatically downloads the driver JAR from Maven Central when you build your project.
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>9.0.0</version>
</dependency>
Configure connection
- Ensure your MySQL is configured:
- Specify the database URL in the
liquibase.properties
file (defaults file), along with other properties you want to set a default value for. Liquibase does not parse the URL. You can either specify the full database connection string or specify the URL using your database's standard connection format:
Test connection
-
Create a text file called
changelog
(.sql
,.yaml
,.json
, or.xml
) in your project directory and add a changeset.If you already created a changelog using the
init project
command, you can use that instead of creating a new file. When adding onto an existing changelog, be sure to only add the changeset and to not duplicate the changelog header. - Navigate to your project folder in the CLI and run the Liquibase
status
command to see whether the connection is successful: - Inspect the deployment SQL with the
update-sql
command: - Then execute these changes to your database with the
update
command: - From a database UI tool, ensure that your database contains the
test_table
object you added along with the DATABASECHANGELOG table and DATABASECHANGELOGLOCK table.
--liquibase formatted sql
--changeset your.name:1
CREATE TABLE test_table (test_id INT NOT NULL, test_column INT, PRIMARY KEY (test_id))
Tip: Formatted SQL changelogs generated from Liquibase versions before 4.2.0 might cause issues because of the lack of space after a double dash ( --
). To fix this, add a space after the double dash. For example: -- liquibase formatted sql
instead of --liquibase formatted sql
and -- changeset myname:create-table
instead of --changeset myname:create-table
.
databaseChangeLog:
- changeSet:
id: 1
author: your.name
changes:
- createTable:
tableName: test_table
columns:
- column:
name: test_id
type: INT
constraints:
primaryKey: true
nullable: false
- column:
name: test_column
type: INT
{
"databaseChangeLog": [
{
"changeSet": {
"id": "1",
"author": "your.name",
"changes": [
{
"createTable": {
"tableName": "test_table",
"columns": [
{
"column": {
"name": "test_id",
"type": "INT",
"constraints": {
"primaryKey": true,
"nullable": false
}
}
},
{
"column": {
"name": "test_column",
"type": "INT"
}
}
]
}
}
]
}
}
]
}
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
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">
<changeSet id="1" author="your.name">
<createTable tableName="test_table">
<column name="test_id" type="int">
<constraints primaryKey="true" nullable="false" />
</column>
<column name="test_column" type="int"/>
</createTable>
</changeSet>
</databaseChangeLog>
liquibase status --username=test --password=test --changelog-file=<changelog.xml>
Note: You can specify arguments in the CLI or keep them in the Liquibase properties file.
If your connection is successful, you'll see a message like this:
4 changesets have not been applied to <your_connection_url>
Liquibase command 'status' was executed successfully.
liquibase update-sql --changelog-file=<changelog.xml>
If the SQL that Liquibase generates isn't what you expect, you should review your changelog file and make any necessary adjustments.
liquibase update --changelog-file=<changelog.xml>
If your update
is successful, Liquibase runs each changeset and displays a summary message ending with:
Liquibase: Update has been successful.
Liquibase command 'update' was executed successfully.
Now you're ready to start making deployments with Liquibase!
MySQL Server
- Ensure your MySQL is configured. You can check the status by running:
- The
sudo service mysql status
command for Linux. - The
net start MySQL
orservices.msc
command for Windows. Theservices.msc
command will open a new window and display the list of services available on your system. Find MySQL and check the status column. You can also runmysql -u root -p
to see if MySQL works.
- The
- Specify the database URL in your
liquibase.properties
file:
url: jdbc:mysql://<servername>:<port>/<dbname>
Tip: To apply a Liquibase Pro key to your project, add the following property to the Liquibase properties file: licenseKey: <paste code here>
MySQL on AWS RDS
-
Check the connection by using the
mysql
command-line client and running the following:
mysql -h <endpoint> -P 3306 -u <mymainuser> -p
Note: The alternative way is to connect with the SSL certificate.
You can find the connection information in the AWS Management Console:
- Open the Amazon RDS console
- Select Databases and choose the needed database
- Select Connectivity & security. You will see all information under Endpoint & Port.
To find the connection information using the AWS CLI and RDS API, refer to the Connecting to a DB instance running the MySQL database engine documentation.
-
Specify the database URL in the
liquibase.properties
file as follows:
url: jdbc:mysql://<endpoint>:<port>/<dbname>
Example: url:jdbc:mysql://mydb.123456789012.us-east-1.rds.amazonaws.com:3306/myTestDB?autoReconnect=true&useSSL=false
Other
You can also use Liquibase on MySQL with Amazon Aurora, Azure Database, and Google Cloud SQL.
Type handling
When you run a command like generate-changelog or snapshot-reference, Liquibase maps data from your database onto the Liquibase output, like the data type of a column.
By default, Boolean types in MySQL map to TINYINT(1)
:
- In Liquibase 4.23.2 and earlier, Liquibase maps Boolean types to
BIT
by default. - In Liquibase 4.24.0 and 4.25.0, Liquibase maps Boolean types to
TINYINT(1)
by default. - In Liquibase 4.25.1, Liquibase maps Boolean types to
TINYINT
(without length) by default. - In Liquibase 4.26.0 and later, Liquibase maps Boolean types to
TINYINT(1)
by default.
For more information, see Liquibase Data Type Handling.