PrettyPrint

utorok 13. augusta 2013

Plánovač udalostí v MySQL

MySQL patrí medzi najznámejšie databázové systémy založené na SQL a postupom času bol rozšírený o rôzne zaujímavé vlastnosti, ktoré síce priamo nesúvisia s databázami, ale napriek tomu rozširujú potenciál MySQL. V tomto článku si predstavíme možnosti jeho plánovača udalostí, pomocou ktorého je možné plánovať vykonávanie SQL príkazov.

Výhody plánovača udalostí v MySQL

Plánovač udalostí MySQL (MySQL Event Scheduler) umožňuje nastaviť pravidelné alebo jednorázové spustenie SQL príkazov, tzv. udalostí, v zadanom čase. Z tohto hľadiska sa podobá na obdobné mechanizmy v operačných systémoch, konkrétne cron v linuxových OS, či Task Scheduler vo Windows. Narozdiel od nich je však popisované plánovanie priamo súčasťou databázového servera. To v prípade SQL príkazov prináša viaceré výhody – na spúšťanie takýchto úloh nie je potrebné mať prístup k shellu nutnému na konfiguráciu cronu, ani prístup k samotnému cronu. Tiež nie je potrebné vytvárať jednoduché obaľovacie (wrapper) skripty, ktoré by sa museli pripájať k databáze a následne vykonávať požadované SQL príkazy. Okrem toho sú takto plánované udalosti súčasťou databázy, a teda ich zálohovanie alebo export nie je potrebné riešiť osobitne.

Príkazy na manipuláciu s udalosťami

Na prácu s udalosťami poskytuje MySQL nasledujúce príkazy, ktoré si bližšie predstavíme:

  • CREATE EVENT – vytvára udalosť,
  • ALTER EVENT – upravuje vlastnosti udalosti,
  • DROP EVENT – ruší udalosť,
  • SHOW EVENTS – zobrazuje existujúce udalosti.

CREATE EVENT

Pri vytváraní udalosti príkazom CREATE EVENT potrebujeme špecifikovať názov udalosti, ktorým ju budeme identifikovať, ďalej časové parametre určujúce jej spúšťanie a samozrejme príkaz(y), ktoré chceme spúšťať. Jednoduchý príkaz na vytvorenie udalosti môže vyzerať nasledovne:

CREATE EVENT precisti_log
    ON SCHEDULE EVERY 1 DAY
    DO
        DELETE FROM log_pristupov
            WHERE cas_pristupu < DATE_SUB(CURDATE(), INTERVAL 1 WEEK)

Vytvorenie tejto udalosti zabezpečí, že príkaz DELETE, ktorý z logu prístupov zmaže záznamy staršie ako týždeň, sa bude vykonávať pravidelne s frekvenciou jedenkrát denne, pričom prvýkrát sa vykoná v okamihu definovania udalosti.
Frekvenciu spúšťania udalosti špecifikujeme pomocou čísla alebo výrazu, ktorý sa vyhodnotí na číslo, nasledovaného časovou jednotkou (napríklad SECOND, MINUTE, HOUR, DAY, WEEK; vždy v jednotnom čísle).
V uvedenom príklade je použitý iba jeden príkaz, avšak pomocou BEGIN ... END notácie je možné zadať viacero príkazov oddelených bodkočiarkami:

CREATE EVENT updatuj_statistiku
    ON SCHEDULE EVERY 15 MINUTE
    DO
    BEGIN
        INSERT INTO statistika_prihlaseni (cas, pocet)
            VALUES (CURRENT_TIMESTAMP(),
                SELECT COUNT(*) FROM prihlaseni_uzivatelia);
        UPDATE stav SET atribut = atribut + 2 WHERE typ = 9;
    END

Túto udalosť by sme mohli upraviť tak, aby sa príkazy začali vykonávať až od určitého okamihu v budúcnosti, alebo by sme mohli určiť, že udalosť sa bude pravidelne vykonávať iba do určitého okamihu. To je možné dosiahnuť doplnením klauzúl STARTS alebo ENDS, u ktorých je potrebné uviesť buď iba časový okamih (timestamp) alebo časový okamih plus nejaký časový interval (timestamp + INTERVAL pocet casova_jednotka; vhodné napríklad na špecifikovanie času o hodinu neskôr):

CREATE EVENT updatuj_statistiku
    ON SCHEDULE
        EVERY 15 MINUTE
        STARTS CURRENT_TIMESTAMP() + INTERVAL 1 HOUR
        ENDS '2013-10-01'
    DO ...

Okrem pravidelných udalostí môžeme definovať udalosť, ktorá sa vykoná jednorázovo, a to tak, že namiesto EVERY použijeme AT a špecifikujeme časový okamih (prípadne aj plus interval), podobne ako u STARTS/ENDS:

CREATE EVENT jednorazova_udalost
    ON SCHEDULE AT CURRENT_TIMESTAMP() + INTERVAL 6 HOUR
    DO ...

Na záver ešte doplníme, že ak udalosť "vyprší", automaticky sa zmaže. Vypršanie u jednorázových udalostí predstavuje ich vykonanie a u pravidelných udalostí so špecifikovaným koncovým časom je to posledné plánované vykonanie.

ALTER EVENT

U vytvorenej udalosti je možné upravovať jej špecifikáciu príkazom ALTER EVENT. Tento príkaz vyžaduje ako argument identifikátor udalosti a jednu alebo viacero zo špecifikačných klauzúl, podobných ako u CREATE EVENT:

  • ON SCHEDULE schedule – úprava časových aspektov vykonávania udalosti (EVERY, AT), prípadne môže meniť jednorázovú udalosť na pravidelnú a naopak,
  • RENAME TO novy_nazov – premenovanie udalosti,
  • DISABLE – zakázanie vykonávania udalosti,
  • ENABLE – povolenie vykonávania udalosti,
  • DO prikaz – nahradenie vykonávaných príkazov inými.

Nasledovným príkazom upravíme interval spúšťania udalosti updatuj_statistiku a dočasne ju zakážeme:

ALTER EVENT updatuj_statistiku
    ON SCHEDULE EVERY 1 HOUR
    DISABLE

DROP EVENT, SHOW EVENTS

Zostávajúce dva príkazy sú už celkom jednoduché. Príkaz DROP EVENT nazov_udalosti zmaže špecifikovanú udalosť, takže v budúcnosti sa už nebude vykonávať. Príkaz SHOW EVENTS zas zobrazuje zoznam udalostí definovaných v aktuálnej databáze a základné informácie o nich.

Ďalšie informácie

Tento článok predstavil základné informácie potrebné pre používanie udalostí v MySQL, ktoré môžete používať na Elbia Hostingu. Podrobnejšie informácie môžete nájsť v oficiálnej dokumentácii.