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;