Шукати в цьому блозі

пʼятницю, 26 квітня 2019 р.

MYSQL: простая процедура и настройка выполнения по расписанию.

Стала простая задача.
Есть временная таблица в схеме, которую наполняют каждый день коллеги выборкой из одной из систем, таблица содержит данные "на сегодня".
Я же захотел хранить все слепки данных, для отслеживания изменений в долгосрочном периоде.
Вначале, хотел использовать скрипты на Perl, во - первых, мне так удобно, во вторых мне так удобно, я так привык.

Зная, что сам сервер MYSQL достаточно продвинутый, решил реализовать задачу посредством только сервера.

И так, что имеем:
Некую схему access_rqst_list
в ней таблицу  table_tmp
Заполнять необходимо только значимыми полями таблицу  table_main
Процесс копирования решил с помощью процедуры:

CREATE  PROCEDURE `copy_table_rqst`()
BEGIN
CREATE TABLE IF NOT EXISTS table_main LIKE table_tmp;
INSERT table_main(DateCreate,Status,Customer,RequestType,DocNumber,DateExecuted,AccessType,DateAccessClose,Reason,IRCategory,IRName,IRType,AccessParameters) SELECT DateCreate,Status,Customer,RequestType,DocNumber,DateExecuted,AccessType,DateAccessClose,Reason,IRCategory,IRName,IRType,AccessParameters FROM table_tmp where tstamp BETWEEN TIMESTAMP(CURDATE()) AND TIMESTAMP(CURDATE()+1);
END


Данная процедура, на всякий случай, если таблица  table_main удалена создает ее из структуры  table_tmp, далее копирует необходимые мне поля из  table_tmp в table_main за сегодня tstamp BETWEEN TIMESTAMP(CURDATE()) AND TIMESTAMP(CURDATE()+1);
где tstamp - поле в table_tmp типа TIMESTAMP.

В итоге, в интерфейсе mysql клиента можно вызвать процедуру:

call access_rqst_list.copy_table_rqst();

Но, это еще не все, необходимо. чтобы копирование происходил автоматически.
Для запуска чего, в серевере MYSQL есть понятие EVENT

Для начала включаем поддержку из-под root пользователя MYSQL сервера:

SET GLOBAL event_scheduler = ON;
если понадобиться отключить, просто даем установку - SET GLOBAL event_scheduler = OFF;

смотрим
SHOW PROCESSLIST;

 293 | event_scheduler | localhost                        | NULL             | Daemon  | 1473 | Waiting for next activation | NULL

Временная таблица, у меня наполняется каждый день,  примерно в 6 утра, потому я хочу, что бы данные перносились примерно в 9 утра, когда  прихожу на работу.

Создаем событие с именем copy_table_acc

CREATE EVENT copy_table_acc ON SCHEDULE EVERY '1' DAY STARTS '2019-04-20 09:00:00' DO call access_rqst_list.copy_table_rqst();

Для проверки, можем посмотреть коммандой
SHOW EVENTS;


+------------------+----------------+----------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db               | Name           | Definer        | Time zone | Type      | Execute at | Interval value | Interval field | Starts              | Ends | Status  | Originator | character_set_client | collation_connection | Database Collation |
+------------------+----------------+----------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| access_rqst_list | copy_table_acc | root@localhost | SYSTEM    | RECURRING | NULL       | 1              | DAY            | 2019-04-20 09:00:00 | NULL | ENABLED |          0 | utf8                 | utf8_unicode_ci      | utf8_general_ci    |
+------------------+----------------+----------------+-----------+-----------+------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+



Если необходимо удалить событие, даем команду:
DROP EVENT copy_table_acc;