MariaDB'de event (zamanlanmış görev), belirli bir anda bir kez ya da düzenli aralıklarla çalıştırılmak üzere sunucuda saklanan adlandırılmış bir SQL ifadesidir ve CREATE EVENT ad ON SCHEDULE ... DO ... ile tanımlanır. Event'lerin çalışması için Event Scheduler'ın açık olması gerekir; event_scheduler değişkeninin varsayılan değeri OFF olduğundan ilk iş SET GLOBAL event_scheduler = ON; ile ya da seçenek dosyasıyla zamanlayıcıyı açmaktır.

Belgeler event'leri Unix'teki cron işlerine ve Windows Görev Zamanlayıcısı'na benzetir. Bu yazıda MariaDB 12.3 LTS belgelerine göre zamanlayıcının durumlarını, CREATE EVENT ile tek seferlik ve tekrarlayan görevleri, ON COMPLETION PRESERVE, ENABLE/DISABLE seçeneklerini, ALTER EVENT ve DROP EVENT kullanımını, event'leri izlemeyi, kısıtları ve iyi uygulamaları anlatıyoruz.

Event Scheduler nasıl açılır?

Event Scheduler nasıl açılır?

Event'ler yalnızca Event Scheduler çalışıyorsa yürütülür. Zamanlayıcının durumu event_scheduler genel sistem değişkenine bağlıdır ve üç değer alır: ON (veya 1) çalışıyor, OFF (veya 0) durdurulmuş, DISABLED ise çalışma zamanında değiştirilemez demektir. Belgelere göre varsayılan değer OFF'tur. Değeri SET GLOBAL ile değiştirmek için SUPER yetkisi gerekir; değer DISABLED ise sunucuyu yeniden başlatmadan açamazsınız.

sql
SET GLOBAL event_scheduler = ON;
SHOW GLOBAL VARIABLES LIKE 'event_scheduler';

SET GLOBAL ile yapılan değişiklik sunucu yeniden başladığında kaybolur. Kalıcı olması için seçenek dosyasında bir sunucu grubuna aşağıdaki satırı ekleyin. Seçenek adlarında tire ve alt çizgi birbirinin yerine kullanılabilir; komut satırındaki karşılığı --event-scheduler'dır. Hangi dosyanın hangi sırayla okunduğu için my.cnf yapılandırma dosyaları, sunucuyu yeniden başlatmak için systemd ile başlatma ve durdurma yazılarına bakın.

ini
[mariadb]
event_scheduler = ON

Zamanlayıcının gerçekten çalıştığını SHOW PROCESSLIST çıktısında görebilirsiniz: kullanıcı adı event_scheduler, komutu Daemon olan ve bir sonraki çalışma zamanını bekleyen bir iş parçacığı bulunur.

sql
SHOW PROCESSLIST;
+----+-----------------+-----------+------+---------+------+-----------------------------+------------------+----------+
| Id | User            | Host      | db   | Command | Time | State                       | Info             | Progress |
+----+-----------------+-----------+------+---------+------+-----------------------------+------------------+----------+
| 40 | root            | localhost | test | Sleep   | 4687 |                             | NULL             |    0.000 |
| 41 | root            | localhost | test | Query   |    0 | init                        | SHOW PROCESSLIST |    0.000 |
| 42 | event_scheduler | localhost | NULL | Daemon  |   30 | Waiting for next activation | NULL             |    0.000 |
+----+-----------------+-----------+------+---------+------+-----------------------------+------------------+----------+

CREATE EVENT sözdizimi

sql
CREATE [OR REPLACE]
    [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO sql_statement

schedule:
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]

Geçerli bir CREATE EVENT için üç şey zorunludur: CREATE EVENT ve şemada benzersiz bir ad, ne zaman çalışacağını söyleyen ON SCHEDULE ve çalıştırılacak ifadeyi içeren DO. Event oluşturmak, değiştirmek ve silmek için ilgili şemada EVENT yetkisi gerekir. Event adı en fazla 64 karakter olabilir, şema adıyla nitelendirilebilir; ad kuralları saklı rutinlerinkiyle aynıdır. Her event hem bir şemaya hem de bir kullanıcıya (definer) bağlıdır.

Tek seferlik event: AT

