Menampilkan Log SQL Yang Dikerjakan MySQL


Kode program yang memakai ORM (object relational mapper) seperti JPA umumnya tidak memberikan query SQL secara langsung karena query akan dihasilkan oleh sang mapper.   Tapi terkadang developer perlu mengetahui apa saja query SQL yang dihasilkan oleh ORM, misalnya untuk keperluan troubleshooting atau mencari bottleneck kinerja.   Bila memakai database MySQL, si developer memiliki beberapa pilihan untuk melihat SQL yang dibuat oleh aplikasi tanpa perlu memakai tool tambahan.

JDBC bawaan untuk MySQL sudah menyediakan fasilitas logging.   Hasil log-nya lebih detail karena dilengkapi dengan nilai parameter dibandingkan dengan yang terlihat di log Hibernate yang hanya menuliskan isi prepared statement dimana nilai masih berupa tanda tanya (?).  Untuk mengaktifkan logging di JDBC, saya perlu menambahkan sesuatu di JDBC URL, yaitu nilai logger dan profileSQL.  Sebagai contoh, bila saya memakai JPA, maka saya mengubah isi berikut ini di persistence.xml:

...
<properties>
   ...
   <property name="javax.persistence.jdbc.url"
      value="jdbc:mysql://localhost/namadb?logger=com.mysql.jdbc.log.Slf4JLogger&amp;profileSQL=true" />
   ...
</properties>
...

Nilai profileSQL menunjukkan agar driver JDBC tersebut akan mencatat setiap SQL yang ada.   Sementara itu, nilai logger menunjukkan tujuan yang menyimpan catatan SQL nantinya.    Saya memilih menggunakan SlfjLogger yang akan mencatat sesuai dengan konfigurasi Log4j saya.  Saya memisahkan kedua nilai tersebut dengan &amp; karena ini adalah XML;  bila tidak memakai JPA, misalnya saya membuat koneksi di kode program, maka saya boleh langsung memakai tanda ampersand (&).

Langkah berikutnya adalah melakukan konfigurasi Log4J.  Bila memakai Griffon, maka perubahan ini dapat dilakukan di file Config.groovy.  Sebagai contoh, saya akan mencatat log SQL yang dikerjakan aplikasi ke sebuah file:

log4j = {
  ...
  appenders {
     rollingFile name: 'sqlLog', file: "${System.getProperty('user.home')/sql.log",
        layout: pattern(conversionPattern: '%d [%t] %-5p %c - %m%n'), maxFileSize: 10485760)
  }
  ...
  debug additivity: false, sqlLog: 'com.mysql.jdbc.log'
  ...

Setelah ini, bila aplikasi dijalankan, saya dapat menemukan seluruh SQL yang dikerjakan di file sql.log yang terletak di folder home (seperti C:\Users\nama\).

Alternatif lainnya, saya dapat melakukan pencatatan SQL ini disisi server MySQL itu sendiri.  Hal ini berguna bila database diakses oleh banyak user secara bersamaan, dan saya ingin melihat seluruh SQL yang dikerjakan oleh user-user yang terkoneksi.  Perlu diperhatikan bahwa pencatatan melalui general query log ini tidak harus berurut sesuai dengan eksekusinya, melainkan berdasarkan urutan saat diterima dari client.

Untuk melakukan pencatatan di sisi server, saya harus melakukan konfigurasi MySQL, misalnya dengan mengubah file my.ini yang ada di folder instalasi MySQL (seperti C:\Program Files\MySQL\MySQL Server 5.6\my.ini).  Saya harus mengubah file tersebut sehingga terdapat baris berikut ini:

log-output=FILE
general-log=1
general-log-file="sql.log"

Setelah me-restart server MySQL, maka seluruh SQL yang dikerjakan oleh server tersebut akan tercatat di file sql.log.  File ini terletak di lokasi yang sesuai dengan nilai datadir (nilainya tertera di file konfigurasi yang sama, atau gunakan perintah SHOW VARIABLES LIKE 'datadir'; untuk melihat nilainya)Secara default, lokasi ini adalah di C:\ProgramData\MySQL\MySQL Server 5.6\data.

Berikutnya, jalankan aplikasi, tunggu hingga log terkumpul (gunakan tail -f untuk memantau bila di Linux), lalu cari query yang menjadi biang kesalahannya🙂

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: