2013年5月13日月曜日

MySQLのイベントスケジューラを使用した

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

MySQLのイベントスケジューラーは、あなたがそれらを必要とするなど、さまざまなものをスケジュールするための非常に効果的です。 
以下は、マスター&スレーブ全体で異なるイベントスケジューラを使用する方法もイベントを使用する方法の簡単な例です。 

まず、イベントスケジューラのステータスを確認します。 




> 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 |
+---------------------------------------------------+-------+


あなたにそれを回すためには、次のコマンドを使用するか、また、あなたのmy.cnfファイル内で設定することができます。 

set GLOBAL event_scheduler=ON; 


私はちょうどこのデモ用のデータベースを作成します 


create database events_test;
use events_test;


マスター上のテストのために私はevents_testデータベースに、この単純なテーブルを使用します。 


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


私はイベントにそれをプッシュする前に簡単に手順をテストすることができますので、私のイベントはストアドプロシージャを実行してもらいたい。 

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


今、私はこのデモのために毎分このイベントを実行しているだろう 



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




それがシステムにあることを確認します。 



> 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



私はまた、スレーブでイベントを作成し、私は私がオフにするイベントを無効にする必要があることを行う上で計画しているので。 だから私は、スレーブサーバ上のイベントmastereventtestが変更されます。 


ALTER EVENT mastereventtest disable on slave; 



私は再び複製されたevents_testデータベース、下だけスレーブ上の別のテーブルを作成します 


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


再び私はイベントで使用するための手順を作成したい。 これは必須ではありますが、ただそれが簡単にテストすることになるされていません。 

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


これは私がスレーブ上で実行イベントになるだろう 


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





また、システムにそれを作っていることを確認 



> 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




また、イベント情報の情報スキーマを照会することができます 




> select * from information_schema.EVENTS\G




イベントをデバッグするには、確認する最善の場所は、あなたのエラーログです。 

あなたは、スレーブ上のイベントをチェックしたときに両方のイベントが表示されていることに留意してください 



> > 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) 






今、それは動作したのですか? 

あなたはショーPROCESSLISTを実行すると次のように表示できるようになり、現在のイベントスレッドの状態をして、ここで状態結果についての詳細を読むことができます: 


あなたが見てする必要があります次の起動を待つ 
私はまた、テーブルに結果を持っている: 



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) 








イベントを削除するか無効にするには: 

mastereventtest EXISTS場合にイベントをDROP; 
無効にするイベントmastereventtestのALTER;