Merhaba arkadaşlar, bugün sizlere özellikle yük altındaki veritabanı sunucularında can kurtarıcı bir yöntem olan Yavaş Sorgu Logu'nu (Slow Query Log) nasıl etkinleştireceğinizi ve bu logları analiz ederek performans darboğazlarını nasıl tespit edeceğinizi anlatacağım. Benim sunucularda genelde ilk baktığım yerlerden biridir, çünkü tek bir kötü yazılmış sorgu tüm sistemi yavaşlatabilir. Bu rehberi takip ederek, hangi SQL sorgularınızın optimizasyona ihtiyacı olduğunu net bir şekilde görebileceksiniz.
MySQL/MariaDB'de Slow Query Log'u Etkinleştirme
Öncelikle, bu loglamayı etkinleştirmek için veritabanı sunucumuzun konfigürasyon dosyasına girmemiz gerekiyor. Genellikle bu dosya /etc/mysql/my.cnf veya /etc/mysql/mariadb.conf.d/50-server.cnf yolunda bulunur. Benim tercihim, bu ayarları ayrı bir dosyada (örn: /etc/mysql/conf.d/slow-query.cnf) tutmaktır, böylece ana yapılandırma dosyası karışmaz.
Düzenlemek için nano veya vi editörünü kullanabilirsiniz. Aşağıdaki ayarları ilgili dosyaya ekleyin veya varsa değiştirin.
Şimdi bu ayarların ne anlama geldiğini açıklayayım:
- slow_query_log = 1: Yavaş sorgu loglamasını açar.
- slow_query_log_file: Logların yazılacağı dosyanın tam yoludur. Bu yolu ve dosya izinlerini kontrol etmelisiniz.
- long_query_time = 2: Bu, kritik bir eşik değeridir. 2 saniye ve üzerinde çalışan sorgular loglanacaktır. Başlangıç için 2 iyidir, daha sonra sunucu yükünüze göre 1 veya 0.5'e düşürebilirsiniz.
- log_queries_not_using_indexes = 1: İndeks kullanmayan sorguları da (süreye bakmaksızın) loglar. Bu, tasarım hatalarını bulmak için altın değerindedir.
Ayarları kaydettikten sonra, MySQL/MariaDB servisini yeniden başlatarak değişiklikleri aktif hale getiriyoruz.
Servisin sorunsuz başladığından emin olduktan sonra, log dosyasının oluşup oluşmadığını ve yazma izinlerini kontrol edelim.
Slow Query Loglarını Analiz Etme
Loglar birikmeye başladıktan sonra (birkaç saat veya bir gün sonra) asıl işimiz başlıyor: Analiz. Ham log dosyasını okumak zor olabilir. Bu noktada bize en çok yardımcı olacak araç, MySQL ile birlikte gelen mysqldumpslow aracıdır. Bu araç, logları özetleyerek okunabilir bir rapor haline getirir.
En yaygın ve yavaş olan sorguları görmek için şu komutu kullanabilirsiniz:
Bu komutun parametrelerini açıklayayım:
- -t 10: Sadece ilk 10 sonucu göster.
- -s at: Sorguları ortalama çalışma süresine (average time) göre sırala. -s c (count) ile en sık çalıştırılan sorguları da görebilirsiniz.
Çıktı, her benzersiz sorgu için ortalama süre, toplam süre, kaç kez çalıştığı gibi bilgileri gösterir. Burada sürekli tekrar eden ve yüksek süreli sorguları hedef almalısınız.
Bulunan Yavaş Sorguları Optimize Etme
Analiz sonucunda bir sorguyu tespit ettik diyelim. İlk adım, o sorgunun tam halini ve EXPLAIN çıktısını almaktır. EXPLAIN, sorgunuzun nasıl çalıştığını, hangi indeksleri kullandığını adım adım gösteren en değerli araçtır.
Örneğin, loglardan yavaş olduğunu gördüğünüz bir SELECT sorgusunu alın ve başına EXPLAIN ekleyerek çalıştırın:
EXPLAIN çıktısında özellikle type sütununa bakın. "ALL" görüyorsanız bu, tam tablo taraması (full table scan) yapıldığı anlamına gelir ve bu çok kötüdür. Hemen ilgili sütunlar üzerinde (user_id, okunma_durumu) bir bileşik indeks oluşturmayı düşünmelisiniz.
Dikkat Edilmesi Gerekenler ve En İyi Pratikler
Bu güçlü aracı kullanırken şu noktalara çok dikkat etmelisiniz:
1. Log Dosya Boyutu: /var/log/mysql/mysql-slow.log dosyası kontrolsüz büyüyebilir ve disk alanını tüketebilir. Mutlaka logrotate ile döndürülmeli (rotate) ve eski loglar sıkıştırılmalıdır.
2. long_query_time Değeri: Canlı ve yüksek trafikli bir sunucuda bu değeri çok düşük (örn: 0.1) yapmak, devasa log dosyaları oluşturup disk I/O'ya ek yük bindirebilir. Başlangıçta 2 ile başlayıp, optimizasyon ilerledikçe kademeli olarak düşürün.
3. Geliştirme/Test Ortamında Açık Tutun: Yeni kod veya sorgu dağıtımı yapmadan önce, bu özelliği geliştirme ortamınızda mutlaka açık tutun ve yavaş sorguları üretim öncesinde yakalayın.
4. Percona Toolkit: Daha gelişmiş analiz için pt-query-digest aracına da göz atmanızı şiddetle tavsiye ederim. Mysqldumpslow'dan çok daha detaylı raporlar sunar.
Sonuç olarak, Yavaş Sorgu Logu, veritabanı performans optimizasyonunun temel taşıdır. Düzenli olarak bu logları analiz etmek, proaktif bir şekilde sorunları üretimde yaşanmadan önce tespit etmenizi sağlar.
Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? long_query_time değerinizi kaç saniye olarak belirlediniz? Ya da farklı bir log analiz aracı kullanıyor musunuz? Tecrübelerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim!
Öncelikle, bu loglamayı etkinleştirmek için veritabanı sunucumuzun konfigürasyon dosyasına girmemiz gerekiyor. Genellikle bu dosya /etc/mysql/my.cnf veya /etc/mysql/mariadb.conf.d/50-server.cnf yolunda bulunur. Benim tercihim, bu ayarları ayrı bir dosyada (örn: /etc/mysql/conf.d/slow-query.cnf) tutmaktır, böylece ana yapılandırma dosyası karışmaz.
Düzenlemek için nano veya vi editörünü kullanabilirsiniz. Aşağıdaki ayarları ilgili dosyaya ekleyin veya varsa değiştirin.
NGINX:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
Şimdi bu ayarların ne anlama geldiğini açıklayayım:
- slow_query_log = 1: Yavaş sorgu loglamasını açar.
- slow_query_log_file: Logların yazılacağı dosyanın tam yoludur. Bu yolu ve dosya izinlerini kontrol etmelisiniz.
- long_query_time = 2: Bu, kritik bir eşik değeridir. 2 saniye ve üzerinde çalışan sorgular loglanacaktır. Başlangıç için 2 iyidir, daha sonra sunucu yükünüze göre 1 veya 0.5'e düşürebilirsiniz.
- log_queries_not_using_indexes = 1: İndeks kullanmayan sorguları da (süreye bakmaksızın) loglar. Bu, tasarım hatalarını bulmak için altın değerindedir.
Ayarları kaydettikten sonra, MySQL/MariaDB servisini yeniden başlatarak değişiklikleri aktif hale getiriyoruz.
Bash:
sudo systemctl restart mysql
# veya
sudo systemctl restart mariadb
Servisin sorunsuz başladığından emin olduktan sonra, log dosyasının oluşup oluşmadığını ve yazma izinlerini kontrol edelim.
Loglar birikmeye başladıktan sonra (birkaç saat veya bir gün sonra) asıl işimiz başlıyor: Analiz. Ham log dosyasını okumak zor olabilir. Bu noktada bize en çok yardımcı olacak araç, MySQL ile birlikte gelen mysqldumpslow aracıdır. Bu araç, logları özetleyerek okunabilir bir rapor haline getirir.
En yaygın ve yavaş olan sorguları görmek için şu komutu kullanabilirsiniz:
Bash:
sudo mysqldumpslow /var/log/mysql/mysql-slow.log -t 10 -s at
Bu komutun parametrelerini açıklayayım:
- -t 10: Sadece ilk 10 sonucu göster.
- -s at: Sorguları ortalama çalışma süresine (average time) göre sırala. -s c (count) ile en sık çalıştırılan sorguları da görebilirsiniz.
Çıktı, her benzersiz sorgu için ortalama süre, toplam süre, kaç kez çalıştığı gibi bilgileri gösterir. Burada sürekli tekrar eden ve yüksek süreli sorguları hedef almalısınız.
Analiz sonucunda bir sorguyu tespit ettik diyelim. İlk adım, o sorgunun tam halini ve EXPLAIN çıktısını almaktır. EXPLAIN, sorgunuzun nasıl çalıştığını, hangi indeksleri kullandığını adım adım gösteren en değerli araçtır.
Örneğin, loglardan yavaş olduğunu gördüğünüz bir SELECT sorgusunu alın ve başına EXPLAIN ekleyerek çalıştırın:
SQL:
EXPLAIN SELECT FROM kullanici_mesajlari WHERE user_id = 123 AND okunma_durumu = 0;
EXPLAIN çıktısında özellikle type sütununa bakın. "ALL" görüyorsanız bu, tam tablo taraması (full table scan) yapıldığı anlamına gelir ve bu çok kötüdür. Hemen ilgili sütunlar üzerinde (user_id, okunma_durumu) bir bileşik indeks oluşturmayı düşünmelisiniz.
Bu güçlü aracı kullanırken şu noktalara çok dikkat etmelisiniz:
1. Log Dosya Boyutu: /var/log/mysql/mysql-slow.log dosyası kontrolsüz büyüyebilir ve disk alanını tüketebilir. Mutlaka logrotate ile döndürülmeli (rotate) ve eski loglar sıkıştırılmalıdır.
2. long_query_time Değeri: Canlı ve yüksek trafikli bir sunucuda bu değeri çok düşük (örn: 0.1) yapmak, devasa log dosyaları oluşturup disk I/O'ya ek yük bindirebilir. Başlangıçta 2 ile başlayıp, optimizasyon ilerledikçe kademeli olarak düşürün.
3. Geliştirme/Test Ortamında Açık Tutun: Yeni kod veya sorgu dağıtımı yapmadan önce, bu özelliği geliştirme ortamınızda mutlaka açık tutun ve yavaş sorguları üretim öncesinde yakalayın.
4. Percona Toolkit: Daha gelişmiş analiz için pt-query-digest aracına da göz atmanızı şiddetle tavsiye ederim. Mysqldumpslow'dan çok daha detaylı raporlar sunar.
Sonuç olarak, Yavaş Sorgu Logu, veritabanı performans optimizasyonunun temel taşıdır. Düzenli olarak bu logları analiz etmek, proaktif bir şekilde sorunları üretimde yaşanmadan önce tespit etmenizi sağlar.
Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? long_query_time değerinizi kaç saniye olarak belirlediniz? Ya da farklı bir log analiz aracı kullanıyor musunuz? Tecrübelerinizi ve sorularınızı aşağıya yazmaktan çekinmeyin. Hep birlikte öğrenelim!