Log Management di MySQL: Memantau dan Menganalisis Query yang Berjalan

Mengelola log di MySQL sangat penting untuk memantau aktivitas database, menganalisis kinerja query, dan mendeteksi potensi masalah. Dengan log yang tepat, kita dapat memahami bagaimana MySQL bekerja, mengoptimalkan query, serta meningkatkan keamanan database.

1. Jenis-Jenis Log di MySQL

MySQL memiliki beberapa jenis log yang dapat digunakan untuk memantau dan menganalisis query:

Jenis LogFungsi
General Query LogMencatat semua perintah SQL yang dieksekusi
Slow Query LogMencatat query yang berjalan lebih lama dari batas yang ditentukan
Binary Log (Binlog)Mencatat semua perubahan data (DML) untuk replikasi atau recovery
Error LogMenyimpan informasi error, startup, dan shutdown MySQL
Audit LogMencatat aktivitas pengguna (khusus MySQL Enterprise)

2. Mengaktifkan dan Menggunakan General Query Log

General Query Log adalah log yang mencatat semua perintah SQL yang dijalankan oleh MySQL.

Mengaktifkan General Query Log

Edit file konfigurasi my.cnf atau my.ini:
general_log = 1
general_log_file = /var/log/mysql_general.log

Kemudian restart MySQL:

systemctl restart mysql

Atau, aktifkan secara dinamis:

SET GLOBAL general_log = 'ON';
SET GLOBAL general_log_file = '/var/log/mysql_general.log';

Melihat Isi General Query Log

Gunakan perintah berikut untuk melihat log secara real-time:

tail -f /var/log/mysql_general.log

Contoh isi log:

2024-04-10 15:30:10   root[localhost]    Query   SELECT * FROM users;
2024-04-10 15:30:15 admin[192.168.1.100] Query UPDATE products SET price = 500 WHERE id = 1;

Dari log ini, kita bisa melihat:

  • Waktu eksekusi query
  • User yang menjalankan perintah
  • IP asal permintaan
  • Perintah SQL yang dieksekusi

Catatan: General Query Log dapat menghasilkan file log yang sangat besar, sehingga disarankan hanya mengaktifkannya saat debugging.

3. Mengaktifkan dan Menganalisis Slow Query Log

Slow Query Log sangat berguna untuk mengidentifikasi query yang lambat, membantu dalam optimasi performa database.

Mengaktifkan Slow Query Log

Tambahkan konfigurasi berikut ke my.cnf:

slow_query_log = 1
slow_query_log_file = /var/log/mysql_slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
  • long_query_time = 2 → Merekam query yang berjalan lebih dari 2 detik.
  • log_queries_not_using_indexes = 1 → Merekam query yang tidak menggunakan indeks.

Kemudian restart MySQL:

systemctl restart mysql

Atau aktifkan secara langsung:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

Menganalisis Slow Query Log

Gunakan perintah berikut untuk melihat isi log:

cat /var/log/mysql_slow.log

Contoh isi log:

# Time: 2024-04-10T15:45:12
# User@Host: admin[admin] @ 192.168.1.100
# Query_time: 5.24 Lock_time: 0.01 Rows_sent: 10000 Rows_examined: 500000
SELECT * FROM orders WHERE order_date > '2024-01-01';

Kita bisa melihat:

  • Query_time → Waktu eksekusi query.
  • Lock_time → Waktu yang dihabiskan untuk mengunci tabel.
  • Rows_examined → Jumlah baris yang diperiksa.

Untuk analisis lebih lanjut, gunakan mysqldumpslow:

mysqldumpslow -s t /var/log/mysql_slow.log

Sortir query yang paling lambat berdasarkan waktu eksekusi:

mysqldumpslow -s t -t 5 /var/log/mysql_slow.log

4. Menggunakan Binary Log (Binlog) untuk Melacak Perubahan Data

Binary Log (Binlog) mencatat semua perubahan pada database yang berkaitan dengan INSERT, UPDATE, DELETE. Binlog berguna untuk replikasi dan recovery database.

Mengaktifkan Binlog

Tambahkan di my.cnf:

[mysqld]
log_bin = /var/log/mysql-bin
expire_logs_days = 7
binlog_format = ROW

Kemudian restart MySQL:

systemctl restart mysql

Cek status binlog:

SHOW BINARY LOGS;

Menganalisis Binlog dengan mysqlbinlog

mysqlbinlog /var/log/mysql-bin.000001 | less

Contoh isi binlog:

# at 12345
# User@Host: admin[admin] @ 192.168.1.100
# Query_time: 0.2
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');

Binlog sangat penting untuk rollback perubahan data dan replikasi database.

5. Mengelola Log MySQL

Log dapat menjadi sangat besar, sehingga perlu dikelola dengan baik.

Menghapus Log Lama Secara Otomatis

Tambahkan cron job untuk membersihkan log lama setiap minggu:

0 0 * * 7 find /var/log/mysql* -type f -mtime +7 -delete

Atau gunakan perintah SQL untuk menghapus binlog lama:

PURGE BINARY LOGS BEFORE '2024-04-01 00:00:00';

Menonaktifkan Log Sementara

Jika log terlalu besar, Anda bisa menonaktifkan sementara:

SET GLOBAL general_log = 'OFF';
SET GLOBAL slow_query_log = 'OFF';