Seting Mysql Server Tuning Performa Tidak mati / crash

Seting Mysql Server Tuning Performa Tidak mati / crash

Update 22/11/25 · Read 9 min

Database MySQL sangat populer digunakan sebagai database server karena kestabilan, fleksibilitas, dan dukungan komunitas yang luas. Namun, jika konfigurasi MySQL Tuning tidak tepat, dampaknya bisa serius. Server bisa sering down, crash, atau mengalami overhead yang berat, sehingga mengganggu layanan yang bergantung pada database.

Kesalahan konfigurasi juga bisa membuat RAM cepat penuh, bahkan ketika jumlah user atau query belum terlalu banyak. Hal ini sering terjadi jika buffer pool, per-connection buffers, atau jumlah koneksi maksimal diatur terlalu tinggi tanpa menyesuaikan kapasitas VPS. Akibatnya, MySQL mungkin tidak hanya mati, tetapi performanya juga menjadi sangat lambat, meskipun spesifikasi server sudah memadai.

Contoh kasus umum meliputi: penggunaan parameter deprecated atau tidak didukung di MySQL 8, setelan thread_handling yang salah, buffer per-connection terlalu besar, atau log InnoDB yang tidak optimal. Oleh karena itu, optimasi konfigurasi MySQL sesuai kapasitas RAM dan core CPU sangat penting agar database berjalan stabil, cepat, dan efisien.

Tunging Mysql CPU 4 core dan RAM 8 GB ~ OS Linux

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 :

#Backup
sudo mv /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup.$(date +%F_%H-%M-%S)
# Tulis baru
nano /etc/mysql/mysql.conf.d/mysqld.cnf
# seting permision dan grup akses
sudo chown root:mysql /etc/mysql/mysql.conf.d/mysqld.cnf
sudo chmod 640 /etc/mysql/mysql.conf.d/mysqld.cnf

Konfigurasi Mysql server ringan + Stabil RAM 8 + CPU 4 Core Versi minimal RAM kecil tp bisa untuk +500 koneksi query simultan:

[mysqld]
user = mysql
bind-address = 127.0.0.1
default-time-zone = "+07:00"

# === CONNECTIONS ===
max_connections = 250 # aman untuk RAM 8GB
wait_timeout = 300
interactive_timeout = 300
skip-name-resolve
thread_cache_size = 128 # thread reuse lebih efisien
# thread_handling = pool-of-threads 

# === INNODB ===
innodb_buffer_pool_size = 3G # ~37% RAM, seimbang untuk 8GB
innodb_buffer_pool_instances = 3
innodb_log_file_size = 512M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 1500
innodb_io_capacity_max = 2500
innodb_flush_neighbors = 0

# === INNODB THREADS ===
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# === TEMP & HEAP TABLES ===
tmp_table_size = 32M
max_heap_table_size = 32M

# === PER-CONNECTION BUFFERS ===
sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K

# === PACKET & CACHE ===
max_allowed_packet = 64M
table_open_cache = 2000

# === 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

# === SQL MODE ===
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

# === TMPDIR ===
tmpdir = /tmp

# === PERFORMANCE SCHEMA ===
performance_schema = 0 # Nonaktif → hemat RAM

# === SECURE FILE PRIV ===
secure-file-priv = /var/lib/mysql-files

Save + Restart mysql:

sudo systemctl restart mysql
sudo systemctl status mysql

NOTE: 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.

READ :  MYSQL : Install, setup database di linux Server (VPS)

Wajib Analisa penggunaan RAM setelah 3-5 Jam aktif pada jam sibuk:

ps -C mysqld -o pid,rss | awk 'NR>1 {sum+=$2} END {print "MySQL RAM:", sum/1024, "MB"}'

Keterangan Setingan SQL

Parameter, termasuk fungsi, efek, dan rekomendasi. Aku akan jelaskan dengan detail, supaya kamu paham alasan setiap setting.

[mysqld] dasar

user = mysql
bind-address = 127.0.0.1
default-time-zone = "+07:00"
Parameter Penjelasan Rekomendasi
user = mysql Menentukan user OS yang menjalankan MySQL. Biarkan mysql untuk keamanan.
bind-address = 127.0.0.1 MySQL hanya menerima koneksi lokal (localhost). Jika server hanya dipakai internal, biarkan. Kalau mau akses remote, ubah ke IP server atau 0.0.0.0.
default-time-zone = "+07:00" Set timezone default server. Sesuaikan dengan lokasi server/aplikasi.

