Sesekali dalam pengembangan perangkat lunak adalah membandingkan database di Production Server dengan Development Server. Apabila anda sudah menggunakan migration-tools yang saat ini sudah menjadi penggunaan umum di banyak framework, maka hal ini tidak menjadi masalah. Namun apabila anda masih menggunakan cara tradisional (pengubahan pada Dev tidak langsung di update pada Production) maka hal ini dapat menjadi masalah tersendiri. Terutama bila database anda memiliki banyak tabel yang sulit untuk dilihat satu persatu.
Pada tulisan ini saya akan memberikan cara membandingkan dua database dengan salah satu tool official dari MySQL yaitu MySQL Utility Console. Requirement yang dibutuhkan dari tutorial ini antara lain:
- Anda memiliki akses root database (atau pengguna yang memiliki otoritas setara root)
- Menginstall MySQL Utility Console (tentunya)
Menginstall MySQL Utility Console
Hal pertama yang kita lakukan tentunya adalah menginstall MySQL Utility Console. Petunjuk instalasi berbeda-beda tergantung sistem operasi anda (dapat dilihat pada https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysql-utils-install.html). Apabila anda menggunakan windows dan mendapat pesan error "installation directory must be on a local hard drive" maka anda dapat menggunakan cara berikut.
- Buka command prompt anda dengan hak akses administrator (dapat dengan klik kanan pada command prompt anda dan tekan "run as administrator"
- jalankan perintah "msiexec /i C:/PATH_TO_YOUR_INSTALLATION_MSI
- tekan enter dan lanjutkan wizard instalasi seperti biasa
MysqlDbCompare
Setelah anda selesai menginstall MySQL Utility Console maka anda dapat menggunakan salah satu utility dari Utility Console (ada banyak utility lain yang bisa anda explore/akan dijelaskan pada tulisan lain) yaitu pada tulisan ini mysqldbcompare.
Dalam contoh kali ini saya akan memberikan contoh bagaimana menggunakan utility tersebut. Pertama anda dapat membuka command prompt/powershell/terminal anda, kemudian ketikkan perintah berikut.
$ mysqluc
Dengan perintah tersebut anda akan masuk pada mode MySQL utility console. Berikutnya kita akan menggunakan mysqldbcompare dengan konfigurasi berikut.
- Server1 : root@localhost
- DB Development : bos
- DB Production : bos_prod
Dari contoh di atas dapat terlihat bahwa saya menggunakan database production pada localhost. Tidak direkomendasikan untuk langsung melakukan komparasi pada database yang ada di server.
Untuk memulai dbcompare maka ketikkan perintah berikut pada moda mysqluc.
$ mysqldbcompare --server1=root@localhost bos_prod:bos --run-all-tests
Contoh di atas berarti kita menggunakan server dengan setting seperti pada configurasi, db1 adalah database production, dan db2 adalah development. Dengan perintah di atas akan menampilkan bagamana agar database di bos_prod dapat diubah agar menjadi database bos. Pada database saya, perintah di atas akan mengeluarkan output seperti di bawah ini.
-------------------------------------------------------- could not show previous result because result is too long -------------------------------------------------------------------------------------------------------------
# Rows in `bos`.`user` not in `bos_prod`.`user` +-----+-----------+---------------------+---------------------------------------------------------------+---------+-----------------------------------+-----------------------+---------------------------+-------------+------- ------+----------+-------------+ | id | username | email | password_hash | status | auth_key | password_reset_token | account_activation_token | created_at | update d_at | kd_user | sekolah_id | +-----+-----------+---------------------+---------------------------------------------------------------+---------+-----------------------------------+-----------------------+---------------------------+-------------+------- ------+----------+-------------+ | 5 | smpn2ba3 | Alamat email ini dilindungi dari robot spam. Anda memerlukan Javascript yang aktif untuk melihatnya. | $2y$13$QAXZ.P98ATtf10xuuElpFeYEK7igaJ4wta6hFGsVjIwgIJYf108T. | 10 | oFKJZwKt2TrYWhq71gMmw5FO9l2Ame4R | None | None | 1487940284 | 148794 0284 | 2 | 2 | | 2 | smpn3ba3 | Alamat email ini dilindungi dari robot spam. Anda memerlukan Javascript yang aktif untuk melihatnya. | $2y$13$u9u1sX00sANlA.tKNaCWJunnCxrl0Q.ox5Tslnd.uPaChX4h0wOte | 10 | 0ZB_77q3b-jj5QrqRWFRPrwcDiSotX5L | None | None | 1478453615 | 147845 3615 | 2 | 1 | +-----+-----------+---------------------+---------------------------------------------------------------+---------+-----------------------------------+-----------------------+---------------------------+-------------+------- ------+----------+-------------+ # TABLE user_sekolah pass pass - # - Compare table checksum FAIL # - Find row differences SKIP # # The table user_sekolah does not have an usable Index or primary key.
Panjang sekali bukan, disini saya hanya butuh melihat perubahan struktur dan object saja, sehingga row count dan data (perbedaan isi data dan jumlah row tiap tabel) tidak saya perlukan, sehingga saya ubah perintah dengan menambahkan perintah berikut.
$ mysqldbcompare --server1=root@localhost bos_prod:bos --run-all-tests --skip-data-check --skip-row-count
perintah di atas akan menghasilkan hasil seperti di bawah.
# server1 on localhost: ... connected.
# Checking databases bos_prod and bos on server1
#
# Defn Row Data
# Type Object Name Diff Count Check
# -------------------------------------------------------------------------
# PROCEDURE sisa_kas FAIL - -
#
# Object definitions differ. (--changes-for=server1)
#
--- `bos_prod`.`sisa_kas`
+++ `bos`.`sisa_kas`
@@ -5,38 +5,38 @@
FROM
(
SELECT tahun, sekolah_id, SUM(nilai) AS nilai FROM a WHERE tahun = p_tahun AND sekolah_id = p_sekolah_id AND
-(CASE
- WHEN p_pembayaran = 1 THEN pembayaran = 1
- WHEN p_pembayaran = 2 THEN pembayaran = 2
-END)
+ (CASE
+ WHEN p_pembayaran = 1 THEN pembayaran = 1
+ WHEN p_pembayaran = 2 THEN pembayaran = 2
+ END)
# TABLE auth_assignment pass SKIP SKIP
# TABLE auth_item pass SKIP SKIP
# TABLE auth_item_child pass SKIP SKIP
# TABLE auth_rule pass SKIP SKIP
# TABLE migration pass SKIP SKIP
# TABLE migrations pass SKIP SKIP
# TABLE password_resets pass SKIP SKIP
# TABLE ref_sekolah FAIL SKIP SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `bos_prod`.`ref_sekolah`
+++ `bos`.`ref_sekolah`
@@ -16,4 +16,4 @@
KEY `pendidikan_id` (`pendidikan_id`),
KEY `jenis_id` (`jenis_id`),
CONSTRAINT `ref_sekolah_ibfk_2` FOREIGN KEY (`jenis_id`) REFERENCES `ref_jenis_sekolah` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
-) ENGINE=InnoDB AUTO_INCREMENT=546 DEFAULT CHARSET=latin1
+) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
# TABLE ref_sekolah_perubahan pass SKIP SKIP
# TABLE user FAIL SKIP SKIP
#
# Object definitions differ. (--changes-for=server1)
#
--- `bos_prod`.`user`
+++ `bos`.`user`
@@ -14,4 +14,4 @@
PRIMARY KEY (`id`),
KEY `sekolah_id` (`sekolah_id`),
CONSTRAINT `user_ibfk_1` FOREIGN KEY (`sekolah_id`) REFERENCES `ref_sekolah` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
-) ENGINE=InnoDB AUTO_INCREMENT=552 DEFAULT CHARSET=latin1
+) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
# TABLE user_sekolah pass SKIP SKIP
# ...done
Execution of utility: 'mysqldbcompare --server1=root@localhost bos_prod:bos --run-all-tests --skip-data-check --skip-row-count' ended with return code '1' but no error message was streamed to the standard error, please revie
w the output from its execution.
Perintah di atas memiliki satu kekurangan yaitu jika tabel memiliki auto increment, maka perbedaan auto increment terakhir akan dimunculkan. Opsi lain dari perintah mysqldbcompare dapat anda lihat pada link berikut.
Baiklah demikian cara membandingkan database pada mysql. Semoga bermanfaat dan Happy Coding!
Sumber:
https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqldbcompare.html
https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysql-utils-install.html