diff
The diff
command in Liquibase allows you to compare two databases of the same type, or different types, to one another.
Uses
The diff
command is typically used at the completion of a project to verify all expected changes are in the changelog or to detect drift between a model schema and a database's actual schema. The diff
command is also useful for the following tasks:
- Finding missing objects between one database and another
- Seeing that a change was made to your database
- Finding unexpected items in your database
In Liquibase Pro 4.25.0 and later, you can use diff
to seamlessly generate a Drift Report for your databases.
Syntax
Running the diff
command requires two URLs:
- reference-url – the source for the comparison. The
--reference-url
attribute represents your source (reference) database, which is the basis for the database you want to compare. - url – the target of the comparison. The
--url
attribute represents your target database, which you want to compare to the source (reference) database. You typically perform actions and run commands on this database.
To compare two databases:
- Option 1: Run the
diff
command with all necessary attributes in the CLI:
liquibase diff
--url="jdbc:oracle:thin:@<IP OR HOSTNAME>:<PORT>:<SERVICE NAME OR SID>"
--username=<USERNAME>
--password=<PASSWORD>
--reference-url="jdbc:oracle:thin:@<IP OR HOSTNAME>:<PORT>:<SERVICE NAME OR SID>"
--reference-username=<USERNAME>
--reference-password=<PASSWORD>
Note: To run this command with an offline database snapshot, use the following pattern for the reference URL: --reference-url="offline:mysql?snapshot=SNAPSHOT_DEV.json"
.
Tip: For best results, specify all commands and parameters in the --kebab-case
format in the CLI. If your preference is camelCase, it also works in the CLI.
See the snapshot command topic for an example of using a snapshot file as one of the databases being used in the command.
Tip: Liquibase recommends that you place your database's JDBC driver JAR file in the liquibase/lib
directory. If you place the driver file in a different directory, specify the path in the properties file: classpath:../<path-to-drivers>/ojdbc<version>.jar
. For more information, see Create and Configure a liquibase.properties File. When you run the diff
command against two databases, either the drivers for both must be in the liquibase/lib
directory or the classpath
property must reference both JAR files. Use the appropriate path separator for your operating system: for Windows, use a semicolon; for Mac or Linux, use a colon.
Example: classpath: ojdbc7.jar:postgresql-42.2.8.jar
- Option 2: Configure the Liquibase properties file to include the connection information for both databases. Then, run the following command in the CLI:
liquibase diff
For information, see Create and Configure a liquibase.properties File.
By default, the result is sent to STDOUT
, which provides flexibility to use the result in other tools or in a processing pipeline. You can also have your output in a file using the --output-file=<filename>
attribute.
liquibase diff --output-file=myfile.json
Liquibase Version: 4.9.1
Liquibase Pro 4.9.1 by Liquibase licensed to Liquibase Pro Evaluation until Tue Jun 07 18:00:00 MDT 2022
WARNING! Your license will expire in 27 days!
To renew Liquibase Pro please contact sales@liquibase.com or go to https://www.liquibase.org/download
Diff Results:
INFO This command might not yet capture Liquibase Pro additional object types on h2
Reference Database: DBUSER @ jdbc:h2:tcp://localhost:9090/mem:integration (Default Schema: PUBLIC)
Comparison Database: DBUSER @ jdbc:h2:tcp://localhost:9090/mem:dev (Default Schema: PUBLIC)
Compared Schemas: PUBLIC
Product Name: EQUAL
Product Version: EQUAL
Missing Catalog(s): NONE
Unexpected Catalog(s): NONE
Changed Catalog(s):
INTEGRATION
name changed from 'INTEGRATION' to 'DEV'
Missing Check Constraint(s): NONE
Unexpected Check Constraint(s): NONE
Changed Check Constraint(s): NONE
Missing Column(s): NONE
Unexpected Column(s):
PUBLIC.COMPANY.ADDRESS1
PUBLIC.PERSON.ADDRESS1
PUBLIC.COMPANY.ADDRESS2
PUBLIC.PERSON.ADDRESS2
PUBLIC.DATABASECHANGELOG.AUTHOR
PUBLIC.COMPANY.CITY
PUBLIC.PERSON.CITY
PUBLIC.DATABASECHANGELOG.COMMENTS
PUBLIC.DATABASECHANGELOG.CONTEXTS
PUBLIC.PERSON.COUNTRY
PUBLIC.DATABASECHANGELOG.DATEEXECUTED
PUBLIC.DATABASECHANGELOG.DEPLOYMENT_ID
PUBLIC.DATABASECHANGELOG.DESCRIPTION
PUBLIC.DATABASECHANGELOG.EXECTYPE
PUBLIC.DATABASECHANGELOG.FILENAME
PUBLIC.COMPANY.ID
PUBLIC.DATABASECHANGELOG.ID
PUBLIC.DATABASECHANGELOGLOCK.ID
PUBLIC.PERSON.ID
PUBLIC.DATABASECHANGELOG.LABELS
PUBLIC.DATABASECHANGELOG.LIQUIBASE
PUBLIC.DATABASECHANGELOGLOCK.LOCKED
PUBLIC.DATABASECHANGELOGLOCK.LOCKEDBY
PUBLIC.DATABASECHANGELOGLOCK.LOCKGRANTED
PUBLIC.DATABASECHANGELOG.MD5SUM
PUBLIC.COMPANY.NAME
PUBLIC.PERSON.NAME
PUBLIC.DATABASECHANGELOG.ORDEREXECUTED
PUBLIC.DATABASECHANGELOG.TAG
Changed Column(s): NONE
Missing Database Package(s): NONE
Unexpected Database Package(s): NONE
Changed Database Package(s): NONE
Missing Database Package Body(s): NONE
Unexpected Database Package Body(s): NONE
Changed Database Package Body(s): NONE
Missing Foreign Key(s): NONE
Unexpected Foreign Key(s): NONE
Changed Foreign Key(s): NONE
Missing Function(s): NONE
Unexpected Function(s): NONE
Changed Function(s): NONE
Missing Index(s): NONE
Unexpected Index(s):
PRIMARY_KEY_5 UNIQUE ON PUBLIC.PERSON(ID)
PRIMARY_KEY_6 UNIQUE ON PUBLIC.COMPANY(ID)
PRIMARY_KEY_D UNIQUE ON PUBLIC.DATABASECHANGELOGLOCK(ID)
Changed Index(s): NONE
Missing Primary Key(s): NONE
Unexpected Primary Key(s):
CONSTRAINT_6 on PUBLIC.COMPANY(ID)
CONSTRAINT_8 on PUBLIC.PERSON(ID)
PK_DATABASECHANGELOGLOCK on PUBLIC.DATABASECHANGELOGLOCK(ID)
Changed Primary Key(s): NONE
Missing Schema(s): NONE
Unexpected Schema(s): NONE
Changed Schema(s): NONE
Missing Sequence(s): NONE
Unexpected Sequence(s): NONE
Changed Sequence(s): NONE
Missing Stored Procedure(s): NONE
Unexpected Stored Procedure(s): NONE
Changed Stored Procedure(s): NONE
Missing Synonym(s): NONE
Unexpected Synonym(s): NONE
Changed Synonym(s): NONE
Missing Table(s): NONE
Unexpected Table(s):
COMPANY
DATABASECHANGELOG
DATABASECHANGELOGLOCK
PERSON
Changed Table(s): NONE
Missing Trigger(s): NONE
Unexpected Trigger(s): NONE
Changed Trigger(s): NONE
Missing Unique Constraint(s): NONE
Unexpected Unique Constraint(s): NONE
Changed Unique Constraint(s): NONE
Missing View(s): NONE
Unexpected View(s): NONE
Changed View(s): NONE
Liquibase command 'diff' was executed successfully.
The diff
command produces a list of diff types, along with one of the following descriptions:
- Missing: there are objects on your source database (referenceURL) that are not on your target database (URL).
- Unexpected: there are objects on your target database (URL) that are not on your source database (referenceURL).
- Changed: the object as it exists on the source database (referenceURL) is different than as it exists in the target database (URL).
Note: The changed description will not specify the type of change applied to your database. Run the diff-changelog command to generate a changelog that will apply the changes to the target database.
Liquibase Open Source diff types:
- Catalog
- Column
- Foreign Key
- Index
- Primary Key
- Schema
- Sequence
- Unique Constraints
- View
Liquibase Pro diff types:
- Check Constraint
- Package
- Package Body
- Procedure
- Function
- Trigger
- Synonyms
Note: Liquibase does not currently check datatype
length.
Filtering diff
types
Liquibase allows you to use diff-types
attribute to filter the types of objects you want to compare. Multiple filters can be added to the attribute as a comma-separated list. If no diff-types
are specified, all objects are considered.
Example: liquibase diff --diff-types=tables,indexes,views
Diff Results:
INFO This command might not yet capture Liquibase Pro additional object types on h2
Reference Database: DBUSER @ jdbc:h2:tcp://localhost:9090/mem:integration (Default Schema: PUBLIC)
Comparison Database: DBUSER @ jdbc:h2:tcp://localhost:9090/mem:dev (Default Schema: PUBLIC)
Compared Schemas: PUBLIC
Product Name: EQUAL
Product Version: EQUAL
Missing Index(s): NONE
Unexpected Index(s):
PRIMARY_KEY_5 UNIQUE ON PUBLIC.PERSON(ID)
PRIMARY_KEY_6 UNIQUE ON PUBLIC.COMPANY(ID)
PRIMARY_KEY_D UNIQUE ON PUBLIC.DATABASECHANGELOGLOCK(ID)
Changed Index(s): NONE
Missing Table(s): NONE
Unexpected Table(s):
COMPANY
DATABASECHANGELOG
DATABASECHANGELOGLOCK
PERSON
Changed Table(s): NONE
Missing View(s): NONE
Unexpected View(s): NONE
Changed View(s): NONE
Liquibase command 'diff' was executed successfully.
Command parameters
Attribute | Definition | Requirement |
---|---|---|
|
The JDBC reference database connection URL |
Required |
|
The JDBC database connection URL. See Using JDBC URL in Liquibase. |
Required |
|
Name of the default catalog to use for the database connection |
Optional |
|
Name of the default schema to use for the database connection. If Tip: In Liquibase v4.23.0+, camelCase for Note: The syntax |
Optional |
|
Specifies the types of objects to compare. Specify multiple values as a comma-separated list (without spaces). Valid values are: If null, default types are Note: The diff types |
Optional |
|
Specifies the severity level of all error types in the drift report (changed, missing, or unexpected content). Valid values are |
Optional |
|
Specifies the severity level of changed content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of missing content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of unexpected content in the drift report. Valid values are |
Optional |
|
The JDBC driver class |
Optional |
|
The JDBC driver properties file |
Optional |
|
Objects to exclude from diff |
Optional |
|
Option to create JSON output. See diff JSON. |
Optional |
|
Objects to include in diff |
Optional |
|
If Note: Prior to Liquibase 4.29.0, this parameter was called |
Optional |
|
Lets you replace the schemas in the output changelog. This is a CSV list. The parameter size must match Example: |
Optional |
|
Password to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
The reference default catalog name to use for the database connection |
Optional |
|
The reference default schema name to use for the database connection |
Optional |
|
The JDBC driver class for the reference database |
Optional |
|
The JDBC driver properties file for the reference database |
Optional |
|
Reference database catalog to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
Reference database schema to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
The reference database password. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Schemas names on reference database to use in diff. This is a CSV list. |
Optional |
|
The reference database username. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Enables a report at the command level. Overrides the global argument |
Optional |
|
Specifies the name of the report file at the command level. Overrides the global argument |
Optional |
|
Specifies the file path to the report file at the command level. Overrides the global argument |
Optional |
|
Schemas to include in diff |
Optional |
|
Username to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
Attribute | Definition | Requirement |
---|---|---|
|
The JDBC reference database connection URL |
Required |
|
The JDBC database connection URL. See Using JDBC URL in Liquibase. |
Required |
|
Name of the default catalog to use for the database connection |
Optional |
|
Name of the default schema to use for the database connection. If Tip: In Liquibase v4.23.0+, camelCase for Note: The syntax |
Optional |
|
Specifies the types of objects to compare. Specify multiple values as a comma-separated list (without spaces). Valid values are: If null, default types are Note: The diff types |
Optional |
|
Specifies the severity level of all error types in the drift report (changed, missing, or unexpected content). Valid values are |
Optional |
|
Specifies the severity level of changed content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of missing content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of unexpected content in the drift report. Valid values are |
Optional |
|
The JDBC driver class |
Optional |
|
The JDBC driver properties file |
Optional |
|
Objects to exclude from diff |
Optional |
|
Option to create JSON output. See diff JSON. |
Optional |
|
Objects to include in diff |
Optional |
|
If Note: Prior to Liquibase 4.29.0, this parameter was called |
Optional |
|
Lets you replace the schemas in the output changelog. This is a CSV list. The parameter size must match Example: |
Optional |
|
Password to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
The reference default catalog name to use for the database connection |
Optional |
|
The reference default schema name to use for the database connection |
Optional |
|
The JDBC driver class for the reference database |
Optional |
|
The JDBC driver properties file for the reference database |
Optional |
|
Reference database catalog to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
Reference database schema to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
The reference database password. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Schemas names on reference database to use in diff. This is a CSV list. |
Optional |
|
The reference database username. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Enables a report at the command level. Overrides the global argument |
Optional |
|
Specifies the name of the report file at the command level. Overrides the global argument |
Optional |
|
Specifies the file path to the report file at the command level. Overrides the global argument |
Optional |
|
Schemas to include in diff |
Optional |
|
Username to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
Attribute | Definition | Requirement |
---|---|---|
|
The JDBC reference database connection URL |
Required |
|
The JDBC database connection URL. See Using JDBC URL in Liquibase. |
Required |
|
Name of the default catalog to use for the database connection |
Optional |
|
Name of the default schema to use for the database connection. If Tip: In Liquibase v4.23.0+, camelCase for Note: The syntax |
Optional |
|
Specifies the types of objects to compare. Specify multiple values as a comma-separated list (without spaces). Valid values are: If null, default types are Note: The diff types |
Optional |
|
Specifies the severity level of all error types in the drift report (changed, missing, or unexpected content). Valid values are |
Optional |
|
Specifies the severity level of changed content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of missing content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of unexpected content in the drift report. Valid values are |
Optional |
|
The JDBC driver class |
Optional |
|
The JDBC driver properties file |
Optional |
|
Objects to exclude from diff |
Optional |
|
Option to create JSON output. See diff JSON. |
Optional |
|
Objects to include in diff |
Optional |
|
If Note: Prior to Liquibase 4.29.0, this parameter was called |
Optional |
|
Lets you replace the schemas in the output changelog. This is a CSV list. The parameter size must match Example: |
Optional |
|
Password to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
The reference default catalog name to use for the database connection |
Optional |
|
The reference default schema name to use for the database connection |
Optional |
|
The JDBC driver class for the reference database |
Optional |
|
The JDBC driver properties file for the reference database |
Optional |
|
Reference database catalog to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
Reference database schema to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
The reference database password. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Schemas names on reference database to use in diff. This is a CSV list. |
Optional |
|
The reference database username. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Enables a report at the command level. Overrides the global argument |
Optional |
|
Specifies the name of the report file at the command level. Overrides the global argument |
Optional |
|
Specifies the file path to the report file at the command level. Overrides the global argument |
Optional |
|
Schemas to include in diff |
Optional |
|
Username to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
Attribute | Definition | Requirement |
---|---|---|
|
The JDBC reference database connection URL |
Required |
|
The JDBC database connection URL. See Using JDBC URL in Liquibase. |
Required |
|
Name of the default catalog to use for the database connection |
Optional |
|
Name of the default schema to use for the database connection. If Tip: In Liquibase v4.23.0+, camelCase for Note: The syntax |
Optional |
|
Specifies the types of objects to compare. Specify multiple values as a comma-separated list (without spaces). Valid values are: If null, default types are Note: The diff types |
Optional |
|
Specifies the severity level of all error types in the drift report (changed, missing, or unexpected content). Valid values are |
Optional |
|
Specifies the severity level of changed content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of missing content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of unexpected content in the drift report. Valid values are |
Optional |
|
The JDBC driver class |
Optional |
|
The JDBC driver properties file |
Optional |
|
Objects to exclude from diff |
Optional |
|
Option to create JSON output. See diff JSON. |
Optional |
|
Objects to include in diff |
Optional |
|
If Note: Prior to Liquibase 4.29.0, this parameter was called |
Optional |
|
Lets you replace the schemas in the output changelog. This is a CSV list. The parameter size must match Example: |
Optional |
|
Password to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
The reference default catalog name to use for the database connection |
Optional |
|
The reference default schema name to use for the database connection |
Optional |
|
The JDBC driver class for the reference database |
Optional |
|
The JDBC driver properties file for the reference database |
Optional |
|
Reference database catalog to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
Reference database schema to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
The reference database password. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Schemas names on reference database to use in diff. This is a CSV list. |
Optional |
|
The reference database username. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Enables a report at the command level. Overrides the global argument |
Optional |
|
Specifies the name of the report file at the command level. Overrides the global argument |
Optional |
|
Specifies the file path to the report file at the command level. Overrides the global argument |
Optional |
|
Schemas to include in diff |
Optional |
|
Username to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
Attribute | Definition | Requirement |
---|---|---|
|
The JDBC reference database connection URL |
Required |
|
The JDBC database connection URL. See Using JDBC URL in Liquibase. |
Required |
|
Name of the default catalog to use for the database connection |
Optional |
|
Name of the default schema to use for the database connection. If Tip: In Liquibase v4.23.0+, camelCase for Note: The syntax |
Optional |
|
Specifies the types of objects to compare. Specify multiple values as a comma-separated list (without spaces). Valid values are: If null, default types are Note: The diff types |
Optional |
|
Specifies the severity level of all error types in the drift report (changed, missing, or unexpected content). Valid values are |
Optional |
|
Specifies the severity level of changed content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of missing content in the drift report. Valid values are |
Optional |
|
Specifies the severity level of unexpected content in the drift report. Valid values are |
Optional |
|
The JDBC driver class |
Optional |
|
The JDBC driver properties file |
Optional |
|
Objects to exclude from diff |
Optional |
|
Option to create JSON output. See diff JSON. |
Optional |
|
Objects to include in diff |
Optional |
|
If Note: Prior to Liquibase 4.29.0, this parameter was called |
Optional |
|
Lets you replace the schemas in the output changelog. This is a CSV list. The parameter size must match Example: |
Optional |
|
Password to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
The reference default catalog name to use for the database connection |
Optional |
|
The reference default schema name to use for the database connection |
Optional |
|
The JDBC driver class for the reference database |
Optional |
|
The JDBC driver properties file for the reference database |
Optional |
|
Reference database catalog to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
Reference database schema to use for Liquibase objects. Liquibase 4.24.0+. |
Optional |
|
The reference database password. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Schemas names on reference database to use in diff. This is a CSV list. |
Optional |
|
The reference database username. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
|
Enables a report at the command level. Overrides the global argument |
Optional |
|
Specifies the name of the report file at the command level. Overrides the global argument |
Optional |
|
Specifies the file path to the report file at the command level. Overrides the global argument |
Optional |
|
Schemas to include in diff |
Optional |
|
Username to connect to the target database. Tip: It is a best practice to store sensitive data in a Secrets Management tool with Liquibase Pro. |
Optional |
Note: The username
and password
attributes are not required for connections and systems which use alternate means of authentication. Also, you can specify database credentials as part of the url
attribute.
Drift report
In Liquibase 4.25.0 and later, you can automatically generate a Drift Report using the diff
command. The drift report requires a Liquibase Pro license key.