Bir işi yalnızca bir kez çalıştırmak için AT ve bir zaman damgası kullanılır. Zaman damgasına bir veya daha fazla INTERVAL ekleyebilirsiniz. AT CURRENT_TIMESTAMP event'in oluşturulur oluşturulmaz çalışmasını sağlar. Geçmiş bir zaman da verebilirsiniz; bu durumda event saklanır ama ALTER EVENT ile değiştirilene kadar tetiklenmez (aşağıdaki ON COMPLETION kuralına dikkat edin).

sql
CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;

CREATE EVENT example
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL 3 HOUR
DO something;

İlk örnek oluşturulduktan bir saat sonra bir kez çalışır ve bir sütunu bir artırır. İkinci örnek ertesi gün, oluşturulma anından üç saat sonrasına denk gelen zamanda çalışır. İkinci örnekteki something belgelerdeki yer tutucudur; gerçek kullanımda buraya bir SQL ifadesi ya da bir CALL yazılır.

Tekrarlayan event: EVERY, STARTS ve ENDS

Düzenli aralıklarla çalışan bir görev için EVERY ve bir aralık yazılır. İlk çalışmanın ne zaman olacağını STARTS, son çalışmanın en geç ne zaman olabileceğini ENDS belirler; ikisi de bir zaman damgası ve isteğe bağlı aralıklar alır. Belgelerdeki örnek, gelecek aydan başlayıp bir hafta boyunca her saat çalışan bir event tanımlar:

sql
CREATE EVENT example
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK
DO some_task;

Aralık birimleri tarih fonksiyonlarındakilerle aynıdır, tek farkla: event'lerde mikrosaniye kullanılamaz. İzin verilen birimler YEAR, QUARTER, MONTH, DAY, HOUR, MINUTE, WEEK, SECOND ve YEAR_MONTH, DAY_HOUR, DAY_MINUTE, DAY_SECOND, HOUR_MINUTE, HOUR_SECOND, MINUTE_SECOND bileşik birimleridir. Tekil birimlerde miktar bir tam sayıdır (EVERY 10 MINUTE); bileşik birimlerde ise tüm parçaları ve ayırıcıları içeren bir metin yazılır (EVERY '2:30' HOUR_MINUTE). Bileşik birimlerin ayrıntısı için tarih ve saat fonksiyonları yazısındaki INTERVAL bölümüne bakabilirsiniz.

Her gün belirli bir saatte çalışan bir görev için STARTS'a o saati içeren bir zaman damgası verip EVERY 1 DAY yazmak yeterlidir; event her gün aynı saatte tekrar eder. Zaman damgalarının hangi saat dilimine göre yorumlandığı önemlidir: SHOW EVENTS çıktısında her event için bir Time zone sütunu görünür. Saat dilimi ayarlarının nasıl çalıştığını tarih yazısında anlattık.

sql
CREATE EVENT gece_temizlik
ON SCHEDULE EVERY 1 DAY
STARTS '2026-11-08 03:00:00'
DO
  DELETE FROM oturumlar WHERE son_erisim < NOW() - INTERVAL 30 DAY;

ON COMPLETION, ENABLE/DISABLE ve COMMENT

ON COMPLETION, ENABLE/DISABLE ve COMMENT

Belgelere göre event'ler süresi dolduğunda, yani AT zamanı veya ENDS zamanı geçtikten sonraki son çalışmanın ardından varsayılan olarak silinir; bunu açıkça yazmak için ON COMPLETION NOT PRESERVE kullanılır. Event'in tanımını saklamak isterseniz ON COMPLETION PRESERVE yazın. NOT PRESERVE ile birlikte geçmiş bir AT veya ENDS zamanı verirseniz event oluşturulduğu anda silinir ve 1558 numaralı bir not alırsınız: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation".

Event'ler varsayılan olarak ENABLE durumundadır. Bir event'i silmeden durdurmak için DISABLE verebilir, hazır olduğunda ALTER EVENT ... ENABLE ile yeniden açabilirsiniz. DISABLE ON SLAVE, birincil sunucuda oluşturulup replikaya aktarılmış event'in replikada çalışmasını engellemek içindir. Belgelerin uyarısına göre bu değer açıkça ayarlanırsa event her yerde devre dışı kalır, yani ne birincil sunucuda ne replikalarda çalışır. Replikasyon ortamında event yönetimi için MariaDB replikasyon kurulumu yazısına bakın.

