Merhaba arkadaşlar, bugün sizlere sunucu yönetiminde sıkça karşılaştığımız, sorun giderme ve optimizasyon için altın değerinde olan MySQL/MariaDB log dosyalarından bahsedeceğim. Bu logları doğru okuyup yönetebilirseniz, performans sorunlarını kökünden çözebilir, gizli hataları yakalayabilir ve veritabanınızın sağlığını sürekli takip edebilirsiniz. Gelin bu log türlerini tek tek inceleyelim.
Hangi Log Dosyaları Var ve Ne İşe Yarar?
Temel olarak üç önemli log türüyle çalışıyoruz. Her birinin yeri ve amacı farklıdır.
Error Log (Hata Günlüğü)
Başlatma/duraklatma hataları, kritik sorunlar, çökme bilgileri ve uyarı mesajlarının yazıldığı yerdir. Sorun gidermede ilk bakılacak yerdir. Dosya yolu genellikle /var/log/mysql/error.log veya /var/log/mariadb/mariadb.log şeklindedir.
General Query Log (Genel Sorgu Günlüğü)
Veritabanına yapılan TÜM bağlantıları ve çalıştırılan TÜM sorguları kaydeder. Çok detaylı olduğu için sürekli açık tutulmaz, performansı etkiler ve çok yer kaplar. Sadece belirli bir süre için, şüpheli bir durumu veya tüm sorguları izlemek gerektiğinde aktif edilir.
Slow Query Log (Yavaş Sorgu Günlüğü)
Performans optimizasyonunun kalbi burasıdır. Belirlediğiniz bir süreden (örn: 2 saniye) daha uzun süren sorguları buraya kaydeder. Hangi sorguların, neden yavaş çalıştığını analiz edip index ekleyerek veya sorguyu optimize ederek sunucu yükünü ciddi oranda düşürebilirsiniz.
Log Konfigürasyonu ve Yönetimi
Bu logları yönetmek için ana konfigürasyon dosyasına (genellikle /etc/mysql/my.cnf veya /etc/my.cnf) müdahale ederiz. Benim sunucularda genelde kullandığım yöntem, ayarları bu dosyadan yapmaktır. Aşağıdaki ayarları [mysqld] bölümünün altına ekleyebilirsiniz.
Ayarları değiştirdikten sonra MySQL/MariaDB servisini yeniden başlatmalısınız.
Log Dosyalarını Döndürme (Log Rotation)
Log dosyaları, özellikle General Log, çok hızlı büyüyebilir ve diskinizi doldurabilir. Bunu önlemek için logrotate kullanırız. Aşağıdaki gibi bir konfigürasyon dosyası (/etc/logrotate.d/mysql) oluşturabilirsiniz.
Bu ayar, logları günlük olarak döndürür, 7 günlük arşiv tutar ve sıkıştırır.
Logları Analiz Etme
Error Log'u basitçe tail veya less komutuyla okuyabilirsiniz.
Ancak Slow Query Log'u okumak için daha akıllı araçlar var. Benim en çok kullandığım araç mysqldumpslow aracıdır. Yavaş sorguları özetler ve sıralar.
Daha detaylı ve renkli analiz için pt-query-digest (Percona Toolkit) aracını şiddetle tavsiye ederim. Bu araç, yavaş sorgu log'unuzu adeta bir rapora dönüştürür.
Sonuç olarak, bu logları doğru yapılandırmak ve düzenli olarak kontrol etmek, proaktif bir sistem yöneticisinin en önemli görevlerinden biridir. Siz bu log yönetimini kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullandığınız araçlar veya yöntemler var mı? Ya da bu konuyla ilgili bir sorusu olan arkadaşlar aşağıya yazsın, birlikte tartışalım.
Temel olarak üç önemli log türüyle çalışıyoruz. Her birinin yeri ve amacı farklıdır.
Başlatma/duraklatma hataları, kritik sorunlar, çökme bilgileri ve uyarı mesajlarının yazıldığı yerdir. Sorun gidermede ilk bakılacak yerdir. Dosya yolu genellikle /var/log/mysql/error.log veya /var/log/mariadb/mariadb.log şeklindedir.
Veritabanına yapılan TÜM bağlantıları ve çalıştırılan TÜM sorguları kaydeder. Çok detaylı olduğu için sürekli açık tutulmaz, performansı etkiler ve çok yer kaplar. Sadece belirli bir süre için, şüpheli bir durumu veya tüm sorguları izlemek gerektiğinde aktif edilir.
Performans optimizasyonunun kalbi burasıdır. Belirlediğiniz bir süreden (örn: 2 saniye) daha uzun süren sorguları buraya kaydeder. Hangi sorguların, neden yavaş çalıştığını analiz edip index ekleyerek veya sorguyu optimize ederek sunucu yükünü ciddi oranda düşürebilirsiniz.
Bu logları yönetmek için ana konfigürasyon dosyasına (genellikle /etc/mysql/my.cnf veya /etc/my.cnf) müdahale ederiz. Benim sunucularda genelde kullandığım yöntem, ayarları bu dosyadan yapmaktır. Aşağıdaki ayarları [mysqld] bölümünün altına ekleyebilirsiniz.
INI:
# ERROR LOG AYARLARI
log_error = /var/log/mysql/error.log
# SLOW QUERY LOG AYARLARI
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 # 2 saniyeden uzun sorgular kaydedilir.
log_queries_not_using_indexes = 1 # Index kullanmayan sorguları da logla (Dikkatli kullanın).
# GENERAL QUERY LOG AYARLARI (GEREKMEDİKÇE KAPALI TUTUN)
general_log = 0
general_log_file = /var/log/mysql/mysql-general.log
Ayarları değiştirdikten sonra MySQL/MariaDB servisini yeniden başlatmalısınız.
Bash:
sudo systemctl restart mysql # veya mariadb
Log dosyaları, özellikle General Log, çok hızlı büyüyebilir ve diskinizi doldurabilir. Bunu önlemek için logrotate kullanırız. Aşağıdaki gibi bir konfigürasyon dosyası (/etc/logrotate.d/mysql) oluşturabilirsiniz.
Kod:
/var/log/mysql/.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 mysql adm
sharedscripts
postrotate
test -x /usr/bin/mysqladmin || exit 0
MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
$MYADMIN ping &>/dev/null && $MYADMIN flush-logs
endscript
}
Bu ayar, logları günlük olarak döndürür, 7 günlük arşiv tutar ve sıkıştırır.
Error Log'u basitçe tail veya less komutuyla okuyabilirsiniz.
Bash:
sudo tail -f /var/log/mysql/error.log
Ancak Slow Query Log'u okumak için daha akıllı araçlar var. Benim en çok kullandığım araç mysqldumpslow aracıdır. Yavaş sorguları özetler ve sıralar.
Bash:
sudo mysqldumpslow /var/log/mysql/mysql-slow.log
Daha detaylı ve renkli analiz için pt-query-digest (Percona Toolkit) aracını şiddetle tavsiye ederim. Bu araç, yavaş sorgu log'unuzu adeta bir rapora dönüştürür.
Bash:
sudo pt-query-digest /var/log/mysql/mysql-slow.log
Sonuç olarak, bu logları doğru yapılandırmak ve düzenli olarak kontrol etmek, proaktif bir sistem yöneticisinin en önemli görevlerinden biridir. Siz bu log yönetimini kendi sunucularınızda nasıl yapıyorsunuz? Farklı kullandığınız araçlar veya yöntemler var mı? Ya da bu konuyla ilgili bir sorusu olan arkadaşlar aşağıya yazsın, birlikte tartışalım.