lunes, 13 de mayo de 2013

Uso del planificador de eventos de MySQL

Original post: http://anothermysqldba.blogspot.com/2013/05/using-mysql-event-scheduler.html

El planificador de eventos MySQL es muy eficaz para la programación de diferentes cosas como usted las necesita. 
A continuación se muestra un ejemplo sencillo de cómo utilizar los eventos y también cómo se puede utilizar el planificador de evento diferente a través de un maestro y un esclavo. 

En primer lugar comprobar el estado de su evento planificador: 




> show variables like '%event%';
+---------------------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------------------+-------+
| event_scheduler | OFF |
| performance_schema_events_waits_history_long_size | 10000 |
| performance_schema_events_waits_history_size | 10 |
+---------------------------------------------------+-------+


Para activarlo se puede utilizar el siguiente comando o también puede ponerlo en su archivo my.cnf. 

set GLOBAL event_scheduler=ON; 


Voy a crear una base de datos sólo para esta demo 


create database events_test;
use events_test;


Para una prueba en el maestro voy a utilizar esta sencilla tabla en la base de datos events_test. 


CREATE TABLE `foobar` (
`time_recorded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
); 


Me gusta tener mis eventos se ejecutan procedimientos almacenados porque puedo probar el procedimiento con facilidad antes de empujar en un evento. 

delimiter //
CREATE PROCEDURE mastereventtest()
BEGIN
insert into foobar values (NOW());
END//
delimiter ; 


Ahora voy a tener este evento ejecuta cada minuto sólo para esta demo 



CREATE EVENT mastereventtest
ON SCHEDULE EVERY 1 MINUTE
COMMENT 'testing master events'
DO
call mastereventtest();




Confirmar el que está en el sistema. 



> show create event mastereventtest\G
*************************** 1. row ***************************
Event: mastereventtest
sql_mode: NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
time_zone: SYSTEM
Create Event: CREATE DEFINER=`root`@`localhost` EVENT `mastereventtest` ON SCHEDULE EVERY 1 MINUTE STARTS '2013-05-12 21:25:22' ON COMPLETION NOT PRESERVE ENABLE COMMENT 'testing master events' DO call mastereventtest()
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci





> show events \G
*************************** 1. row ***************************
Db: events_test
Name: mastereventtest
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2013-05-12 21:25:22
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci



También voy a crear un evento en el esclavo y puesto que tengo pensado hacer eso tengo que inhabilitar los sucesos que quiero fuera. Así que voy a alterar el mastereventtest eventos en el servidor esclavo. 


ALTER EVENT mastereventtest disable on slave; 



Otra vez voy a crear una tabla diferente en el esclavo sólo bajo la base de datos events_test, que fue replicado 


CREATE TABLE `foo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
); 


Una vez más me gustaría crear un procedimiento para usar con mis actos. Esto no es necesario, pero sólo hace que sea más fácil de probar. 

delimiter //
CREATE PROCEDURE slaveeventtest()
BEGIN
insert into foo values ();
END//
delimiter ; 


Este será el evento Corro en el esclavo 


CREATE EVENT slaveeventtest
ON SCHEDULE EVERY 2 MINUTE
COMMENT 'testing master events'
DO
call slaveeventtest(); 





Confirme que también se hizo en el sistema 



> show create event slaveeventtest\G
*************************** 1. row ***************************
Event: slaveeventtest
sql_mode: NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
time_zone: SYSTEM
Create Event: CREATE DEFINER=`root`@`localhost` EVENT `slaveeventtest` ON SCHEDULE EVERY 2 MINUTE STARTS '2013-05-12 21:14:08' ON COMPLETION NOT PRESERVE ENABLE COMMENT 'testing master events' DO call slaveeventtest()
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci 





> show events\G

Db: events_test
Name: slaveeventtest
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 2
Interval field: MINUTE
Starts: 2013-05-12 21:14:08
Ends: NULL
Status: ENABLED
Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci




También puede consultar el esquema de información para la información del evento 




> select * from information_schema.EVENTS\G




Para depurar un evento el mejor lugar para ver es el registro de errores. 

Tenga en cuenta que cuando se registre los acontecimientos en el esclavo podrás ver ambos eventos 



> > show events \G
*************************** 1. row ***************************
Db: events_test
Name: mastereventtest
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: MINUTE
Starts: 2013-05-12 21:25:22
Ends: NULL
Status: SLAVESIDE_DISABLED
Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
*************************** 2. row ***************************
Db: events_test
Name: slaveeventtest
Definer: root@localhost
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 2
Interval field: MINUTE
Starts: 2013-05-12 21:14:08
Ends: NULL
Status: ENABLED
Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
2 rows in set (0.01 sec) 






Ahora, ¿funcionó? 

Si se ejecuta un programa de processlist usted será capaz de ver el estado de hilo de eventos actuales y se puede leer más acerca de los resultados estatales aquí: 


Usted debe ver: Esperando activación siguiente 
También tengo los resultados de las tablas: 



root@localhost [events_test]> select * from foobar;
+---------------------+
| time_recorded |
+---------------------+
| 2013-05-12 21:25:22 |
| 2013-05-12 21:26:22 |
| 2013-05-12 21:27:22 |
| 2013-05-12 21:28:22 |
| 2013-05-12 21:29:22 |
| 2013-05-12 21:30:22 |
| 2013-05-12 21:31:22 |
| 2013-05-12 21:32:22 |
+---------------------+
8 rows in set (0.00 sec)

root@localhost [events_test]> select * from foo;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
+----+
8 rows in set (0.00 sec) 








Para eliminar o inhabilitar eventos: 

DROP CASO SI EXISTE mastereventtest; 
ALTER mastereventtest CASO desactivar;