mysql-crontab

В MySQL 5.1 появился свой планировщик задач! Ранее, мне и многим другим разработчикам приходилось использовать cron для таких целей, как «подчистка устаревшей информации» или «пересчет счетчиков» в базе данных и т.д.

Включение планировщика

Планировщик по умолчанию выключен, для того чтобы его включить надо добавить в my.ini или в my.cnf

[mysqld]
event_scheduler = on

Так же вы можете для конкретной сессии запустить планировщик в mysql-консоле

mysql> SET global event_scheduler = ON;

Для проверки, работает ли планировщик, выполните запрос:

mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

Официальное руководство по настройке.

Создание задания

Синтаксис достаточно прост, при создании задания необходимо обязательно указать:

  • Имя задания (event_name)
  • Интервал или точное время (schedule и interval)
  • SQL-запрос для выполнения (sql_statement)

CREATE
    [DEFINER = { USER | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO sql_statement;

schedule:
    AT TIMESTAMP [+ INTERVAL INTERVAL] ...
  | EVERY INTERVAL
    [STARTS TIMESTAMP [+ INTERVAL INTERVAL] ...]
    [ENDS TIMESTAMP [+ INTERVAL INTERVAL] ...]

INTERVAL:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

Так же вы можете указать:

  • DEFINER — имя пользователя, от кого запускать задание (с его правами соответственно)
  • COMMENT — комментарий
  • ON COMPLETION PRESERVE — задание после выполнения сохраняется
  • ON COMPLETION NOT PRESERVE — задание выполняется один раз, после чего уничтожается из списка заданий (по умолчанию)

Пример короткой записи:

CREATE EVENT `myevent`
    ON SCHEDULE
      AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
      ON COMPLETION PRESERVE
    DO
      UPDATE `myschema`.`mytable` SET `mycol` = `mycol` + 1;

Официальное руководство по CREATE EVENT

Изменение задания

При изменении, вы можете сменить владельца, переименовать название, изменить SQL-запрос и поменять другие свойства задания.

ALTER
    [DEFINER = { USER | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    [DO sql_statement]

Для отображения всех свойств задания используйте:

SELECT * FROM `INFORMATION_SCHEMA`.`EVENTS`
    WHERE `EVENT_NAME` = 'myevent' AND EVENT_SCHEMA = 'myschema'\G
*************************** 1. ROW ***************************
   EVENT_CATALOG: NULL
    EVENT_SCHEMA: myschema
      EVENT_NAME: myevent
         DEFINER: john@smith
      EVENT_BODY: SQL
EVENT_DEFINITION: INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP())
      EVENT_TYPE: RECURRING
      EXECUTE_AT: NULL
  INTERVAL_VALUE: 5
  INTERVAL_FIELD: SECOND
        SQL_MODE: NULL
          STARTS: 0000-00-00 00:00:00
            ENDS: 0000-00-00 00:00:00
          STATUS: ENABLED
   ON_COMPLETION: NOT PRESERVE
         CREATED: 2006-02-09 22:36:06
    LAST_ALTERED: 2006-02-09 22:36:06
   LAST_EXECUTED: NULL
   EVENT_COMMENT:
1 ROW IN SET (0.00 sec)

Либо используйте:

SHOW events LIKE "event_name%"\G

Официальное руководство по ALTER EVENT

Удаление задания

DROP EVENT [IF EXISTS] event_name

Официальное руководство по DROP EVENT

Диспетчер событий и привилегии в MySQL

Официальное руководство по установке привелегий

Примеры использования

Задача: Удаление не активированных учетных записей пользователей, которые не активировались в течении 3-х дней. Запускать событие необходимо каждый день.

CREATE EVENT `not_active_users`
    ON SCHEDULE
      EVERY 1 DAY
    DO
      DELETE FROM `users`
        WHERE `active` = 'not', UNIX_TIMESTAMP(`date`) >= UNIX_TIMESTAMP(NOW()) - (3 * 24 * 3600);

Задача: А теперь сменим для задания «not_active_users» временной интервал.

ALTER EVENT `not_active_users`
    ON SCHEDULE
      EVERY 12 HOUR;

Задача: Удалить задание.

DROP EVENT `not_active_users`;

Официальные страницы руководства: Using the Event Scheduler


Комментарии (19) на запись «MySQL Event Scheduler или встроенный диспетчер событий в MySQL»

» Трекбеки скрыты, показать их?
  1. Konstantin | 12.06.2009 в 14:30

    Для событий исполняемых с определенной периодичностью, можно также указать время старта и время прекращения цикличного выполнения, например для примера приведенного в статье:

    CREATE EVENT `not_active_users`

    ON SCHEDULE

    EVERY 1 DAY START '2009-06-12 23:59:59' END CURRENT_TIMESTAMP + INTERVAL 1 WEEK

    DO

    DELETE FROM `users`

    WHERE `active` = 'not', UNIX_TIMESTAMP (`date`) >= UNIX_TIMESTAMP (NOW ()) — (3 * 24 * 3600);

    Событие исполнится -2009-06-12 23:59:59 и не будет исполнятся через 1 неделю, подробнее смотрите dev.mysql.com/doc/refman/...reate-event.html

    В популярном менеджере EMS можно работать с событиями, для версий совместимых с соответствующей версией MySQL.

  2. adw0rd | 12.06.2009 в 15:02

    Спасибо Константин, за очень ценный комментарий!

  3. alexeym | 30.07.2009 в 11:19

    Эвенты — классная штука, ...на ранних версиях mysql правда был баг с временем срабатывания, но MySQL AB уже пофиксил. А вот ещё нашел отличный редактор для mysql — Devart dbForge studio for MySQL, там для событий ещё более удобный редактор с настройками объектов.

    Devart dbForge studio for MySQL, русская бесплатная

  4. adw0rd | 30.07.2009 в 13:35

    alexeym, да, я эту софтину юзал :)

  5. Frozzeg | 23.09.2010 в 01:07

    выполняю в консоли следующий код

    CREATE EVENT myevent ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ON COMPLETION PRESERVE DO UPDATE lafs.users SET counter = counter + 1;

    пишет ошибку

    You have an error at your SQL syntax near 'CREATE EVENT myevent ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE ON COM'

    должен ли я в консоли заранее выполнить запрос для выбора базы данных

  6. Frozzeg | 23.09.2010 в 01:09

    должен ли я в консоли заранее выполнить запрос для выбора базы данных

    это можно не читать)
  7. adw0rd | 23.09.2010 в 02:02

    Какая версия mysql?

  8. Frozzeg | 23.09.2010 в 02:12

    5.1

  9. adw0rd | 23.09.2010 в 02:54

    Да, выбери БД и еще покажи

    show variables like 'event_scheduler';

  10. Frozzeg | 23.09.2010 в 13:03

    Vatiable_name Value

    event_scheduler ON

    1 row in set

  11. Frozzeg | 23.09.2010 в 13:04

    мистика емае

  12. Frozzeg | 23.09.2010 в 14:34

    короче в топку, буду на C# делать сервак

  13. adw0rd | 23.09.2010 в 17:45

    быстро ты сдался... ты use database_name то делал?

    дай доступ к бд — сам посмотрю

  14. Телевизор | 17.12.2010 в 05:32

    а может хостер запретить эту функцию в целях безопасности или предотвращения нагрузки сервера?

    проверил состояние пишет:

    event_scheduler OFF — означает что выключен хостером или просто выключен и нуна его включить другим запросом (каким запросом?) ? ;

  15. Телевизор | 17.12.2010 в 05:36

    хм... кстати у меня нету доступа к файлам my.ini и my.cnf да и вообще где они должны быть расположены?

  16. Телевизор | 17.12.2010 в 05:40

    эх... Access denied; you need the SUPER privilege for this operation — походу я сосу (пардон)...

    а у хостер есть смысл просить эту функцию как вы думаете?

  17. adw0rd | 17.12.2010 в 10:26

    запросом (каким запросом?)

    mysql> SET global event_scheduler = ON;

    не помогает?

    хм... кстати у меня нету доступа к файлам my.ini и my.cnf да и вообще где они должны быть расположены?

    обычно /etc/my.cnf, но его даже может не быть вовсе (будет работать по дефолтным настройкам), поэтому надо создать

    хотя если у вас хостинг, то скорее всего ничего у вас не выйдет

    эх... Access denied; you need the SUPER privilege for this operation — походу я сосу (пардон)...

    =)

    а у хостер есть смысл просить эту функцию как вы думаете?

    Спросить всегда можно, некоторые идут на уступки. Но лучше бы вы взяли вдс (300-600 руб в мес)

  18. Владимир | 27.09.2011 в 10:32

    Скажите пожалуйста, такой планировщик можно настроить на автоматическое создание дампа (бэкапа) базы данных в конкретное время(в конкретные дни)?

    CREATE EVENT `not_active_users`

    ON SCHEDULE

    EVERY 1 DAY

    DO

    mysqldump -uroot -h82.82.82.82 -p database > database.sql ( тут я для наглядности добавил)

    Можно как то прикрутить такую операцию?

  19. adw0rd | 04.10.2011 в 11:43

    Смотрите adw0rd.ru/2009/mysqldump- ...t/#online-backup

    Либо только через cron и т.д., т.е. вне MySQL

    ps. dev.mysql.com/doc/refman/...kup-methods.html

Оставить комментарий



входные металлические двери