Събитията представляват задачи, които се изпълняват отложено във времето. Изпълнението може да бъде еднократно, многократно, безкрайно, периодично и непериодично. Използват се в много случаи за оптимизиране на таблици в базата, формиране на генерални извадки (отчети, справки), извършване на архивиране на данни. Събитията най-често извикват процедури отложено във времето- обикновено в не пиков час за системите. За да работите с MySQL Event Scheduler, ще трябва предварително да го конфигурирате. По подразбиране той не работи. Всъщност scheduler-ът е отделна нишка, която при стартиране следи дали има да изпълнява определена задача в дадения момент и я изпълнява. За да видите в какъв статус е той може да изпълните командата SHOW PROCESSLIST;
Както виждате, той по подразбиране е изключен. Можете да го стартирате като изпълните командата:
SET GLOBAL event_scheduler = ON;
След това изпълнете отново командата SHOW PROCESSLIST; и ще видите, че той вече е включен:
Съответно, за да го изключите може да използвате
SET GLOBAL event_scheduler = OFF;
За да зададете да се стартира автоматично при стартиране на сървъра, може да промените една настройка в my.cnf файла на ON: event_scheduler= on.
Създаване на събитие. Синтаксис:
CREATE EVENT <име>
ON SCHEDULE <график>
DO <тяло>
Име – Името на събитието трябва да бъде уникално в рамките на базата данни.
ON SCHEDULE – задаване на график за изпълнение на събитието. Ако събитието е еднократно, то може да използвате AT timestamp и по желание да го отместите с [+ INTERVAL]. Ако искате да го направите периодично, то използвате клауза EVERY. Например EVERY MONTH, като ако искате да започне от сега, не пишете нищо, а ако искате да започне от бъдещ момент, то продълавате със STARTS timestamp [+ INTERVAL]. Ако искате да зададете край на изпълнението, то продължавате с ENDS timestamp [+INTERVAL], ако го пропуснете, то ще стане безкрайно.
Тяло – тук пишете заявките, които искате да се изпълнят – например извиквате процедура. Ако заявките ви са повече от една, сменяте знака за край на заявката, а самите заявки заключвате между begin и end.
Ще направим регулярно събитие, което да се стартира от началото на месец май, 2016г, да се извиква всеки месец в 06:05 часа сутринта и да извършва регулярните месечни плащания на треньорите. Ще използваме оптимизираната процедура. Как всеки път да и подаваме различен месец и различна година? Ще изпозлваме функциите MONTH(timestamp) и YEAR(timestamp), които по подадено време извличат месец или година от него. Съответно ние ще подаваме текущото време чрез функцията NOW(). За да използвате текущо време може да използвате и CURRENT_TIMESTAMP;
delimiter | CREATE EVENT monthly_Payment ON SCHEDULE EVERY 1 MONTH STARTS '2016-05-01 06:05:00' DO BEGIN CALL OPTIMIZED_monthHonorariumPayment(MONTH(NOW()),YEAR(NOW())); END; | delimiter ;
- НЕ стартирайте събития в 00:00:00 и особено на 31 декември в 00:00:00. Много системи ще изпълняват подобни събития и заявки свързани с тях поради отчетност, приключване на работен ден или година.
- Винаги гледайте събитията ви да се разминават във времето, за да може сървърът да се натоварва равномерно.
Даниел Джолев
CREATE PROCEDURE proc1( )
BEGIN
SELECT * FROM people
END
CREATE EVENT proc1event
ON SCHEDULE EVERY 1 MINUTE
DO
BEGIN
CALL proc1();
END;