Connections

max_connections = 250
wait_timeout = 300
interactive_timeout = 300
skip-name-resolve
thread_cache_size = 128
thread_handling = pool-of-threads
Parameter Penjelasan Rekomendasi
max_connections Jumlah koneksi simultan maksimal. 250 untuk RAM 8GB agar tidak kehabisan memory.
wait_timeout Timeout untuk koneksi idle non-interactive (detik). 300 detik = 5 menit, cukup standar.
interactive_timeout Timeout koneksi interaktif. Sama, 300 detik.
skip-name-resolve Mematikan DNS lookup untuk koneksi. Mengurangi latency dan overhead.
thread_cache_size Cache thread idle untuk reuse. 128 → thread reuse lebih efisien, mempercepat koneksi baru.
thread_handling = pool-of-threads  Tidak digunakan secara umum hanya tersedia di MySQL Enterprise atau versi tertentu.

InnoDB

innodb_buffer_pool_size = 3G
innodb_buffer_pool_instances = 3
innodb_log_file_size = 512M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_io_capacity = 1500
innodb_io_capacity_max = 2500
innodb_flush_neighbors = 0
Parameter Penjelasan Rekomendasi
innodb_buffer_pool_size Memory utama untuk caching data & index InnoDB. 3G → cukup untuk database aktif sedang, aman di RAM 8GB.
innodb_buffer_pool_instances Membagi buffer pool menjadi beberapa instance. 3 → mengurangi contention, sesuai buffer pool.
innodb_log_file_size Ukuran file redo log InnoDB. 512M → bagus untuk transaksi heavy, meningkatkan throughput write.
innodb_log_buffer_size Buffer log sementara sebelum flush ke disk. 32M → cukup untuk batch insert/update besar.
innodb_flush_log_at_trx_commit Cara log InnoDB flush ke disk. 2 → trade-off durability/performance. Lebih cepat daripada 1, sedikit risiko data hilang saat crash.
innodb_flush_method Cara InnoDB flush ke disk. O_DIRECT → bypass OS cache, mengurangi double caching.
innodb_file_per_table Setiap table pakai file terpisah. 1 → lebih mudah manajemen dan defrag.
innodb_io_capacity Estimasi I/O kapasitas SSD/HDD. 1500 → SSD standar, menentukan flush background.
innodb_io_capacity_max Maks I/O background. 2500 → jika flush backlog tinggi.
innodb_flush_neighbors Flush page bertetangga. 0 → lebih efisien di SSD.

InnoDB Threads

innodb_read_io_threads = 4
innodb_write_io_threads = 4
Parameter Penjelasan Rekomendasi
innodb_read_io_threads Jumlah thread I/O read paralel. 4 → cocok untuk 4 core CPU.
innodb_write_io_threads Jumlah thread I/O write paralel. 4 → meningkatkan throughput write di SSD.

Temp & Heap Tables

tmp_table_size = 32M
max_heap_table_size = 32M
Parameter Penjelasan Rekomendasi
tmp_table_size Maks ukuran table sementara di memory. 32M → aman untuk query join/aggregate medium.
max_heap_table_size Maks size table heap (MEMORY). 32M → sama.

Per-connection Buffers

sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
Parameter Penjelasan Rekomendasi
sort_buffer_size Memory per connection untuk sort. 256K → hemat RAM.
join_buffer_size Buffer untuk join tanpa index. 256K → cukup.
read_buffer_size Buffer untuk sequential read. 256K → aman.
read_rnd_buffer_size Buffer untuk read random (ORDER BY). 256K → hemat RAM.
READ :  Tips Membuat Index nGram Bloom Filter (ngrambf_v1) Paling Cepat di ClickHouse

Catatan: Total ~1MB per koneksi × 250 koneksi = ~250MB → aman di RAM 8GB.


Packet & Cache

max_allowed_packet = 64M
table_open_cache = 2000
Parameter Penjelasan Rekomendasi
max_allowed_packet Ukuran maksimal query/binary packet. 64M → cukup besar untuk batch insert/update.
table_open_cache Cache table descriptor terbuka. 2000 → bagus untuk database banyak table, kurangi open/close overhead.

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
Parameter Penjelasan Rekomendasi
log_error File log error MySQL. Simpan untuk debugging.
slow_query_log Aktifkan log query lambat. 1 → sangat direkomendasikan untuk optimasi query.
slow_query_log_file Lokasi file slow log. /var/log/mysql/slow.log
long_query_time Threshold deteksi query lambat (detik). 2 → bisa sesuaikan kebutuhan.
skip-log-bin Nonaktifkan binary log. Jika server tidak replication → hemat I/O.

