Sesekali dalam pengembangan perangkat lunak adalah membandingkan database di Production Server dengan Development Server. Apabila anda sudah menggunakan migration-toolyang 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:

  1. Anda memiliki akses root database (atau pengguna yang memiliki otoritas setara root)
  2. 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.

  1. Buka command prompt anda dengan hak akses administrator (dapat dengan klik kanan pada command prompt anda dan tekan "run as administrator"
  2. jalankan perintah "msiexec /i C:/PATH_TO_YOUR_INSTALLATION_MSI
  3. 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