Стала простая задача.
Есть временная таблица в схеме, которую наполняют каждый день коллеги выборкой из одной из систем, таблица содержит данные "на сегодня".
Я же захотел хранить все слепки данных, для отслеживания изменений в долгосрочном периоде.
Вначале, хотел использовать скрипты на 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;
Есть временная таблица в схеме, которую наполняют каждый день коллеги выборкой из одной из систем, таблица содержит данные "на сегодня".
Я же захотел хранить все слепки данных, для отслеживания изменений в долгосрочном периоде.
Вначале, хотел использовать скрипты на 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;
Немає коментарів:
Дописати коментар