Mostrando entradas con la etiqueta DISABLE ON SLAVE. Mostrar todas las entradas
Mostrando entradas con la etiqueta DISABLE ON SLAVE. Mostrar todas las entradas

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;