The diff command provided by Liquibase lets DBA inspect the difference between the source database and the target database. Liquibase provides a diffChangeLog command, which along with listing down the differences between the two databases, creates a ChangeLog file as well with all ChangeSets required to resolve those changes and keep both databases synced.
The diffChangeLog command will create ChangeSet for the below
- missing objects between the source database and the target database
- changes made to one database
- unexpected database object
The diff command compares databases on URL and reference Url
- referenceURL it is the
URLfor thesource database, it will be considered as the basis of comparison - url contains the
URLfor thetarget database, it is thetarget databasefor comparisons
Liquibase Open Source and Liquibase Pro command diffChangelog produces ChangeSet for
| Liquibase Open Source | Liquibase Pro |
|---|---|
| Catalog | Check Constraint |
| Column | Package |
| Foreign Key | Package Body |
| Index | Procedure |
| Primary Key | Function |
| Schema | Trigger |
| Sequence | Synonyms |
| Unique Constraints | |
| View |
execute the below script into the database
create database appleDbSource;
use appleDbSource;
CREATE TABLE apple ( apple_id BIGINT NOT NULL AUTO_INCREMENT, apple_name VARCHAR(255), available CHAR(1), current_date_time DATETIME DEFAULT NOW (), PRIMARY KEY (apple_id), CONSTRAINT uqniue_apple_name UNIQUE (apple_name)) ENGINE=INNODB;
insert into apple (apple_name, available, current_date_time) values ("Macintosh", 'Y', now());
commit;
create database appleDbTarget;
use appleDbTarget;
CREATE TABLE apple ( apple_id BIGINT NOT NULL AUTO_INCREMENT, apple_name VARCHAR(255), current_date_time DATETIME DEFAULT NOW (), PRIMARY KEY (apple_id)) ENGINE=INNODB;
insert into apple (apple_name, current_date_time) values ("Macintosh", now());
commit;liquibase.properties (update changeLog File file format with SQL, XML, YAML, JSON as per changelog.mysql.)
changeLogFile=changelog.mysql.xml
# target db
liquibase.command.url:jdbc:mysql://localhost:3306/AppleDbTarget?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
liquibase.command.username: root
liquibase.command.password: rootroot
# source db
liquibase.command.referenceUrl :jdbc:mysql://localhost:3306/appleDbSource?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
liquibase.command.referenceUsername: root
liquibase.command.referencePassword: rootrootTo create ChangeLogfor missing objects between the source and target databases, run the command
liquibase diffChangeLogFiltering diffChangeLog types
By default diff command checks for tables, views, columns, indexes, foreignkeys, primarykeys, uniqueconstraints. but if required, Liquibase provides diffTypes attributes to filter and specify the type of object as per requirement.
execute the below script into the database
create database appleDbSource;
use appleDbSource;
CREATE TABLE apple ( apple_id BIGINT NOT NULL AUTO_INCREMENT, apple_name VARCHAR(255), available CHAR(1), current_date_time DATETIME DEFAULT NOW (), PRIMARY KEY (apple_id), CONSTRAINT uqniue_apple_name UNIQUE (apple_name)) ENGINE=INNODB;
insert into apple (apple_name, available, current_date_time) values ("Macintosh", 'Y', now());
commit;
create database appleDbTarget;
use appleDbTarget;
CREATE TABLE apple ( apple_id BIGINT NOT NULL AUTO_INCREMENT, apple_name VARCHAR(255), current_date_time DATETIME DEFAULT NOW (), PRIMARY KEY (apple_id)) ENGINE=INNODB;
insert into apple (apple_name, current_date_time) values ("Macintosh", now());
commit;liquibase.properties (update changeLog File file format with SQL, XML, YAML, JSON as per changelog.mysql.)
changeLogFile=changelog.mysql.xml
# target db
liquibase.command.url:jdbc:mysql://localhost:3306/AppleDbTarget?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
liquibase.command.username: root
liquibase.command.password: rootroot
# source db
liquibase.command.referenceUrl :jdbc:mysql://localhost:3306/appleDbSource?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
liquibase.command.referenceUsername: root
liquibase.command.referencePassword: rootroot
diffTypes:catalogs,tables,functions,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints,data,storedprocedures,triggers,sequences,databasepackage,databasepackagebodyTo compare both the source and target databases, run the command
liquibase diffChangeLog