Database mysql sangat popoler digunakan untuk data server namun jika salah seting akan memberikan dampat buruk seperti mysql server sering down mati, crash dan overhead + menjadikan RAM menjadi penuh kadang tidak hanya mati tapi perfoma sangat lambat padahal user belum begitu banyak dan spesifikasi VPS sudah lumayan contoh : CPU 4 core dan RAM 8 GB.
Saat ini admin fokus untuk seting optimasi performa anti down namun query tetap stabil khususnya untuk engine innodb dan mysql server versi 8++.
Contents
- 1 Seting Mysql Server
- 2 ๐งฉ Bagian Umum
- 3 โ๏ธ CONNECTION CONTROL
- 4 ๐ง INNODB ENGINE
- 5 ๐งฎ TEMPORARY & MEMORY TABLES
- 6 ๐ PER-CONNECTION BUFFERS
- 7 ๐ฆ PACKET & CACHE
- 8 ๐ชต LOGGING
- 9 โ๏ธ SQL MODE
- 10 ๐ TEMP DIRECTORY
- 11 ๐งฉ PERFORMANCE SCHEMA
- 12 ๐ก ESTIMASI PEMAKAIAN RAM
- 13 โ Kesimpulan & Rekomendasi Akhir
Seting Mysql Server
Untuk server linux, ubuntu buka ssh :
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Konfigurasi Mysql server ringan + Stabil RAM 8 + CPU 4 Core
[mysqld] user = mysql bind-address = 127.0.0.1 mysqlx-bind-address = 127.0.0.1 default-time-zone = "+07:00" # === CONNECTIONS === max_connections = 80 wait_timeout = 300 interactive_timeout = 300 skip-name-resolve thread_cache_size = 50 # === INNODB === innodb_buffer_pool_size = 1G innodb_buffer_pool_instances = 1 innodb_log_file_size = 256M innodb_log_buffer_size = 16M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = fsync innodb_file_per_table = 1 innodb_ft_min_token_size = 2 innodb_io_capacity = 100 innodb_io_capacity_max = 200 innodb_flush_neighbors = 1 # === TEMP & HEAP TABLES === tmp_table_size = 32M max_heap_table_size = 32M # === PER-CONNECTION BUFFERS === sort_buffer_size = 512K join_buffer_size = 512K read_buffer_size = 512K read_rnd_buffer_size = 512K # === PACKET & CACHE === max_allowed_packet = 64M table_open_cache = 256 # === LOGGING === log_error = /var/log/mysql/error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 skip-log-bin skip-external-locking # === SQL MODE === sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" # === TMPDIR === tmpdir = /tmp # === PERFORMANCE SCHEMA === performance_schema = 0 # === SECURE FILE PRIV === secure-file-priv = /var/lib/mysql-files
ini konfigurasi MySQL 8 yang ringan dan stabil untuk server 8 GB RAM. Di bawah ini saya jelaskan arti detail setiap bagian, fungsi tiap parameter, dampaknya, dan rekomendasi tambahan kecil agar sistemmu optimal, aman, dan efisien.
๐งฉ Bagian Umum
| Parameter | Penjelasan |
|---|---|
| user = mysql | Menentukan proses MySQL dijalankan sebagai user system mysql, bukan root. Aman dan sesuai standar Linux. |
| bind-address = 127.0.0.1 | MySQL hanya menerima koneksi lokal (dari server sendiri). Menutup akses remote, menambah keamanan. |
| mysqlx-bind-address = 127.0.0.1 | Sama seperti di atas, tapi untuk MySQL X Plugin (port 33060). |
| default-time-zone = “+07:00” | Set zona waktu default (WIB) untuk semua koneksi SQL. Berguna untuk konsistensi waktu log/data. |
๐น Rekomendasi:
Jika server akan diakses dari luar (misalnya aplikasi di server lain), ubah bind-address ke IP LAN server, tapi pastikan firewall aktif.
โ๏ธ CONNECTION CONTROL
| Parameter | Fungsi | Rekomendasi |
|---|---|---|
| max_connections = 80 | Batas koneksi simultan. Masing-masing koneksi bisa pakai 2โ10 MB RAM. Dengan 80 koneksi, total RAM tetap aman. | Naikkan ke 100 kalau sering muncul Too many connections. |
| wait_timeout = 300 | Tutup koneksi idle (nonaktif) setelah 300 detik (5 menit). Hemat resource. | Aman. |
| interactive_timeout = 300 | Timeout koneksi interaktif (CLI). Sama seperti di atas. | Aman. |
| skip-name-resolve | Hindari lookup DNS untuk koneksi (hemat waktu dan CPU). | Wajib diaktifkan untuk performa tinggi. |
| thread_cache_size = 50 | Cache threads agar koneksi baru tidak selalu bikin thread baru. Hemat CPU. | Nilai 50 cukup untuk server sedang. |
๐ง INNODB ENGINE
| Parameter | Fungsi | Rekomendasi & Penjelasan |
|---|---|---|
| innodb_buffer_pool_size = 1G | Cache utama InnoDB (data + index). Besarnya sangat menentukan performa. | 1 GB ideal untuk RAM 8 GB. Naikkan ke 2 GB jika MySQL sering ke disk (IO tinggi). |
| innodb_buffer_pool_instances = 1 | Jumlah pembagian buffer pool. 1 cukup untuk <2 GB. | Benar. |
| innodb_log_file_size = 256M | Ukuran redo log. Besar = jarang flush, tapi butuh waktu lebih lama saat recovery. | Ideal. |
| innodb_log_buffer_size = 16M | Buffer sementara untuk log. | Aman untuk server kecil. |
| innodb_flush_log_at_trx_commit = 2 | Flush ke disk tiap detik (bukan setiap commit). Sedikit kurang aman jika crash, tapi 2รโ3ร lebih cepat. | Setting performa terbaik untuk non-banking apps. |
| innodb_flush_method = O_DIRECT | Hindari double buffering dengan OS. Hemat RAM dan stabil di SSD. | Sangat direkomendasikan. |
| innodb_file_per_table = 1 | Setiap tabel punya file sendiri. Lebih efisien dan mudah maintenance. | Standar terbaik. |
| innodb_ft_min_token_size = 2 | Minimal panjang kata untuk fulltext index. Berguna untuk pencarian kata pendek. | Oke. |
๐งฎ TEMPORARY & MEMORY TABLES
| Fungsi | Penjelasan |
|---|---|
Batas maksimal tabel sementara (in-memory). Jika melebihi, MySQL pakai disk /tmp. |
Nilai 32M = hemat RAM, tapi masih cepat untuk query biasa. |
๐น Rekomendasi:
Naikkan ke 64M hanya kalau aplikasi sering melakukan query kompleks (GROUP BY besar).
๐ PER-CONNECTION BUFFERS
| Parameter | Penjelasan |
|---|---|
| Buffer ini dibuat per koneksi aktif. | Nilai kecil = hemat RAM. Nilai besar = cepat untuk query besar tapi boros. |
| Dengan 80 koneksi, total pemakaian buffer sekitar 160โ300 MB. | Aman untuk server 8 GB. |
๐น Rekomendasi:
Tetap di 512K, atau naik ke 1M jika banyak query ORDER BY dan JOIN berat.
๐ฆ PACKET & CACHE
| Parameter | Fungsi | Rekomendasi |
|---|---|---|
| max_allowed_packet | Ukuran maksimum data yang bisa dikirim dalam satu query. Misal file upload besar. | 64 M sudah ideal. |
| table_open_cache | Jumlah tabel yang disimpan terbuka di memori. | 256 cukup; naikkan ke 512 kalau ada >1000 tabel aktif. |
๐ชต LOGGING
| Parameter | Fungsi |
|---|---|
| log_error | Catat error ke file. |
| slow_query_log & long_query_time | Catat query yang lambat (>2 detik). Berguna untuk tuning. |
| skip-log-bin | Nonaktifkan binary log (tidak replikasi). Hemat disk & RAM. |
| skip-symbolic-links / skip-external-locking | Hindari fitur lama yang tidak aman. |
๐น Rekomendasi:
Cek slow_query_log secara berkala dengan:
untuk tahu query mana yang berat.
โ๏ธ SQL MODE
-
Mode โamanโ โ mencegah data invalid (misal kolom tanggal
0000-00-00). -
Nilai ini sudah optimal untuk mayoritas aplikasi (WordPress, Laravel, ERP).
๐ TEMP DIRECTORY
-
Lokasi MySQL membuat file sementara.
-
Pastikan partisi
/tmppunya ruang cukup (min. 2 GB). -
Jika
/tmpdi-mount sebagaitmpfs, RAM bisa cepat penuh โ lebih aman gunakan SSD.
๐น Rekomendasi:
Untuk server produksi, arahkan ke folder SSD:
dan beri izin:
๐งฉ PERFORMANCE SCHEMA
-
Menonaktifkan Performance Schema, modul analitik internal MySQL yang bisa makan 300โ600 MB RAM.
-
Dengan nilai 0 โ MySQL jauh lebih ringan.
๐ก ESTIMASI PEMAKAIAN RAM
| Komponen | Estimasi |
|---|---|
| InnoDB Buffer Pool | 1.5 GB |
| Log + Metadata | 200 MB |
| Thread/Connection Buffers | 300โ400 MB |
| Cache + Struktur | 150 MB |
| Total | โ 2.2โ2.5 GB |
โก๏ธ Aman dan efisien untuk server 8 GB.
Masih banyak ruang untuk OS dan web server.
โ Kesimpulan & Rekomendasi Akhir
| Tujuan | Nilai / Tindakan |
|---|---|
| Minimalkan RAM | Sudah optimal. Jangan naikkan buffer pool >2 GB. |
| Stabilitas | innodb_flush_log_at_trx_commit=2 sudah bagus. |
| Keamanan | Pertahankan user=mysql dan bind-address=127.0.0.1. |
| Pemeliharaan | Aktifkan slow_query_log untuk optimasi query. |
| Monitoring | Jalankan mysqltuner setelah 24 jam untuk penyesuaian real-time. |