1okunma
Makale6 dk okuma

My.cnf Optimizasyon Kılavuzu

· Slaweally· 6 dk okuma
My.cnf Optimizasyon Kılavuzu

MySQL Performans Canavarı: Güncel ve Güvenli my.cnf Optimizasyon Kılavuzu

Merhaba dostlar! Veri tabanımızın hızı, uygulamamızın can damarıdır. Birçok sunucu yöneticisi ve yazılımcı, MySQL'i varsayılan ayarlarıyla bırakma hatasına düşer. Oysa /etc/my.cnf (veya bazı sistemlerde /etc/mysql/my.cnf) dosyası üzerinde yapacağımız stratejik dokunuşlarla, veri tabanımızın performansını katlamak ve kaynak tüketimini optimize etmek elimizde.

Ancak internette dolaşan eski makalelerdeki ayarları körü körüne uygulamak, modern MySQL sürümlerinde (MySQL 8.x ve sonrası) sunucunuzun hiç açılmamasına neden olabilir. Gelin şimdi emektar my.cnf parametrelerini günümüz standartlarına göre güncelleyelim, hatalı/eski kalmış ayarları düzeltelim ve sunucumuzu uçuşa geçirelim!

Adım 1: Altın Kural – Önce Yedek Alın!

Performans ayarlarına geçmeden önce mevcut dosyamızı mutlaka yedekliyoruz. İşler ters giderse tek bir komutla eski halimize dönebilmeliyiz.

Terminali açın ve şu komutla yedeğinizi alın:

Bash

 

cp /etc/my.cnf /etc/my.cnf.bak

Şimdi dosyayı düzenlemek için favori editörümüzü (örneğin nano) kullanalım:

Bash

 

nano /etc/my.cnf

Adım 2: Modern ve Optimize Edilmiş my.cnf Şablonu

Aşağıdaki konfigürasyon, yaklaşık 8 GB RAM kapasitesine sahip ve ağırlıklı olarak InnoDB motorunu kullanan modern bir sunucu mimarisi esas alınarak optimize edilmiştir. İçerisindeki yorum satırlarını dikkatlice okuyarak kendi sunucunuza göre esnetebilirsiniz.

Ini, TOML

 

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock [mysqld]
# --- Genel ve Bağlantı Yapılandırmaları ---
port = 3306
socket = /var/lib/mysql/mysql.sock
datadir = /var/lib/mysql # Bağımsız bağlantıların işletim sistemi kuyruğundaki limitini belirler. High-traffic siteler için idealdir.
back_log = 100
max_connections = 300
# Bağlantı hatalarında yük dengeleyici veya proxy kullanıyorsanız sunucunun bloklanmasını engeller.
max_connect_errors = 1000000
# Tek bir sorgu paketinin maksimum boyutu (Büyük veriler/blob alanlar için önemli).
max_allowed_packet = 64M # --- Bellek ve Performans Ayarları ---
# Bellekte oluşturulacak geçici tabloların maksimum boyutu.
max_heap_table_size = 64M
tmp_table_size = 64M # Sıralama (ORDER BY / GROUP BY) işlemleri için her thread'e ayrılan bellek. Çok yüksek tutulmamalıdır.
sort_buffer_size = 4M
# İndeks içermeyen JOIN'lerin performans etkisini azaltmak için ayrılan bellek.
join_buffer_size = 4M
# Bağlantıların havuzda ne kadar süre tutulacağını belirler. İş parçacığı oluşturma yükünü azaltır.
thread_cache_size = 32
# Her bir bağlantının (thread) kullanacağı yığın boyutu.
thread_stack = 256K # Açık tutulacak tablo önbellek miktarı (Eski adı: table_cache)
table_open_cache = 4096 # --- InnoDB Optimizasyonu (Kritik Bölüm) ---
# En kritik ayar! 8GB RAM'e sahip özel bir DB sunucusu için ~5.5G - 6G arası idealdir.
innodb_buffer_pool_size = 5.5G # Her tablonun kendi .ibd dosyasında saklanmasını sağlar. Yönetimi ve disk yönetimini kolaylaştırır.
innodb_file_per_table = 1 # İşlem günlüklerinin diske yazılma sıklığı. # 1 = Tam ACID uyumu (En güvenli, sıfır veri kaybı). # 2 = Performans odaklı (Elektrik kesintisinde 1-2 saniyelik veri kaybı göze alınıyorsa).
innodb_flush_log_at_trx_commit = 1 # InnoDB günlük arabellek boyutu.
innodb_log_buffer_size = 16M
# Günlük dosyalarının boyutu. Büyük işlemler için yüksek tutulmalıdır.
innodb_log_file_size = 1G
innodb_log_files_in_group = 2 # İşletim sistemi önbelleğini bypass ederek doğrudan diske yazar (Çift önbelleğe almayı önler, Linux için şarttır).
innodb_flush_method = O_DIRECT
# Kilitlenme (Deadlock) zaman aşımı süresi (saniye).
innodb_lock_wait_timeout = 50 # --- Loglama ve Hata Takibi ---
# Günlüklerin senkronizasyonu (1 en güvenlisidir).
sync_binlog = 1
log_error = /var/log/mysql/error.log # Yavaş sorgu analizi (Performans düşüren sorguları yakalamak için cankurtarandır)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # --- Legacy / Eski MyISAM Ayarları (Yalnızca dahili geçici tablolar için) ---
key_buffer_size = 32M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M [mysqldump]
quick
max_allowed_packet = 64M [mysql]
no-auto-rehash

