Seting Mysql Server Performa Tidak mati / crash

Seting Mysql Server Performa Tidak mati / crash

Update 11/11/25 ยท Read 6 minute

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++.

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

[mysqld]
user = mysql
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
default-time-zone = "+07:00"
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.
READ :  Membuat Sistem Login PHP Mysql + Hashing Password BCRYPT

๐Ÿ”น 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

max_connections = 80
wait_timeout = 300
interactive_timeout = 300
skip-name-resolve
thread_cache_size = 50
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

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 = O_DIRECT
innodb_file_per_table = 1
innodb_ft_min_token_size = 2
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

tmp_table_size = 32M
max_heap_table_size = 32M

๐Ÿ”น Rekomendasi:
Naikkan ke 64M hanya kalau aplikasi sering melakukan query kompleks (GROUP BY besar).


๐Ÿ” PER-CONNECTION BUFFERS

sort_buffer_size = 512K
join_buffer_size = 512K
read_buffer_size = 512K
read_rnd_buffer_size = 512K
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

max_allowed_packet = 64M
table_open_cache = 256
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

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-symbolic-links
skip-external-locking
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:

mysqldumpslow /var/log/mysql/slow.log | less

untuk tahu query mana yang berat.


โš™๏ธ SQL MODE

sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
  • Mode โ€œamanโ€ โ€” mencegah data invalid (misal kolom tanggal 0000-00-00).

  • Nilai ini sudah optimal untuk mayoritas aplikasi (WordPress, Laravel, ERP).


๐Ÿ“ TEMP DIRECTORY

tmpdir = /tmp
  • Lokasi MySQL membuat file sementara.

  • Pastikan partisi /tmp punya ruang cukup (min. 2 GB).

  • Jika /tmp di-mount sebagai tmpfs, RAM bisa cepat penuh โ€” lebih aman gunakan SSD.

๐Ÿ”น Rekomendasi:
Untuk server produksi, arahkan ke folder SSD:

tmpdir = /var/tmp/mysqltmp

dan beri izin:

sudo mkdir -p /var/tmp/mysqltmp
sudo chown mysql:mysql /var/tmp/mysqltmp

๐Ÿงฉ PERFORMANCE SCHEMA

performance_schema = 0
  • Menonaktifkan Performance Schema, modul analitik internal MySQL yang bisa makan 300โ€“600 MB RAM.

  • Dengan nilai 0 โ†’ MySQL jauh lebih ringan.


๐Ÿ’ก ESTIMASI PEMAKAIAN RAM

โžก๏ธ 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.