Събития (Events) в MySQL:

Събитията представляват задачи, които се изпълняват отложено във времето. Изпълнението може да бъде еднократно, многократно, безкрайно, периодично и непериодично. Използват се в много случаи за оптимизиране на таблици в базата, формиране на генерални извадки (отчети, справки), извършване на архивиране на данни. Събитията най-често извикват процедури отложено във времето- обикновено в не пиков час за системите. За да работите с MySQL Event Scheduler, ще трябва предварително да го конфигурирате. По подразбиране той не работи. Всъщност scheduler-ът е отделна нишка, която при стартиране следи дали има да изпълнява определена задача в дадения момент и я изпълнява. За да видите в какъв статус е той може да изпълните командата SHOW PROCESSLIST;

9

Както виждате, той по подразбиране е изключен. Можете да го стартирате като изпълните командата:

SET GLOBAL event_scheduler = ON;

След това изпълнете отново командата SHOW PROCESSLIST; и ще видите, че той вече е включен:

10

Съответно, за да го изключите може да използвате

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. Много системи ще изпълняват подобни събития и заявки свързани с тях поради отчетност, приключване на работен ден или година.
  • Винаги гледайте събитията ви да се разминават във времето, за да може сървърът да се натоварва равномерно.

Даниел Джолев

 

One thought on “Събития (Events) в MySQL:”

  1. CREATE PROCEDURE proc1( )

    BEGIN

    SELECT * FROM people

    END

    CREATE EVENT proc1event
    ON SCHEDULE EVERY 1 MINUTE
    DO
    BEGIN
    CALL proc1();
    END;

Leave a Reply

Your email address will not be published. Required fields are marked *