COMMENT en fazla 64 karakterlik bir açıklama alır ve tırnak içinde yazılır; INFORMATION_SCHEMA.EVENTS tablosunda EVENT_COMMENT sütununda görünür. Birden fazla görev çalıştıran sunucularda her event'e ne yaptığını anlatan kısa bir açıklama eklemek bakımı kolaylaştırır.

OR REPLACE ve IF NOT EXISTS

Var olan bir event'i aynı adla yeniden oluşturmaya çalışmak 1537 hatası verir. OR REPLACE eskisini silip yenisini tanımlar; IF NOT EXISTS ise hata yerine bir not üretir. Belgelere göre ikisi birlikte kullanılamaz.

sql
CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;
ERROR 1537 (HY000): Event 'myevent' already exists

CREATE EVENT IF NOT EXISTS myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

ALTER EVENT ve DROP EVENT

ALTER EVENT, var olan bir event'in bir veya birkaç özelliğini silip yeniden oluşturmaya gerek kalmadan değiştirir. ON SCHEDULE, ON COMPLETION, COMMENT, ENABLE/DISABLE ve DO yan tümceleri CREATE EVENT'teki ile aynı sözdizimine sahiptir; ek olarak RENAME TO yeni_ad ile ad değiştirilebilir. Belgelere göre başarılı bir ALTER EVENT çalıştıran kullanıcı, o event'in yeni definer'ı olur. Bu ayrıntı önemlidir: event'in gövdesi artık o kullanıcının yetkileriyle değerlendirilir.

sql
ALTER EVENT test_event ON SCHEDULE EVERY '2:3' DAY_HOUR;

ALTER EVENT no_such_event ON SCHEDULE EVERY '2:3' DAY_HOUR;
ERROR 1539 (HY000): Unknown event 'no_such_event'

DROP EVENT test_event;
Query OK, 0 rows affected (0.00 sec)

DROP EVENT [IF EXISTS] ad bir event'i siler. Süresi dolan ve ON COMPLETION PRESERVE içermeyen event'ler ise son çalışmalarından sonra kendiliğinden silinir; bu yüzden tek seferlik bir event'in bir süre sonra listeden kaybolması normaldir.

Event'leri izlemek

SHOW EVENTS [FROM şema] event'lerin adını, definer'ını, saat dilimini, türünü, aralığını, başlangıç ve bitiş zamanını ve durumunu listeler. Event'in tam SQL tanımı SHOW CREATE EVENT ile veya INFORMATION_SCHEMA.EVENTS tablosundan okunur. Bu tabloda EVENT_TYPE sütunu ONE TIME veya RECURRING, STATUS sütunu ENABLED, DISABLED veya SLAVESIDE_DISABLED değerini taşır. Belgelere göre LAST_EXECUTED sütunu, event'in en son ne zaman çalıştığını bir saniye hassasiyetle gösterir. O anda çalışmakta olan bir event'i ise SHOW PROCESSLIST veya INFORMATION_SCHEMA.PROCESSLIST ile görebilirsiniz; uzun süren bir event'i durdurmak gerekirse SHOW PROCESSLIST ve KILL yazısındaki yöntemler geçerlidir.

sql
SHOW EVENTS FROM sirket;

SHOW CREATE EVENT gece_temizlik\G

SELECT EVENT_NAME, STATUS, LAST_EXECUTED, EVENT_COMMENT
FROM INFORMATION_SCHEMA.EVENTS
WHERE EVENT_SCHEMA = 'sirket';

Event kısıtları

Event kısıtları: Event'ler sonuç kümesi döndüremez; içlerindeki SELECT sonuçları hiçbir..., Event adları büyük-küçük harf duyarsızdır; aynı şemada yalnızca harf..., Belgelere göre...

