Merhaba arkadaşlar, bugün sizlere özellikle yoğun veritabanı trafiği olan sunucularda disk alanını aniden tüketen ve birçok yöneticiyi paniğe sokan bir konudan, binary log temizliğinden bahsedeceğim. Binary log'lar, veritabanınızdaki tüm değişiklikleri kaydeder ve replication (çoğaltma) ya da belirli bir noktaya dönüş (point-in-time recovery) için hayati öneme sahiptir. Ancak doğru yönetilmezse, /var/lib/mysql dizininizi şişirip sunucunuzu durma noktasına getirebilir. Benim sunucularda genelde uyguladığım otomatik temizleme politikasını adım adım anlatacağım.
Binary Log Nedir ve Neden Büyür?
MySQL ve MariaDB, her bir INSERT, UPDATE, DELETE gibi veri değiştiren işlemi binary log dosyalarına (örn: mysql-bin.000001) yazar. Replication kurulu değilse veya bu loglara ihtiyacınız yoksa, bu dosyalar otomatik silinmez ve disk alanınızı yavaş yavaş işgal eder. En kötü senaryo, disk dolduğunda veritabanının tamamen kilitlenmesidir.
Manuel Temizleme Yöntemi
Öncelikle mevcut durumu kontrol edelim. Sunucunuza SSH ile bağlanıp aşağıdaki komutları çalıştırabilirsiniz.
Bu komut, mevcut tüm binary log dosyalarını ve boyutlarını listeler. Eski logları manuel silmek için aşağıdaki komutu kullanabilirsiniz. Dikkatli olun, silinen loglar geri getirilemez!
Ancak bizim asıl amacımız sürekli SSH'ya bağlanıp manuel temizlik yapmak değil. Sistemin bunu otomatik yapmasını sağlamak.
Otomatik Silme Politikası (expire_logs_days)
MySQL/MariaDB'nin expire_logs_days parametresi, belirttiğiniz gün sayısından eski binary log'ları otomatik olarak temizler. Benim sunucularda genelde 7 veya 14 gün yeterli oluyor. Bu ayarı kalıcı hale getirmek için konfigürasyon dosyasını düzenlemeliyiz.
Öncelikle, mevcut ayarı kontrol edelim:
Değer 0 ise otomatik silme kapalı demektir. Şimdi kalıcı olarak ayarlayalım. Ana konfigürasyon dosyası genellikle /etc/mysql/my.cnf veya /etc/my.cnf yolundadır. MariaDB kullanıyorsanız, /etc/mysql/mariadb.conf.d/50-server.cnf dosyasına da bakabilirsiniz.
Dosyayı bir editörle açın (nano veya vi kullanabilirsiniz):
Değişikliği kaydedip çıkın. Ardından MySQL/MariaDB servisini yeniden başlatarak ayarı etkinleştirin.
Dikkat Edilmesi Gerekenler
Şu ayara çok dikkat etmelisiniz: Eğer sunucunuzda replication (Slave) kuruluysa, master sunucudaki bir binary log, tüm slave'ler tarafından okunup işlenmeden asla silinmemelidir. Bu durumda expire_logs_days değerini, slave'lerin en yavaş çalıştığı durumu da göz önünde bulundurarak daha yüksek bir değerde (örneğin 30 gün) tutmak gerekebilir.
Ayrıca, değişiklik yapmadan önce mutlaka bir yedeğinizi alın. Kritik bir production sunucusuysa, değişikliği önce bir test ortamında deneyin.
Kontrol ve Sonuç
Servis yeniden başladıktan sonra, ayarın aktif olduğunu tekrar kontrol edin.
Artık sisteminiz, 7 günden eski binary log dosyalarını otomatik olarak silecek ve /var/lib/mysql veya log dizininizde gereksiz birikme olmayacak. Disk kullanımınızı düzenli olarak df -h komutuyla takip etmeyi de unutmayın.
Umarım bu rehber, sunucunuzdaki gizli disk canavarına karşı sizi güçlendirmiştir. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yönteminiz veya eklemek istediğiniz bir püf noktası var mı? Ya da takıldığınız bir yer olursa, aşağıya yazmaktan çekinmeyin. Herkese sorunsuz sunucular dilerim!
MySQL ve MariaDB, her bir INSERT, UPDATE, DELETE gibi veri değiştiren işlemi binary log dosyalarına (örn: mysql-bin.000001) yazar. Replication kurulu değilse veya bu loglara ihtiyacınız yoksa, bu dosyalar otomatik silinmez ve disk alanınızı yavaş yavaş işgal eder. En kötü senaryo, disk dolduğunda veritabanının tamamen kilitlenmesidir.
Öncelikle mevcut durumu kontrol edelim. Sunucunuza SSH ile bağlanıp aşağıdaki komutları çalıştırabilirsiniz.
SQL:
SHOW BINARY LOGS;
Bu komut, mevcut tüm binary log dosyalarını ve boyutlarını listeler. Eski logları manuel silmek için aşağıdaki komutu kullanabilirsiniz. Dikkatli olun, silinen loglar geri getirilemez!
SQL:
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00'; -- Belirli bir tarihten öncekileri siler
-- VEYA
PURGE BINARY LOGS TO 'mysql-bin.000010'; -- Belirli bir dosyaya kadar olanları siler (10. dosya dahil değil)
Ancak bizim asıl amacımız sürekli SSH'ya bağlanıp manuel temizlik yapmak değil. Sistemin bunu otomatik yapmasını sağlamak.
MySQL/MariaDB'nin expire_logs_days parametresi, belirttiğiniz gün sayısından eski binary log'ları otomatik olarak temizler. Benim sunucularda genelde 7 veya 14 gün yeterli oluyor. Bu ayarı kalıcı hale getirmek için konfigürasyon dosyasını düzenlemeliyiz.
Öncelikle, mevcut ayarı kontrol edelim:
SQL:
SHOW VARIABLES LIKE 'expire_logs_days';
Değer 0 ise otomatik silme kapalı demektir. Şimdi kalıcı olarak ayarlayalım. Ana konfigürasyon dosyası genellikle /etc/mysql/my.cnf veya /etc/my.cnf yolundadır. MariaDB kullanıyorsanız, /etc/mysql/mariadb.conf.d/50-server.cnf dosyasına da bakabilirsiniz.
Dosyayı bir editörle açın (nano veya vi kullanabilirsiniz):
Bash:
sudo nano /etc/mysql/my.cnf
INI:
[mysqld] bölümünün altına aşağıdaki satırı ekleyin. Eğer zaten varsa, değerini değiştirin.
expire_logs_days = 7
log_bin = /var/log/mysql/mysql-bin.log # Eğer log_bin tanımı yoksa, bu satırı da ekleyebilirsiniz.
Değişikliği kaydedip çıkın. Ardından MySQL/MariaDB servisini yeniden başlatarak ayarı etkinleştirin.
Bash:
sudo systemctl restart mysql # veya sudo systemctl restart mariadb
Şu ayara çok dikkat etmelisiniz: Eğer sunucunuzda replication (Slave) kuruluysa, master sunucudaki bir binary log, tüm slave'ler tarafından okunup işlenmeden asla silinmemelidir. Bu durumda expire_logs_days değerini, slave'lerin en yavaş çalıştığı durumu da göz önünde bulundurarak daha yüksek bir değerde (örneğin 30 gün) tutmak gerekebilir.
Ayrıca, değişiklik yapmadan önce mutlaka bir yedeğinizi alın. Kritik bir production sunucusuysa, değişikliği önce bir test ortamında deneyin.
Servis yeniden başladıktan sonra, ayarın aktif olduğunu tekrar kontrol edin.
SQL:
SHOW VARIABLES LIKE 'expire_logs_days';
Artık sisteminiz, 7 günden eski binary log dosyalarını otomatik olarak silecek ve /var/lib/mysql veya log dizininizde gereksiz birikme olmayacak. Disk kullanımınızı düzenli olarak df -h komutuyla takip etmeyi de unutmayın.
Umarım bu rehber, sunucunuzdaki gizli disk canavarına karşı sizi güçlendirmiştir. Siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir yönteminiz veya eklemek istediğiniz bir püf noktası var mı? Ya da takıldığınız bir yer olursa, aşağıya yazmaktan çekinmeyin. Herkese sorunsuz sunucular dilerim!