In my previous post I explained how to migrate an Oracle schema with data to a PostgreSQL database management system (DBMS). Besides the general tasks and issues there are additional topics to migrate a complete application using the database to the other DBMS.
In our specific case we have a grails application which we maintain since Grails 1.0 times for more than 12 years. During that time we did a ton of feature development with lots of refactoring and many database migrations. So the source database will most like not be perfectly consistent and clean.
Since Grails/GORM and the DatabaseMigration-Plugin (DBM-Plugin) do a great job at preparing an empty database with a matching schema for the application to run we let the framework tools generate the schema and only migrate the data using Ora2Pg.
Sounds simple, but how it is done in detail and what else to look for?
Generating the initial dabase schema
The DBM-Plugin provides a script to create a database changelog with a schema matching the domain model of your grails application. It is integrated in gradle, so you can
grails dbm-generate-gorm-changelog initialdb.groovy to create the migration scripts providing a fitting schema. You then include this script in
grails-app/migrations/changelog.groovy or replace all the migrations you had before included there with this initial database changelog.
To prepare an empty database to run with your application you call the gradle task
Checking all plain SQL code
If you are only using GORM’s dynamic finders,
save()/update()/delete()-methods, HQL and the criteria API you are probably fine to run your application or perform the data mirgration step.
Our application has some specific parts where we use plain SQL. Because of syntactical differences you will want to check all the plain SQL if it works with PostgreSQL. The most obvious stuff is dealing with sequences or other queries where you need the
dual table in Oracle.
Migrating the data
This is probably the part where the most things can go wrong. We had quite some work with data-inconsistencies and left-overs from manual corrections that happened over the course of running and upgrading the application for so many year. For younger and simpler applications this may not present any challenges but for us it was quite time-consuming.
Now you can use Ora2Pg to import the data. After the whole data import using Ora2Pg worked as intended you should check the value of the
hibernate_sequence . This sequence is used to generate the ids of all grails domain objects.
Do not let the sequences from the autoincrement columns of the tables of your domain objects confuse you! They are not used by Grails/GORM. To avoid this confusion you can remove the default value of the id columns and the accompanying sequences.
Checking the result
You should always run acceptance or manual tests to make sufficiently sure that the migration worked as intended. There is always the possibility of a configuration or software error or some oversights in checking the application code.
If possible tests the result on a dedicated system with some snapshot of the real world data before making the switch on the production system. Good luck!