Event'ler saklı rutinlerin genel kısıtlarına tabidir; örneğin LOAD DATA ve LOCK TABLES kullanamaz. Belgelerin event'lere özgü listesi şöyledir:

  • Event'ler sonuç kümesi döndüremez; içlerindeki SELECT sonuçları hiçbir istemciye gitmez.
  • Event adları büyük-küçük harf duyarsızdır; aynı şemada yalnızca harf büyüklüğüyle ayrılan iki event olamaz.
  • Belgelere göre event'ler Unix epoch ile gösterilebilen en büyük tarihin (2038-01-19) ötesini desteklemez.
  • Event'ler başka bir saklı program, tetikleyici veya event tarafından oluşturulamaz, silinemez veya değiştirilemez; kendileri de saklı program veya tetikleyici oluşturamaz, silemez, değiştiremez.
  • Zamanlama kesin olarak öngörülemez: MONTH, YEAR_MONTH, QUARTER ve YEAR aralıkları ay cinsinden, diğerleri saniye cinsinden çözülür. Uç durumlarda iki saniyeye kadar gecikme olabilir ve aynı saniyeye planlanan event'lerin sırası garanti edilmez.
  • Her çalıştırma yeni bir bağlantı kullanır; bu yüzden Com_select, Com_delete gibi oturum sayaçları event'lerin yaptığı işi yansıtmaz.

İyi uygulamalar: mantığı yordama koymak ve günlük tutmak

Belgelerdeki otomasyon rehberi iki alışkanlık önerir. Birincisi SQL mantığını bir stored procedure'e taşımak ve event'in yalnızca o yordamı çağırmasıdır. Böylece birden fazla event aynı yordamı farklı parametrelerle çağırabilir, yordam gerektiğinde elle de çalıştırılabilir ve zamanlama ile mantık birbirinden ayrılır: birini değiştirirken diğerini bozma riski azalır. İkincisi, cron işlerinde olduğu gibi event'lerin başarılı olup olmadığını ayrı bir tabloya kaydetmektir; bu tablo bir izleme aracıyla takip edilebilir.

sql
CREATE TABLE gorev_gunlugu (
  id INT AUTO_INCREMENT PRIMARY KEY,
  gorev VARCHAR(64) NOT NULL,
  zaman DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  durum VARCHAR(20) NOT NULL,
  ayrinti VARCHAR(255)
);

DELIMITER //

CREATE PROCEDURE eski_kayitlari_sil(IN p_gun INT)
MODIFIES SQL DATA
BEGIN
  DECLARE EXIT HANDLER FOR SQLEXCEPTION
  BEGIN
    INSERT INTO gorev_gunlugu (gorev, durum) VALUES ('eski_kayitlari_sil', 'hata');
  END;

  DELETE FROM oturumlar WHERE son_erisim < NOW() - INTERVAL p_gun DAY;
  INSERT INTO gorev_gunlugu (gorev, durum, ayrinti)
  VALUES ('eski_kayitlari_sil', 'tamam', CONCAT(ROW_COUNT(), ' satır'));
END //

DELIMITER ;

CREATE EVENT ev_eski_kayitlari_sil
ON SCHEDULE EVERY 1 DAY
STARTS '2026-11-08 03:30:00'
ON COMPLETION PRESERVE
COMMENT 'Her gece 30 günden eski oturumları siler'
DO CALL eski_kayitlari_sil(30);

Bu örnekte yordam bir hata yakalayıcı (handler) tanımlar; silme sırasında bir SQL hatası olursa günlük tablosuna hata kaydı düşer ve blok sonlanır. Her şey yolundaysa silinen satır sayısı ROW_COUNT() ile kaydedilir. Tablo ve yordam adları bizimdir ve bu örnek bir sunucuda çalıştırılmadı; handler, DELIMITER ve parametre ayrıntıları için stored procedure ve function yazısına bakın. Belgelerin önerdiği diğer tipik görevler eski veya geçersiz satırları (örneğin terk edilmiş sepetler) düzenli silmek ve bölümlenmiş tablolarda yeni bölüm ekleyip en eskisini kaldırmaktır; ikincisi için tablo bölümleme yazısına bakın.

Event mi, cron mu?

Belgelere göre event'lerin avantajları şunlardır: sistemden bağımsızdır, aynı kod her işletim sisteminde çalışır; yordamsal SQL ile yazıldığı için ek dil veya kütüphane gerekmez; sunucunun içinde çalıştığı için sorgu sonuçları istemciye gönderilmez, ağ kesintileri event'i etkilemez ve kilitler daha kısa süre tutulur. Dezavantajları da açıkça sayılır: yalnızca SQL ile yapılabilen işler yapılabilir, örneğin uyarı göndermek mümkün değildir ve dosya ile uzak veritabanı erişimi sınırlıdır. Ayrıca Event Scheduler tek bir iş parçacığı olarak çalışır; bir event çalışırken zamanı gelen diğerleri onun bitmesini bekler, bu yüzden event'leri kısa tutmak önemlidir.

