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.
