Manajemen Perubahan Struktur Database Menggunakan Liquibase

Posted by Kamarudin • 3 minute read • Comments

Dalam pembuatan aplikasi perubahan struktur/schema database merupakan hal yang wajar, baik pada fase development maupun setelah masuk ke fase implementasi (production/live). Ada banyak alasan kenapa kita perlu melakukan perubahan struktur database, contoh:

  • Penambahan fitur baru yang membutuhan penambahan attribut/field di tabel yang sudah ada atau malah menambahkan tabel yang baru.
  • Perbaikan bug yang menyebabkan perubahan nama atau jenis data dalam database.
  • Issue kinerja sistem yang memerlukan tambahan index dalam database.

Perubahan-perubahan ini tentunya wajib kita catat baik secara manual maupun menggunakan tool khusus yang bisa dengan mudah membuat log perubahan struktur database dari waktu ke waktu, karena jika tidak bisa berpotensi menjadi bug di kemudian hari.

Beberapa tool database management seperti SQLyog versi Enterprise/Ultimate atau EMS SQL Manager versi berbayarnya memang menyediakan fitur untuk melakukan sinkronisasi struktur database dengan mudah, tapi bagi Anda yang mempunyai anggaran terbatas untuk membeli lisensinya ada alternatif tool gratis dan open source yang bisa kita gunakan salah satunya yaitu Liquibase.

Pernah kebayang nggak ngoding tanpa source/version control seperti Git atau SVN kalo dulu mungkin iya, kalo sekarang source/version control merupakan hal yang wajib kita gunakan untuk memberikan rasa aman saat ber-coding ria :grin:. Source/version control ini digunakan untuk mencatat perubahan kode dari waktu ke waktu, apalagi kalo ngodingnya bareng-bareng, hanya orang-orang kreatif saja yang bisa melakukannya tanpa source/version control :grin:. Dengan mengusung tema Source Control for Your Database Liquibase juga bisa kita fungsikan sebagai source/version control untuk mencatat perubahan struktur/schema database.

Instalasi Liquibase

Liquibase tidak memerlukan instalasi khusus, kita tinggal download filenya di web site resmi Liquibase kemudian mengekstraknya.

Selain itu ada tool lain yang perlu kita siapkan yaitu:

  • JRE atau JDK karena Liquibase ditulis menggunakan Java.
  • JDBC driver disesuaikan dengan database yang digunakan, untuk contoh di sini saya menggunakan database PostgreSQL. Setelah didownload kita copykan ke folder lib

Membuat Changelog

Struktur database dalam Liquibase ditulis dalam format XML, disebut dengan istilah changelog. Ada beberapa perintah yang bisa digunakan untuk menghasilkan changelog, tentunya disesuaikan dengan kebutuhan.

generateChangelog

Perintah ini digunakan untuk membuat changelog dari struktur database secara lengkap jadi mirip dengan perintah dump/export ke sql. Biasanya kita gunakan pada saat implementasi awal sistem untuk mengopykan struktur database kosongan dari server development ke server production/live. Misal di awal implementasi sistem kita mempunyai struktur database seperti berikut :

Dari gambar di atas kita baru mempunyai dua buah tabel yaitu m_customer dan m_supplier.

Kemudian kita jalankan perintah generateChangelog:

liquibase --url="jdbc:stuck_out_tongue:ostgresql://localhost:5432/db-develop" --username=postgres --password=masterkey --changeLogFile=output/db.changelog-1.0.xml generateChangeLog

Akan menghasilkan file changelog seperti berikut:

Mungkin tidak perlu dijelaskan lagi ya, karena isi dari file db.changelog-1.0.xml di atas hanya menjelaskan struktur dari tabel m_customer dan m_supplier dalam format XML.

Setelah itu kita jalankan perintah update agar changelog yang dihasilkan dari perintah generateChangelog di atas dieksekusi ke database target (db production/live).

liquibase --url="jdbc:stuck_out_tongue:ostgresql://localhost:5432/db-production" --username=postgres --password=masterkey --changeLogFile=output/db.changelog-1.0.xml update	

Dari gambar di bawah ini terlihat kondisi database production sebelum (sebelah kiri) dan sesudah dijalankan perintah update.

Pada saat pertama kali Liquibase dijalankan untuk database target, Liquibase akan membuat dua buah tabel sistem yaitu databasechangelog dan databasechangeloglock kedua tabel ini digunakan untuk mencatat hasil eksekusi changelog dari waktu ke waktu. Jadi perlu diperhatikan kedua tabel ini jangan dihapus.

diffChangeLog

Selama fase development maupun setelah masuk ke fase implementasi (production/live) kadang-kadang terjadi perubahan struktur database, sehingga kita perlu mengetahui perbedaan dari struktur lama dan baru, untuk melakukan ini kita menggunakan perintah diffChangeLog.

Misal seperti penjelasan gambar di bawah ini, yang sebelah kiri adalah struktur awal database yang hanya mempunyai dua buah tabel yaitu m_customer dan m_supplier, selama proses development berlangsung terjadi penambahan beberapa tabel baru yaitu m_golongan, m_produk dan tabel baru lainnya.

Nah untuk menghasilkan changelog, yang isinya adalah perbedaan struktur lama dan baru kita gunakan perintah diffChangeLog.

liquibase --url="jdbc:stuck_out_tongue:ostgresql://localhost:5432/db-production" --username=postgres --password=masterkey --referenceUrl="jdbc:stuck_out_tongue:ostgresql://localhost:5432/db-develop" --referenceUsername=postgres --referencePassword=masterkey  --changeLogFile=output/db.changelog-1.1.xml diffChangeLog

Contoh file changelog yang dihasilkan:

Kemudian kita jalankan lagi perintah update. Perintah update ini melakukan patch ke database target (database production/live).

liquibase --url="jdbc:stuck_out_tongue:ostgresql://localhost:5432/db-production" --username=postgres --password=masterkey --changeLogFile=output/db.changelog-1.1.xml update

Setelah itu kita cek lagi struktur database productionnya.

Gampang bukan :blush:, dengan menggunakan Liquibase proses migrasi struktur database pun menjadi lebih mudah.

File Liquibase Properties

Untuk menyingkat penulisan perintah Liquibase kita bisa memanfaatkan file liquibase properties. Di file ini kita mengeset semua nilai parameter yang dibutuhkan pada saat menjalankan perintah Liquibase. Secara default nama yang digunakan untuk file liquibase properties adalah liquibase.properties, jika menggunakan nama default ini kita bisa langsung menjalankan perintah Liquibase seperti berikut :

# generateChangelog
liquibase generateChangelog

# diffChangeLog
liquibase diffChangeLog

# update/patch database target
liquibase update

dan jika menggunakan nama yang lain, misal untuk masing-masing perintah kita buatkan file liquibase properties tersendiri, pada saat menjalankan perintah Liquibase harus kita sebutkan secara explicit nama file liquibase properties-nya dengan menambahkan parameter defaultsFile=<nama_file_liquibase_properties>. Contoh:

# generateChangelog
liquibase --defaultsFile=generate-liquibase.properties generateChangelog

# diffChangeLog
liquibase --defaultsFile=diff-liquibase.properties diffChangeLog

# update/patch database target
liquibase --defaultsFile=update-liquibase.properties update

Dan untuk masing-masing file liquibase properties-nya kita isi seperti berikut:

Selamat mencoba :blush:

Comments