ÖlçütMariaDB eventcron + betik
Çalıştığı yerVeritabanı sunucusunun içiİşletim sistemi
DilYalnızca SQLHerhangi bir dil
Dosya, e-posta, uyarıMümkün değil veya sınırlıMümkün
Veri istemciye taşınır mıHayırGenellikle evet
Yedekle birlikte taşınır mıEvet, veritabanı nesnesi olarakHayır, ayrı yönetilir

Tablonun son satırıyla ilgili bir not: belgelere göre mariadb-dump tetikleyicileri tablolarla birlikte döker, ama event'leri varsayılan olarak dökmez; bunun için --events seçeneği gerekir. Seçeneklerin tamamı için mariadb-dump ile yedekleme yazısına bakın. Belgeler, birkaç sorgudan oluşan basit görevlerin event olarak kolayca yazılabileceğini, daha karmaşık işler için dış bir programlama dilinde betik yazmanın tercih edilebileceğini belirtir.

Sık yapılan hatalar

  • Zamanlayıcıyı açmayı unutmak: event_scheduler varsayılan olarak OFF'tur; event oluşturulur ama hiç çalışmaz. SHOW PROCESSLIST ile event_scheduler iş parçacığını kontrol edin.
  • Yalnızca SET GLOBAL ile açmak: Sunucu yeniden başladığında ayar kaybolur. Seçenek dosyasına event_scheduler = ON ekleyin.
  • Tek seferlik event'in kaybolmasına şaşırmak: Varsayılan ON COMPLETION NOT PRESERVE süresi dolan event'i siler. Tanımı saklamak için PRESERVE yazın.
  • Uzun süren event'ler yazmak: Zamanlayıcı tek iş parçacığıdır; uzun bir event diğerlerini geciktirir. İşi küçük parçalara bölün.
  • ALTER EVENT'in definer'ı değiştirdiğini bilmemek: ALTER EVENT çalıştıran kullanıcı yeni definer olur; yetkisi kısıtlı bir hesapla değiştirirseniz event'in gövdesi yetki hatası verebilir.
  • Event içinde SELECT ile sonuç beklemek: Event'ler sonuç kümesi döndüremez; sonuçları bir tabloya yazın.

Sık Sorulan Sorular

Event çalıştı mı, nasıl anlarım?

INFORMATION_SCHEMA.EVENTS tablosundaki LAST_EXECUTED sütunu son çalışma zamanını bir saniye hassasiyetle gösterir. İşin sonucunu da görmek istiyorsanız event'in çağırdığı yordamın bir günlük tablosuna yazmasını sağlayın.

Event Scheduler replikada da çalışır mı?

Belgelere göre DISABLE ON SLAVE, birincil sunucuda oluşturulup replikaya aktarılmış bir event'in replikada çalışmasını engelleyen durumdur; INFORMATION_SCHEMA.EVENTS tablosunda bu durum SLAVESIDE_DISABLED olarak görünür. Bir replikayı birincil sunucuya yükselttiğinizde bu event'leri ALTER EVENT ... ENABLE ile yeniden açmanız gerekebilir.

Event ile her ayın ilk günü çalışan bir görev yazabilir miyim?

Evet: STARTS'a bir ayın ilk gününü veren bir zaman damgası, EVERY 1 MONTH aralığı verin. Belgelere göre ay temelli aralıklar ay cinsinden çözülür; yine de kesin zamanlamanın garanti edilmediğini ve iki saniyeye kadar sapma olabileceğini unutmayın.

Event oluşturmak için hangi yetki gerekir?

İlgili şemada EVENT yetkisi gerekir; aynı yetki değiştirme ve silme için de kullanılır. Zamanlayıcıyı açıp kapatmak ise SUPER yetkisi ister. Yetkilerin verilmesi için GRANT ve REVOKE ile yetkiler yazısına bakın.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: MariaDB öğrenme rehberi · Stored procedure ve function · MariaDB trigger · Tarih ve saat fonksiyonları · Tablo bölümleme · SHOW PROCESSLIST ve KILL · systemd servis yönetimi