SQL Notları: Events

### MySQL’de Olaylar (Events)

MySQL, tekrarlayan ve zamanlanmış görevleri otomatikleştirmek için **Olaylar (Events)** özelliğini sunar. Bu özellik, özellikle SQL tabanlı görevler için cron benzeri bir işlevsellik sağlar. Bu yazıda, MySQL’de olayların nasıl oluşturulacağını, yönetileceğini ve kullanılacağını ele alacağız.

#### 1. Olay Scheduler’ı Etkinleştirme

Olayların çalışması için öncelikle olay scheduler’ın etkinleştirilmesi gerekir. Olay scheduler’ın durumunu kontrol etmek ve etkinleştirmek için aşağıdaki komutlar kullanılır:

“`sql
SHOW VARIABLES WHERE variable_name=’event_scheduler’;
“`

Eğer sonuç `OFF` ise, olay scheduler’ı etkinleştirmek için:

“`sql
SET GLOBAL event_scheduler = ON;
“`

#### 2. Olay Oluşturma

Olaylar, belirli bir zaman aralığında veya belirli bir tarihte otomatik olarak çalışacak şekilde planlanabilir. Aşağıda, iki farklı olay örneği bulunmaktadır:

##### Örnek 1: Günlük Olay

Bu olay, her gün belirli bir saatte çalışır ve 7 günden eski mesajları siler:

“`sql
DROP EVENT IF EXISTS `delete7DayOldMessages`;
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
ON SCHEDULE EVERY 1 DAY STARTS ‘2023-10-01 00:00:00’
ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages
   WHERE DATEDIFF(NOW(), updateDt) > 6; — 7 günden eski kayıtları siler
END$$
DELIMITER ;
“`

##### Örnek 2: Her 10 Dakikada Bir Çalışan Olay

Bu olay, her 10 dakikada bir çalışır ve 1 haftadan eski mesajları siler:

“`sql
DROP EVENT IF EXISTS `Every_10_Minutes_Cleanup`;
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
ON SCHEDULE EVERY 10 MINUTE STARTS ‘2023-10-01 08:08:08’
ON COMPLETION PRESERVE
DO BEGIN
   DELETE FROM theMessages
   WHERE TIMESTAMPDIFF(HOUR, updateDt, NOW()) > 168; — 1 haftadan eski kayıtları siler
END$$
DELIMITER ;
“`

#### 3. Olayların Durumunu Görüntüleme

Oluşturulan olayların durumunu görüntülemek için aşağıdaki komutlar kullanılır:

“`sql
SHOW EVENTS FROM my_db_name;  — Belirli bir veritabanındaki olayları listeler
SHOW EVENTS;                  — Tüm olayları listeler
SHOW EVENTS\G;                — Olayları daha detaylı bir şekilde listeler
“`

**Örnek Çıktı:**
“`
*************************** 1. row ***************************
                 Db: my_db_name
               Name: delete7DayOldMessages
            Definer: root@localhost
          Time zone: SYSTEM
               Type: RECURRING
         Execute at: NULL
     Interval value: 1
     Interval field: DAY
             Starts: 2023-10-01 00:00:00
               Ends: NULL
             Status: ENABLED
         Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
 Database Collation: utf8_general_ci
“`

#### 4. Olayları Silme

Bir olayı silmek için `DROP EVENT` komutu kullanılır:

“`sql
DROP EVENT someEventName;
“`

#### 5. Olayların Avantajları ve Dikkat Edilmesi Gerekenler

– **Avantajlar:**
 – Olaylar, tekrarlayan görevleri otomatikleştirir ve manuel müdahaleye gerek kalmaz.
 – SQL tabanlı görevler için cron benzeri bir işlevsellik sunar.
 – Olaylar, karmaşık SQL sorgularını ve DML/DDL işlemlerini içerebilir.

– **Dikkat Edilmesi Gerekenler:**
 – Olaylar, kullanıcı tarafından çağrılmaz, bu nedenle başarısız olurlarsa sessizce başarısız olurlar.
 – Olayların çalışma süreleri ve aralıkları dikkatlice planlanmalıdır.
 – Olayların performans üzerindeki etkisi göz önünde bulundurulmalıdır.

#### Sonuç

MySQL’de olaylar, tekrarlayan ve zamanlanmış görevleri otomatikleştirmek için güçlü bir araçtır. Bu özelliği kullanarak, veritabanı yönetimini daha verimli hale getirebilir ve manuel müdahaleleri en aza indirebilirsiniz. Bir sonraki yazıda görüşmek üzere!