SQL Mode

sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
  • Mencegah silent errors (data truncation, pembagian nol).

  • Rekomendasi: jangan nonaktifkan, membantu integritas data.


TMPDIR

tmpdir = /tmp
  • Lokasi table temporary & file sort.

  • Pastikan /tmp cukup besar atau arahkan ke disk cepat (SSD) untuk performa.


Performance Schema

performance_schema = 0
  • Nonaktif → hemat RAM.

  • Aktifkan hanya jika perlu profiling query/threads.


Secure File Priv

secure-file-priv = /var/lib/mysql-files
  • Batasi file import/export MySQL.

Rekomendasi: biarkan untuk keamanan.


Estimasi Pemakaian RAM

A. InnoDB Buffer Pool

innodb_buffer_pool_size = 3G
  • Digunakan untuk menyimpan data dan index aktif InnoDB.

  • 3GB dari 8GB → 37,5% RAM.

  • Penting karena sebagian besar query baca akan hit buffer pool → mengurangi I/O disk.


B. Per-connection Buffers

sort_buffer_size = 256K
join_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
  • Total per connection: 256K × 4 = ~1MB.

  • Dengan max_connections = 250: 1MB × 250 = ~250MB.

Catatan: ini hanya buffer yang dialokasikan saat query membutuhkan, tidak selalu full digunakan di semua koneksi.


C. Thread Stack

  • Default thread stack MySQL ≈ 256K–512K per thread.

  • 250 koneksi → ≈ 64–128MB.


D. Log Buffer

innodb_log_buffer_size = 32M
  • Digunakan sementara sebelum flush ke log file.

  • 32MB tetap, kecil dibanding buffer pool.


E. Memory Overhead Lain

  • Table cache, temp table, internal structures, sistem OS → sekitar 500–700MB.


🔹 Total Estimasi RAM

Komponen Estimasi
InnoDB Buffer Pool 3GB
Per-connection Buffers 250MB
Thread Stack 128MB
Log Buffer 32MB
Table Cache & Misc 600MB
Total ~4–4.5GB

✅ Masih ada sisa RAM untuk OS, disk cache, dan spike query.

Catatan: Jika kamu ingin 500 koneksi aktif bersamaan → per-connection buffer × 500 = 500MB → total RAM bisa mencapai 5GB+, masih aman di 8GB tapi margin lebih tipis → connection pooling disarankan.


Potensi Bottleneck / Pentup

Bottleneck Penjelasan & Rekomendasi
Max Connections 250 sudah konservatif; untuk 500 query gunakan connection pooling di aplikasi.
Disk I/O innodb_io_capacity 1500/2500 → SSD cepat diperlukan, hindari HDD lambat.
Query Lambat slow_query_log aktif → gunakan untuk optimasi query, indeks, dan join.
Thread contention thread_handling = pool-of-threads → mengurangi overhead 250 thread simultan.
Memory Spike Query besar (JOIN / ORDER BY) bisa menggunakan per-connection buffer lebih dari estimasi → batasi sort_buffer_size & join_buffer_size.

FAQ Umum ?

Q1: Bisa handle 500 query simultan dengan RAM 8GB?

READ :  Optimasi Query di ClickHouse: Tips dan Trik untuk Performa Maksimal

Tidak langsung, karena max_connections 250. Gunakan connection pooling di aplikasi → bisa mensimulasikan 500 query simultan tapi hanya 250 koneksi aktif di MySQL.

Q2: Apakah InnoDB buffer pool 3GB cukup?

Cukup untuk database aktif <3GB. Kalau data aktif lebih besar → pertimbangkan 4–5GB jika RAM tersedia.

Q3: Apa efek innodb_flush_log_at_trx_commit = 2?

  • Lebih cepat write-heavy workload, tapi ada risiko data hilang saat crash.

  • Jika durability penting → gunakan 1.

Q4: Harus aktifkan performance_schema?

  • Nonaktif (0) → hemat RAM.

  • Aktifkan hanya untuk profiling query atau debugging.

Q5: Apa pengaruh thread pool?

thread_handling = pool-of-threads → sangat membantu handling banyak koneksi. Tanpa ini, 250 koneksi = 250 thread → lebih banyak CPU context switch dan RAM overhead.