MySQL Event
生活随笔
收集整理的這篇文章主要介紹了
MySQL Event
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
一、前言
自MySQL5.1.6起,增加了一個(gè)非常有特色的功能–事件調(diào)度器(Event Scheduler),可以用做定時(shí)執(zhí)行某些特定任務(wù)(例如:刪除記錄、對(duì)數(shù)據(jù)進(jìn)行匯總等等),來(lái)取代原先只能由操作系統(tǒng)的計(jì)劃任務(wù)來(lái)執(zhí)行的工作。更值得 一提的是MySQL的事件調(diào)度器可以精確到每秒鐘執(zhí)行一個(gè)任務(wù),而操作系統(tǒng)的計(jì)劃任務(wù)(如:Linux下的CRON或Windows下的任務(wù)計(jì)劃)只能精 確到每分鐘執(zhí)行一次。對(duì)于一些對(duì)數(shù)據(jù)實(shí)時(shí)性要求比較高的應(yīng)用(例如:股票、賠率、比分等)就非常適合。
事件調(diào)度器有時(shí)也可稱為臨時(shí)觸發(fā)器(temporal triggers),因?yàn)槭录{(diào)度器是基于特定時(shí)間周期觸發(fā)來(lái)執(zhí)行某些任務(wù),而觸發(fā)器(Triggers)是基于某個(gè)表所產(chǎn)生的事件觸發(fā)的,區(qū)別也就在這里。
在使用這個(gè)功能之前必須確保event_scheduler已開(kāi)啟,可執(zhí)行
<span style="font-size: 12px;">SET GLOBAL event_scheduler = 1;---或我們可以在配置my.ini文件 中加上 event_scheduler = 1</span>
或
<span style="font-size: 12px;">SET GLOBAL event_scheduler = ON;</span>
來(lái)開(kāi)啟,也可以直接在啟動(dòng)命令加上“–event_scheduler=1”,例如:
<span style="font-size: 12px;">mysqld ... --event_scheduler=1</span>
要查看當(dāng)前是否已開(kāi)啟事件調(diào)度器,可執(zhí)行如下SQL:
<span style="font-size: 12px;">SHOW VARIABLES LIKE 'event_scheduler';</span>
或
<span style="font-size: 12px;">SELECT @@event_scheduler;</span>
或
<span style="font-size: 12px;">SHOW PROCESSLIST;</span>
8) 每天定時(shí)清空test表(只執(zhí)行一次,任務(wù)完成后就終止該事件): <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYON COMPLETION NOT PRESERVEDO TRUNCATE TABLE test.aaa;</span> [ENABLE | DISABLE]可是設(shè)置該事件創(chuàng)建后狀態(tài)是否開(kāi)啟或關(guān)閉,默認(rèn)為ENABLE。
[COMMENT ‘comment’]可以給該事件加上注釋。
二、創(chuàng)建事件(CREATE EVENT)
先來(lái)看一下它的語(yǔ)法: <span style="font-size: 12px;">CREATE EVENT [IF NOT EXISTS] event_nameON SCHEDULE schedule[ON COMPLETION [NOT] PRESERVE][ENABLE | DISABLE][COMMENT 'comment']DO sql_statement;schedule:AT TIMESTAMP [+ INTERVAL INTERVAL]| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]INTERVAL:quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}</span> 1) 首先來(lái)看一個(gè)簡(jiǎn)單的例子來(lái)演示每秒插入一條記錄到數(shù)據(jù)表 <span style="font-size: 12px;">USE test; CREATE TABLE aaa (timeline TIMESTAMP); CREATE EVENT e_test_insertON SCHEDULE EVERY 1 SECOND DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);</span> 等待3秒鐘后,再執(zhí)行查詢看看: <span style="font-size: 12px;">mysql> SELECT * FROM aaa; +---------------------+ | timeline | +---------------------+ | 2007-07-18 20:44:26 | | 2007-07-18 20:44:27 | | 2007-07-18 20:44:28 | +---------------------+</span> 2) 5天后清空test表: <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAYDO TRUNCATE TABLE test.aaa;</span> 3) 2007年7月20日12點(diǎn)整清空test表: <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'DO TRUNCATE TABLE test.aaa;</span> 4) 每天定時(shí)清空test表: <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYDO TRUNCATE TABLE test.aaa;</span> 5) 5天后開(kāi)啟每天定時(shí)清空test表: <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYSTARTS CURRENT_TIMESTAMP + INTERVAL 5 DAYDO TRUNCATE TABLE test.aaa;</span> 6) 每天定時(shí)清空test表,5天后停止執(zhí)行: <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYENDS CURRENT_TIMESTAMP + INTERVAL 5 DAYDO TRUNCATE TABLE test.aaa;</span> 7) 5天后開(kāi)啟每天定時(shí)清空test表,一個(gè)月后停止執(zhí)行: <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYSTARTS CURRENT_TIMESTAMP + INTERVAL 5 DAYENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTHDO TRUNCATE TABLE test.aaa;</span> [ON COMPLETION [NOT] PRESERVE]可以設(shè)置這個(gè)事件是執(zhí)行一次還是持久執(zhí)行,默認(rèn)為NOT PRESERVE。8) 每天定時(shí)清空test表(只執(zhí)行一次,任務(wù)完成后就終止該事件): <span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYON COMPLETION NOT PRESERVEDO TRUNCATE TABLE test.aaa;</span> [ENABLE | DISABLE]可是設(shè)置該事件創(chuàng)建后狀態(tài)是否開(kāi)啟或關(guān)閉,默認(rèn)為ENABLE。
[COMMENT ‘comment’]可以給該事件加上注釋。
三、修改事件(ALTER EVENT)
<span style="font-size: 12px;">ALTER EVENT event_name[ON SCHEDULE schedule][RENAME TO new_event_name][ON COMPLETION [NOT] PRESERVE][COMMENT 'comment'][ENABLE | DISABLE][DO sql_statement]</span> 1) 臨時(shí)關(guān)閉事件 <span style="font-size: 12px;">ALTER EVENT e_test DISABLE;</span> 2) 開(kāi)啟事件 <span style="font-size: 12px;">ALTER EVENT e_test ENABLE;</span> 3) 將每天清空test表改為5天清空一次: <span style="font-size: 12px;">ALTER EVENT e_testON SCHEDULE EVERY 5 DAY;</span>四、刪除事件(DROP EVENT)
語(yǔ)法很簡(jiǎn)單,如下所示: <span style="font-size: 12px;">DROP EVENT [IF EXISTS] event_name</span> 例如刪除前面創(chuàng)建的e_test事件 <span style="font-size: 12px;">DROP EVENT e_test;</span> 當(dāng)然前提是這個(gè)事件存在,否則會(huì)產(chǎn)生ERROR 1513 (HY000): Unknown event錯(cuò)誤,因此最好加上IF EXISTS <span style="font-size: 12px;">DROP EVENT IF EXISTS e_test; 注意:如果你將event執(zhí)行了Alter event event_name disable.那么當(dāng)你重新啟動(dòng)mysql服務(wù) 器后,該event將被刪除(測(cè)試版本:5.1.30)</span>應(yīng)用案例
本案例是利用 event scheduler 的特性,每秒鐘調(diào)用一次存儲(chǔ)過(guò)程,用于判斷 SLAVE 是否正常運(yùn)行,如果發(fā)現(xiàn) SLAVE 關(guān)閉了,忽略 0 次錯(cuò)誤,然后重新啟動(dòng) SLAVE。- 首先創(chuàng)建存儲(chǔ)過(guò)程
delimiter //create procedure `Slave_Monitor`()beginSELECT VARIABLE_VALUE INTO @SLAVE_STATUSFROM information_schema.GLOBAL_STATUSWHERE VARIABLE_NAME='SLAVE_RUNNING';IF ('ON' != @SLAVE_STATUS) THENSET GLOBAL SQL_SLAVE_SKIP_COUNTER=0;SLAVE START;END IF;end; //delimiter ; 由于存儲(chǔ)過(guò)程中無(wú)法調(diào)用類似 SHOW SLAVE STATUS 這樣的語(yǔ)句,因此無(wú)法得到確切的復(fù)制錯(cuò)誤信息和錯(cuò)誤代碼,不能進(jìn)一步的處理 SLAVE 停止的各種情況。 - 接著,創(chuàng)建任務(wù)
CREATE EVENT IF NOT EXISTS `Slave_Monitor`ON SCHEDULE EVERY 5 SECONDON COMPLETION PRESERVEDOCALL Slave_Monitor(); 創(chuàng)建了一個(gè)任務(wù),每 5秒鐘執(zhí)行一次,任務(wù)結(jié)束后依舊保留該任務(wù),而不是刪除。當(dāng)然了,在本例中的任務(wù)不會(huì)結(jié)束,除非將它手動(dòng)禁止了。 - 如果在運(yùn)行中想要臨時(shí)關(guān)閉一下某個(gè)任務(wù),執(zhí)行 ALTER EVENT 語(yǔ)句即可: (root:localhost:)test> alter event `Slave_Monitor` ONCOMPLETION PRESERVE DISABLE;(root:localhost:)test> alter event `Slave_Monitor` ONCOMPLETION PRESERVE ENABLE;
總結(jié)
以上是生活随笔為你收集整理的MySQL Event的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows中安装zookeeper
- 下一篇: java毕业设计明德学院网站源码+lw文