13

I'm comparing two databases using liquibase integrated with ant. But the output it is generating is like generic format. It is not giving sql statements. Please can anyone tell me how compare two databases using liquibase integrated with ant or command line utility.

Cœur
  • 37,241
  • 25
  • 195
  • 267
bhasker
  • 645
  • 1
  • 7
  • 20

1 Answers1

24

Obtaining the SQL statements, representing the diff between two databases, is a two step operation:

  1. Generate the XML "diff" changelog
  2. Generate SQL statements

Example

This example requires a liquibase.properties file (simplifies the command-line parameters):

classpath=/path/to/jdbc/jdbc.jar
driver=org.Driver
url=jdbc:db_url1
username=user1
password=pass1
referenceUrl=jdbc:db_url2
referenceUsername=user2
referencePassword=pass2
changeLogFile=diff.xml

Now run the following commands to create the SQL statements:

liquibase diffChangeLog
liquibase updateSQL > update.sql

A nice feature of liquibase is that it can also generate the rollback SQL:

liquibase futureRollbackSQL > rollback.sql

Update

Liquibase does not generate a data diff between databases, only the schema. However, it is possible to dump database data as a series of changesets:

liquibase --changeLogFile=data.xml --diffTypes=data generateChangeLog

One can use the data.xml file to migrate data contained in new tables.

Update 2:

Also possible to generate liquibase changesets using groovy.

import groovy.sql.Sql 
import groovy.xml.MarkupBuilder

//
// DB connection
//
this.class.classLoader.rootLoader.addURL(new URL("file:///home/path/to/h2-1.3.162.jar"))
def sql = Sql.newInstance("jdbc:h2:db/db1","user","pass","org.h2.Driver")

//
// Generate liquibase changeset
//
def author = "generated"
def id = 1

new File("extract.xml").withWriter { writer ->
    def xml = new MarkupBuilder(writer);

    xml.databaseChangeLog(
        "xmlns":"http://www.liquibase.org/xml/ns/dbchangelog",
        "xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance",
        "xsi:schemaLocation":"http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd"
    ) {
        changeSet(author:author, id:id++) {
            sql.eachRow("select * from employee") { row ->
                insert(tableName:"exmployee") {
                    column(name:"empno",    valueNumeric:row.empno)
                    column(name:"name",     value:row.name)
                    column(name:"job",      value:row.job)
                    column(name:"hiredate", value:row.hiredate)
                    column(name:"salary",   valueNumeric:row.salary)
                }
            }
        }
    }
}
Radek Postołowicz
  • 4,506
  • 2
  • 30
  • 47
Mark O'Connor
  • 76,015
  • 10
  • 139
  • 185
  • hiee I'm able to see the diff but if a table is missing it will just create the table , but wont copy the table data from source db to target db. Is there any solution for that – bhasker Dec 26 '11 at 05:56
  • No not a complete solution. I've update my answer to indicate how the data can be dumped as a series of changesets. This generated data can be used to load new tables in the the new database. – Mark O'Connor Dec 26 '11 at 17:16
  • hiee after executing the command it gives java heap space error. I tried setting java heap size as %JAVA_OPTS% -Xms512m -Xmx1024m -XX:MaxPermSize=1024m. Can u plz help me in this? – bhasker Dec 27 '11 at 08:50
  • I think your dataset is too large. Try generating the changeset (updated my answer) or perhaps just use a normal database data loading tool. – Mark O'Connor Dec 27 '11 at 16:05