Merhaba arkadaşlar, bugün sizlere özellikle yoğun yazma işlemlerinin olduğu MySQL/MariaDB sunucularında performansı ciddi anlamda etkileyen bir konudan bahsedeceğim: InnoDB Log File Size (ib_logfile) ayarı. Bu log dosyaları, henüz diske yazılmamış veri değişikliklerini (redo log) tutar. Varsayılan boyutu genelde 48MB'dır ve bu, yüksek yazma iş yükü olan bir sunucuda saniyede yüzlerce checkpoint oluşmasına, diske sürekli yazma yapılmasına ve dolayısıyla performans düşüklüğüne sebep olur. Doğru boyuta ayarlamak, bu darboğazı ortadan kaldırır ve yazma performansınızı gözle görülür şekilde artırır.
Ön Hazırlık ve Mevcut Durum Analizi
Öncelikle, bu işlemi yapmadan önce MySQL/MariaDB servisinizi durdurmanız gerekiyor. Çünkü log dosyalarını yeniden boyutlandırmak için InnoDB'nin kapalı olması şart. Ayrıca, mevcut log dosyalarınızın boyutunu kontrol edelim.
Ayrıca, kaç tane log dosyanız olduğunu da kontrol edin.
Genellikle bu değer 2'dir. Yani /var/lib/mysql (veya veri dizininiz) altında ib_logfile0 ve ib_logfile1 dosyalarını görebilirsiniz.
Adım Adım Log File Size Değiştirme
1. MySQL/MariaDB Servisini Durdurun:
veya
2. Mevcut Log Dosyalarını Yedekleyin veya Silin:
Bu adım kritiktir. MySQL kapalıyken, mevcut ib_logfile dosyalarını silmelisiniz. InnoDB, servis yeniden başlatıldığında yeni boyutta bu dosyaları otomatik oluşturacaktır.
Benim sunucularda genelde doğrudan silmek yerine /tmp dizinine taşımayı tercih ederim, işlem başarılı olursa daha sonra temizlersiniz.
3. MySQL/MariaDB Konfigürasyon Dosyasını Düzenleyin:
Ana konfigürasyon dosyasını (genellikle /etc/mysql/my.cnf veya /etc/my.cnf) açın. Bazen /etc/mysql/mariadb.conf.d/50-server.cnf gibi bir dosyada da olabilir.
[mysqld] bölümü altına aşağıdaki satırları ekleyin. Eğer zaten varsa, değerlerini değiştirin.
Burada innodb_log_file_size değeri için ne kullanmalıyım diye soracaksınız. Genel kural, toplam log alanınızın (dosya sayısı boyut) en az 1 saatlik yoğun yazma iş yükünü kaldıracak büyüklükte olmasıdır. Benim sunucularda genelde 512M ile 2G arasında bir değer kullanırım. Sunucunuzun RAM'ine göre ayarlayın. 16GB RAM'li bir sunucu için 1G iyi bir başlangıç noktasıdır.
4. MySQL/MariaDB Servisini Başlatın:
Servis başarıyla başlarsa, yeni log dosyaları otomatik oluşturulmuş demektir.
5. Değişikliği Doğrulayın:
MySQL'e bağlanıp değişkeni tekrar sorgulayalım.
Artık değerin 1073741824 (1GB) olduğunu göreceksiniz.
Kritik Uyarılar ve Dikkat Edilmesi Gerekenler
Şu ayara çok dikkat etmelisiniz: Servisi durdurmadan ve mevcut ib_logfile dosyalarını silmeden/taşımadan sadece konfigürasyon dosyasındaki boyutu değiştirip servisi yeniden başlatırsanız, MySQL başlamaz ve hata log'una "InnoDB: log file ./ib_logfile0 is of different size" gibi bir hata yazar. Bu yüzden adımları sırasıyla ve dikkatle takip edin.
Ayrıca, log dosya boyutunu çok büyük yapmak (örn: RAM'inizin yarısı kadar) de sorunlara yol açabilir. Çok büyük bir log dosyası, sunucunuzun beklenmedik bir şekilde kapanması (crash) durumunda kurtarma (recovery) süresini çok uzatır. Dengeyi kurmak önemli.
Optimizasyon Sonrası Gözlem
Bu değişikliği yaptıktan sonra, aşağıdaki komutla InnoDB durumuna bakabilir ve "Log sequence number" ile "Last checkpoint at" değerleri arasındaki farkı gözlemleyebilirsiniz. Bu fark, log dosya boyutunuzdan küçük kalıyorsa, checkpoint'ler daha seyrek olacak ve performansınız artacaktır.
Çıktıda "LOG" bölümünü arayın.
Sonuç olarak, bu optimizasyon özellikle forum, e-ticaret veya sık veri güncellemesi yapan uygulamalarınızın çalıştığı veritabanı sunucularında etkisini hemen hissettirecektir.
Umarım bu rehber faydalı olmuştur. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yönteminiz veya öneriniz var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.
Öncelikle, bu işlemi yapmadan önce MySQL/MariaDB servisinizi durdurmanız gerekiyor. Çünkü log dosyalarını yeniden boyutlandırmak için InnoDB'nin kapalı olması şart. Ayrıca, mevcut log dosyalarınızın boyutunu kontrol edelim.
SQL:
SHOW VARIABLES LIKE 'innodb_log_file_size';
Ayrıca, kaç tane log dosyanız olduğunu da kontrol edin.
SQL:
SHOW VARIABLES LIKE 'innodb_log_files_in_group';
Genellikle bu değer 2'dir. Yani /var/lib/mysql (veya veri dizininiz) altında ib_logfile0 ve ib_logfile1 dosyalarını görebilirsiniz.
1. MySQL/MariaDB Servisini Durdurun:
Bash:
sudo systemctl stop mysql
Bash:
sudo systemctl stop mariadb
2. Mevcut Log Dosyalarını Yedekleyin veya Silin:
Bu adım kritiktir. MySQL kapalıyken, mevcut ib_logfile dosyalarını silmelisiniz. InnoDB, servis yeniden başlatıldığında yeni boyutta bu dosyaları otomatik oluşturacaktır.
Bash:
sudo mv /var/lib/mysql/ib_logfile /tmp/
3. MySQL/MariaDB Konfigürasyon Dosyasını Düzenleyin:
Ana konfigürasyon dosyasını (genellikle /etc/mysql/my.cnf veya /etc/my.cnf) açın. Bazen /etc/mysql/mariadb.conf.d/50-server.cnf gibi bir dosyada da olabilir.
Bash:
sudo nano /etc/mysql/my.cnf
[mysqld] bölümü altına aşağıdaki satırları ekleyin. Eğer zaten varsa, değerlerini değiştirin.
INI:
# InnoDB Log File Boyutunu 1GB olarak ayarla (1024MB)
innodb_log_file_size = 1G
# Log Buffer boyutunu da artırmak iyi olur (Opsiyonel, önerilir)
innodb_log_buffer_size = 64M
Burada innodb_log_file_size değeri için ne kullanmalıyım diye soracaksınız. Genel kural, toplam log alanınızın (dosya sayısı boyut) en az 1 saatlik yoğun yazma iş yükünü kaldıracak büyüklükte olmasıdır. Benim sunucularda genelde 512M ile 2G arasında bir değer kullanırım. Sunucunuzun RAM'ine göre ayarlayın. 16GB RAM'li bir sunucu için 1G iyi bir başlangıç noktasıdır.
4. MySQL/MariaDB Servisini Başlatın:
Bash:
sudo systemctl start mysql
5. Değişikliği Doğrulayın:
MySQL'e bağlanıp değişkeni tekrar sorgulayalım.
SQL:
SHOW VARIABLES LIKE 'innodb_log_file_size';
Şu ayara çok dikkat etmelisiniz: Servisi durdurmadan ve mevcut ib_logfile dosyalarını silmeden/taşımadan sadece konfigürasyon dosyasındaki boyutu değiştirip servisi yeniden başlatırsanız, MySQL başlamaz ve hata log'una "InnoDB: log file ./ib_logfile0 is of different size" gibi bir hata yazar. Bu yüzden adımları sırasıyla ve dikkatle takip edin.
Ayrıca, log dosya boyutunu çok büyük yapmak (örn: RAM'inizin yarısı kadar) de sorunlara yol açabilir. Çok büyük bir log dosyası, sunucunuzun beklenmedik bir şekilde kapanması (crash) durumunda kurtarma (recovery) süresini çok uzatır. Dengeyi kurmak önemli.
Bu değişikliği yaptıktan sonra, aşağıdaki komutla InnoDB durumuna bakabilir ve "Log sequence number" ile "Last checkpoint at" değerleri arasındaki farkı gözlemleyebilirsiniz. Bu fark, log dosya boyutunuzdan küçük kalıyorsa, checkpoint'ler daha seyrek olacak ve performansınız artacaktır.
SQL:
SHOW ENGINE INNODB STATUS\G
Çıktıda "LOG" bölümünü arayın.
Sonuç olarak, bu optimizasyon özellikle forum, e-ticaret veya sık veri güncellemesi yapan uygulamalarınızın çalıştığı veritabanı sunucularında etkisini hemen hissettirecektir.
Umarım bu rehber faydalı olmuştur. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yönteminiz veya öneriniz var mı? Ya da takıldığınız bir nokta olursa aşağıya yazmaktan çekinmeyin, beraber çözelim.