Úvod
Události MySQL jsou úlohy, které běží podle uživatelem definovaného plánu . Plánovač událostí je speciální vlákno, které spouští události v naplánovanou dobu.
Události MySQL jsou užitečné, protože usnadňují správu databází a pravidelné provozní úkoly databáze.
V tomto tutoriálu se dozvíte, co jsou události MySQL a jak je nastavit a používat.
Předpoklady:
- Systém běžící na databázovém serveru MySQL
- Uživatelský účet MySQL s oprávněními root
Co je plánovač událostí MySQL?
MySQL Event Scheduler je vlákno, které běží na pozadí a spravuje provádění naplánovaných událostí. Plánovač je ve stavu spánku, pokud globální proměnná event_scheduler
je nastaveno na ON
nebo 1
.
Plánovač událostí MySQL představuje alternativu úlohy Cron MySQL . Některé výhody Plánovače událostí jsou:
- Je napsán přímo na serveru MySQL.
- Je nezávislý na platformě a aplikaci.
- Lze jej použít, kdykoli je vyžadována pravidelná aktualizace nebo vyčištění databáze.
- Snižuje počet kompilací dotazů.
Konfigurace plánovače událostí MySQL
Stav plánovače událostí MySQL lze nakonfigurovat tak, aby byl plánovač zapnut , vypnuto nebo zakázat to.
Chcete-li zkontrolovat stav Plánovače událostí, spusťte následující příkaz:
SHOW processlist;
event_scheduler
systémová proměnná zobrazená ve výsledku ukazuje stav Plánovače událostí. Zde je event_scheduler
stav proměnné je Čekání na prázdnou frontu , což znamená, že Plánovač je zapnutý a čeká na událost, která jej spustí.
Možné stavy jsou:
ON
:Vlákno Event Scheduler je spuštěno a provádí všechny naplánované události. Toto je výchozí stav plánovače. Pokud je PlánovačON
,SHOW processlist
výstup příkazu jej uvádí jako proces démona.
Chcete-li plánovač událostí zapnout ON
, spusťte následující příkaz:
SET GLOBAL event_scheduler = ON;
Hodnota ON
je zaměnitelné s 1
.
OFF
:Vlákno Plánovače událostí není spuštěno a nezobrazuje se ve výstupuSHOW processlist
. Pokud je Plánovač událostí nastaven naOFF
, naplánované události se neprovedou.
Chcete-li Plánovač událostí OFF
, spusťte následující příkaz:
SET GLOBAL event_scheduler = OFF;
Hodnota OFF
je zaměnitelné s 0
.
DISABLED
:Tento stav znamená, že plánovač událostí není funkční. Vlákno se nespustí a nezobrazí se ve výstupuSHOW processlist
příkaz.
Chcete-li zakázat Plánovač událostí, přidejte při spouštění serveru následující možnost příkazového řádku:
--event-scheduler=DISABLED
Plánování událostí MySQL
Událost je databázový objekt obsahující příkazy SQL spouštěné v určený čas nebo v pravidelných intervalech. Události začínají a končí v konkrétní čas a datum.
Protože se události MySQL spouštějí v čase, který uživatel určí, jsou tyto události také označovány jako časové spouštěče . Neměly by se však zaměňovat se spouštěči MySQL, což jsou databázové objekty spouštěné v reakci na konkrétní události. Proto je lepší používat termín události při odkazování na naplánované úkoly, aby nedošlo k záměně.
Následující části pojednávají o tom, jak vytvořit , zobrazit , změnit nebo odebrat události.
Vytvářejte nové události
Chcete-li vytvořit novou událost, použijte následující syntaxi:
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body
IF NOT EXIST
zajišťuje, že název události je jedinečný pro používanou databázi. Místo event_name
zadejte jedinečný název události syntax. Plán pro provedení události je uveden za ON SCHEDULE
prohlášení. Událost může být jednorázová nebo opakující se událost .
Místo event_body
zadejte příkazy SQL syntaxe za DO
klíčové slovo. Tělo události může obsahovat uložené procedury, jednotlivé dotazy nebo složené příkazy. Napište složené příkazy do BEGIN END
blokovat.
Naplánovat události
Události lze naplánovat na pozdější spuštění nebo na pravidelné spouštění.
Jednorázová událost
Jednorázová událost se provede pouze jednou a poté se automaticky odstraní.
Chcete-li vytvořit jednorázovou událost, zadejte časové razítko za ON SCHEDULE
pomocí následující syntaxe:
AT timestamp + [INTERVAL interval]
Možné volby pro interval jsou:
- ROK
- ČTVRTLETÍ
- MĚSÍC
- DEN
- HODINA
- MINUTE
- WEEK
- DRUHÁ
- YEAR_MONTH
- DAY_HOUR
- DAY_MINUTE
- DAY_SECOND
- HOUR_MINUTE
- HOUR_SECOND
- MINUTE_SECOND
Časové razítko musí být DATETIME
nebo TIMESTAMP
hodnotu v budoucnu. Chcete-li zadat přesný čas, přidejte k časové značce interval pomocí + INTERVAL
, kladné celé číslo a jedna z možností intervalu. Upozorňujeme, že to platí pouze při použití CURRENT_TIMESTAMP
funkce.
Například:
Zde se událost stane dva dny od jejího vytvoření a jejím úkolem je shodit tabulku s názvem test .
Události jsou po provedení automaticky zrušeny. Chcete-li uložit událost do databáze, přidejte ON COMPLETION PRESERVE
klauzule při vytváření události.
Opakující se událost
Opakující se událost se opakuje opakovaně v určený čas. Chcete-li naplánovat opakující se událost, použijte následující syntaxi za ON SCHEDULE
prohlášení:
EVERY interval
STARTS timestamp [+ INTERVAL]
ENDS timestamp [+ INTERVAL]
STARTS
klíčové slovo určuje, kdy se spustí provádění události, zatímco ENDS
klíčové slovo určuje, kdy se provádění události zastaví.
Například:
Tato událost způsobí, že MySQL jednou za šest měsíců zahodí test tabulky, a to okamžitě.
Můžete také zadat interval pro pozdější zahájení události. Například:
Můžete také zadat čas zahájení a čas ukončení události:
Tato událost způsobí, že MySQL zruší tabulku s názvem test jednou za šest měsíců po dobu pěti let, počínaje pěti dny.
Zobrazit události
Následující příkaz zobrazí všechny události uložené v databázi:
SHOW EVENTS FROM database_name;
Pamatujte, že jednorázové události jsou po provedení automaticky zrušeny a nezobrazují se ve výstupu SHOW EVENTS
příkaz, pokud nepoužijete příkaz ON COMPLETION PRESERVE
klauzule při vytváření události.
Výstup obsahuje seznam všech událostí uložených v zadané databázi.
Změnit události
Použijte ALTER EVENT
příkaz ke změně existující události:
ALTER EVENT event_name
[ ON SCHEDULE schedule ]
[ RENAME TO new_event_name ]
[ ON COMPLETION [ NOT ] PRESERVE ]
[ COMMENT 'comment' ]
[ ENABLED | DISABLED ]
[ DO sql_statement ]
event_name
musí jít o událost, která již existuje. Všechny příkazy po ALTER EVENT
jsou volitelné v závislosti na tom, co chcete změnit. Vynechání všech klauzulí v ALTER EVENT
příkaz znamená, že zůstanou ve svém předchozím stavu. Jakákoli zahrnutá klauzule znamená, že se použijí nové hodnoty, které určíte.
Například:
V tomto příkladu jsme přejmenovali událost a změnili její příkaz SQL.
Odebrat události (vypustit událost)
Chcete-li odstranit (upustit) událost, použijte následující syntaxi:.
DROP EVENT [IF EXISTS] event_name;
Například:
Tato akce trvale smaže událost z databáze.
Pomocí IF EXISTS
příkaz vydá varování, pokud taková událost neexistuje:
Omezení událostí MySQL
Při používání událostí MySQL je třeba vzít v úvahu určitá omezení. Některé z nich jsou:
- Události nemohou vrátit sadu výsledků. Výstup je přesměrován na dev/null a událost buď selže, nebo uspěje bez upozornění uživatele.
- V názvech událostí se nerozlišují velká a malá písmena. Dvě události nemohou mít stejný název s různými velikostmi písmen.
- Události nelze naplánovat po 19. lednu 2038 – maximum, které lze v epoše Unixu reprezentovat.
- Události nelze vytvářet, rušit ani měnit jiným uloženým programem, spouštěčem nebo událostí.
- Události nemohou vytvářet, rušit ani měnit uložené programy nebo spouštěče.
- Intervaly
MONTH
,YEAR_MONTH
,QUARTER
aYEAR
jsou vyřešeny v měsících. Všechny ostatní intervaly jsou vyřešeny v sekundách. - Můžou existovat dvě události se stejným rozvrhem, ale neexistuje způsob, jak vynutit příkaz k provedení.
- Událost se vždy spouští s oprávněními definujícího. Vlákno spustí událost jako uživatel, který událost vytvořil, s oprávněními tohoto uživatele. Upozorňujeme, že odebráním uživatele se neodeberou události, které uživatel vytvořil.
- Události nemění počet provedení příkazu, což znamená, že to nemá žádný vliv na
SHOW STATISTICS
příkaz. - Maximální zpoždění pro provedení události jsou dvě sekundy. Nicméně information_schema.events tabulka vždy zobrazuje přesný čas provedení události.
- Používejte uživatelem definované proměnné místo odkazů na lokální proměnné v připravených příkazech uvnitř uložené rutiny.
- Počet rekurzivních volání je omezen na
max_sp_recursion_depth
. Pokud je tato proměnná 0, což je výchozí hodnota, rekurzivita je zakázána. - Použijte
START TRANSACTION
místo příkazuBEGIN WORK
, protožeBEGIN WORK
je považováno za začátekBEGIN END
blokovat. - Jakékoli jiné omezení uložených procedur se vztahuje také na události.