Adım 3: Neleri Düzelttik? (Hatalar ve Güncellemeler)

Eski makalenizdeki bazı parametreler modern MySQL mimarisinde ya tamamen kaldırıldı ya da isim değiştirdi. Eğer eski hallerini kullansaydınız veri tabanınız çalışmazdı. İşte yapılan kritik düzeltmeler:

Eski/Hatalı ParametreModern/Doğru KullanımAçıklama
table_cachetable_open_cacheMySQL 5.x serisinden sonra parametrenin adı güncellendi.
query_cache_size / limitTamamen KaldırıldıSorgu Önbelleği (Query Cache), modern çok çekirdekli işlemcilerde performans darboğazı yarattığı için MySQL 8.0 ile birlikte tamamen emekli edildi.
default_table_typedefault_storage_engineTablo tipi yerine "depolama motoru" ifadesi standartlaştırıldı. Zaten modern MySQL'de varsayılan InnoDB'dir.
skip-bdbKaldırıldıBerkeleyDB (BDB) desteği MySQL'den yıllar önce çıkarıldı. Bu satır artık geçersiz.
innodb_additional_mem_pool_sizeKaldırıldıMySQL 5.7 sürümüyle birlikte tamamen kaldırılan, artık ihtiyaç duyulmayan bir bellek havuzuydu.
log_slow_queriesslow_query_logYavaş sorguları açma komutu artık boolean (0 veya 1) alan bir değişkene dönüştürüldü.
[isamchk] / [myisamchk][myisamchk]ISAM motoru tarihe karıştı, sadece MyISAM kaldı. Ancak günümüzde her şey InnoDB olduğu için bu değerleri minimal seviyede tuttuk.
/tmp kullanımı/var/lib/mysqlSoket ve geçici dosyaların /tmp dizininde olması, bazı Linux dağıtımlarında otomatik temizlik (tmpwatch) kurbanı olmanıza ve MySQL'in çökmesine neden olabiliyor. Güvenli dizinlere taşındı.

Adım 4: Ayarları Kaydetme ve MySQL'i Yeniden Başlatma

Dosyayı düzenledikten sonra:

  1. CTRL + O ardından Enter ile kaydedin.
  2. CTRL + X ile editörden çıkın.

Yapılandırmanın devreye girmesi için MySQL servisini yeniden başlatmamız gerekiyor. Güncel Linux sistemlerinde (systemd kullanan CentOS, Ubuntu, Debian vb.) eski service mysql restart komutu yerine modern komutları kullanıyoruz:

Bash

 

# Ubuntu / Debian sistemler için:
systemctl restart mysql # CentOS / RHEL / AlmaLinux için:
systemctl restart mysqld

Durum Kontrolü

Servisin sorunsuz bir şekilde ayağa kalktığından emin olmak için şu komutu çalıştırabilirsiniz:

Bash

 

systemctl status mysqld # veya mysql

Eğer bir hata alırsanız, panik yapmayın. /var/log/mysql/error.log dosyasındaki son satırlara bakarak hangi parametrede yazım hatası yaptığınızı kolayca bulup düzeltebilirsiniz.

Veri tabanınız artık çok daha kararlı, modern ve yüksek yükleri kaldırabilecek kapasitede! Bol hitli ve performanslı günler dilerim.

comments[] (0)

Henüz yorum yok. İlk yorumu siz yazın.

Yorum Yaz

stats
site.metrics
628bugün ziyaretçi
2524bugün görüntülenme
14411toplam ziyaretçi
57142toplam görüntülenme
151içerik
829yorum