Merhaba arkadaşlar,
Bugün sizlere, özellikle yoğun yazma işlemlerinin olduğu veritabanlarında zamanla oluşan fragmantasyonu (parçalanmayı) gidermek ve eski log/geçici verileri otomatik olarak temizlemek için MySQL Event Scheduler'ı nasıl kullanacağımızı anlatacağım. Bu otomasyon, sunucunuzdaki disk alanı kullanımını optimize eder ve tablo performansını korumanıza yardımcı olur. Ben de kendi sunucularımda düzenli olarak bu yöntemi kullanıyorum.
Event Scheduler Nedir ve Nasıl Aktif Edilir?
MySQL Event Scheduler, belirli zamanlarda veya aralıklarla SQL ifadelerini otomatik olarak çalıştıran bir zamanlayıcıdır. Öncelikle bu özelliğin sunucunuzda aktif olduğundan emin olmalısınız.
Eski Verileri Silme Event'i Oluşturalım
Diyelim ki `site_loglari` adında bir tablonuz var ve 30 günden eski kayıtları her ayın 1'inde silmek istiyorsunuz. Aşağıdaki gibi bir event oluşturabilirsiniz.
Bu event, ilk olarak 1 Haziran 2024 saat 03:00'da çalışacak ve ardından her ay tekrarlanacak. ON COMPLETION PRESERVE ifadesi, event'in süresi dolsa bile silinmemesini sağlar. /etc/mysql/my.cnf dosyanızda event zaman dilimini (time_zone) doğru ayarladığınızdan emin olun.
Tabloları Optimize Etme Event'i Oluşturalım
Özellikle InnoDB tablolarında sık silme/güncelleme işlemlerinden sonra `OPTIMIZE TABLE` komutu faydalı olabilir. Bu işlem biyo ağır olabilir, bu yüzden trafiğin en düşük olduğu bir saatte (örneğin, pazar gecesi 02:00) planlayalım.
Dikkat Edilmesi Gerekenler
Şu ayara çok dikkat etmelisiniz: `OPTIMIZE TABLE`, MyISAM için mükemmel sonuç verirken, InnoDB için aslında bir `ALTER TABLE ... FORCE` işlemidir. Çok büyük tablolarda kilitlenmelere ve yüksek disk I/O'ya neden olabilir. Bu nedenle, canlı ve çok büyük sistemlerde bu işlemi daha düşük trafikli saatlere almanın yanı sıra, pt-online-schema-change gibi araçları değerlendirmenizi öneririm.
Oluşturduğunuz event'leri kontrol etmek ve yönetmek için aşağıdaki komutları kullanabilirsiniz:
Son Söz ve Öneriler
Event Scheduler, rutin bakım işlerimizde bize çok zaman kazandıran harika bir araç. Ancak her otomasyonda olduğu gibi, ilk kurulumdan sonra mutlaka birkaç döngü boyunca logları takip edin ve beklenen şekilde çalıştığından emin olun. Özellikle DELETE işlemlerinden önce, silinecek kayıtları bir SELECT ile kontrol etmek iyi bir pratiktir.
Siz bu rutin bakım işlemlerini kendi sunucularınızda nasıl yapıyorsunuz? Farklı yöntemleriniz veya eklemek istedikleriniz varsa aşağıya yazmaktan çekinmeyin. Sorularınız için buradayım!
Bugün sizlere, özellikle yoğun yazma işlemlerinin olduğu veritabanlarında zamanla oluşan fragmantasyonu (parçalanmayı) gidermek ve eski log/geçici verileri otomatik olarak temizlemek için MySQL Event Scheduler'ı nasıl kullanacağımızı anlatacağım. Bu otomasyon, sunucunuzdaki disk alanı kullanımını optimize eder ve tablo performansını korumanıza yardımcı olur. Ben de kendi sunucularımda düzenli olarak bu yöntemi kullanıyorum.
MySQL Event Scheduler, belirli zamanlarda veya aralıklarla SQL ifadelerini otomatik olarak çalıştıran bir zamanlayıcıdır. Öncelikle bu özelliğin sunucunuzda aktif olduğundan emin olmalısınız.
SQL:
-- Event Scheduler durumunu kontrol et
SHOW VARIABLES LIKE 'event_scheduler';
-- Eğer OFF ise, aşağıdaki komutla aktif edebilirsiniz (Sunucu restartında kaybolur).
SET GLOBAL event_scheduler = ON;
-- Kalıcı olması için my.cnf (veya my.ini) dosyasına ekleyin.
-- [mysqld] bölümüne şu satırı ekleyin: event_scheduler=ON
Diyelim ki `site_loglari` adında bir tablonuz var ve 30 günden eski kayıtları her ayın 1'inde silmek istiyorsunuz. Aşağıdaki gibi bir event oluşturabilirsiniz.
SQL:
DELIMITER //
CREATE EVENT IF NOT EXISTS `eski_loglari_temizle`
ON SCHEDULE EVERY 1 MONTH
STARTS '2024-06-01 03:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
DELETE FROM site_loglari WHERE log_tarihi < DATE_SUB(NOW(), INTERVAL 30 DAY);
-- İşlem sonrası kaç kayıt silindiğini görmek için (Opsiyonel)
SELECT CONCAT('Silinen eski log kaydı: ', ROW_COUNT()) AS Bilgi;
END //
DELIMITER ;
Bu event, ilk olarak 1 Haziran 2024 saat 03:00'da çalışacak ve ardından her ay tekrarlanacak. ON COMPLETION PRESERVE ifadesi, event'in süresi dolsa bile silinmemesini sağlar. /etc/mysql/my.cnf dosyanızda event zaman dilimini (time_zone) doğru ayarladığınızdan emin olun.
Özellikle InnoDB tablolarında sık silme/güncelleme işlemlerinden sonra `OPTIMIZE TABLE` komutu faydalı olabilir. Bu işlem biyo ağır olabilir, bu yüzden trafiğin en düşük olduğu bir saatte (örneğin, pazar gecesi 02:00) planlayalım.
SQL:
DELIMITER //
CREATE EVENT IF NOT EXISTS `haftalik_tablo_optimize`
ON SCHEDULE EVERY 1 WEEK
STARTS '2024-06-02 02:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
-- Optimize edilecek tabloları belirleyin. Tüm veritabanı için değil, ihtiyaç duyulanlar için yapın.
OPTIMIZE TABLE buyuk_tablo_1, buyuk_tablo_2, log_tablosu;
END //
DELIMITER ;
Şu ayara çok dikkat etmelisiniz: `OPTIMIZE TABLE`, MyISAM için mükemmel sonuç verirken, InnoDB için aslında bir `ALTER TABLE ... FORCE` işlemidir. Çok büyük tablolarda kilitlenmelere ve yüksek disk I/O'ya neden olabilir. Bu nedenle, canlı ve çok büyük sistemlerde bu işlemi daha düşük trafikli saatlere almanın yanı sıra, pt-online-schema-change gibi araçları değerlendirmenizi öneririm.
Oluşturduğunuz event'leri kontrol etmek ve yönetmek için aşağıdaki komutları kullanabilirsiniz:
SQL:
-- Tüm event'leri listele
SHOW EVENTS FROM veritabani_adiniz;
-- Bir event'in detaylı yapısını gör
SHOW CREATE EVENT `eski_loglari_temizle`;
-- Bir event'i geçici olarak durdur
ALTER EVENT `haftalik_tablo_optimize` DISABLE;
-- Bir event'i tekrar aktif et
ALTER EVENT `haftalik_tablo_optimize` ENABLE;
-- Bir event'i tamamen sil
DROP EVENT IF EXISTS `eski_loglari_temizle`;
Event Scheduler, rutin bakım işlerimizde bize çok zaman kazandıran harika bir araç. Ancak her otomasyonda olduğu gibi, ilk kurulumdan sonra mutlaka birkaç döngü boyunca logları takip edin ve beklenen şekilde çalıştığından emin olun. Özellikle DELETE işlemlerinden önce, silinecek kayıtları bir SELECT ile kontrol etmek iyi bir pratiktir.
Siz bu rutin bakım işlemlerini kendi sunucularınızda nasıl yapıyorsunuz? Farklı yöntemleriniz veya eklemek istedikleriniz varsa aşağıya yazmaktan çekinmeyin. Sorularınız için buradayım!