主頁(yè) > 知識(shí)庫(kù) > mysql的計(jì)劃任務(wù)與事件調(diào)度實(shí)例分析

mysql的計(jì)劃任務(wù)與事件調(diào)度實(shí)例分析

熱門(mén)標(biāo)簽:巫師三血與酒地圖標(biāo)注 在哪里申請(qǐng)400電話 400電話申請(qǐng)信用卡 銷(xiāo)售語(yǔ)音電話機(jī)器人 外呼系統(tǒng)電銷(xiāo)受騙 萊西市地圖標(biāo)注 走過(guò)哪個(gè)省地圖標(biāo)注 安徽ai電話電銷(xiāo)機(jī)器人有效果嗎 常州網(wǎng)絡(luò)外呼系統(tǒng)開(kāi)發(fā)

本文實(shí)例講述了mysql的計(jì)劃任務(wù)與事件調(diào)度。分享給大家供大家參考,具體如下:

mysql事件是基于預(yù)定義的時(shí)間表運(yùn)行的任務(wù),因此有時(shí)它被稱(chēng)為預(yù)定事件。mysql事件也被稱(chēng)為“時(shí)間觸發(fā)”,因?yàn)樗怯蓵r(shí)間觸發(fā)的,而不是像觸發(fā)器一樣更新表來(lái)觸發(fā)的。mysql事件類(lèi)似于UNIX中的cron作業(yè)或Windows中的任務(wù)調(diào)度程序。我們可以在優(yōu)化數(shù)據(jù)庫(kù)表,清理日志,歸檔數(shù)據(jù)或在非高峰時(shí)間生成復(fù)雜的報(bào)告的時(shí)候使用mysql事件。

mysql使用一個(gè)名為事件調(diào)度線程的特殊線程來(lái)執(zhí)行所有調(diào)度的事件。我們可以通過(guò)執(zhí)行以下命令來(lái)查看事件調(diào)度程序線程的狀態(tài):

SHOW PROCESSLIST;

執(zhí)行上面查詢語(yǔ)句,得到以下結(jié)果:

mysql> SHOW PROCESSLIST;
+----+------+-----------------+----------+---------+------+----------+------------------+
| Id | User | Host      | db    | Command | Time | State  | Info       |
+----+------+-----------------+----------+---------+------+----------+------------------+
| 2 | root | localhost:50405 | NULL   | Sleep  | 1966 |     | NULL       |
| 3 | root | localhost:50406 | yiibaidb | Sleep  | 1964 |     | NULL       |
| 4 | root | localhost:50407 | yiibaidb | Query  |  0 | starting | SHOW PROCESSLIST |
+----+------+-----------------+----------+---------+------+----------+------------------+
3 rows in set

默認(rèn)情況下,事件調(diào)度程序線程未啟用。 要啟用和啟動(dòng)事件調(diào)度程序線程,需要執(zhí)行以下命令:

SET GLOBAL event_scheduler = ON;

現(xiàn)在看到事件調(diào)度器線程的狀態(tài),再次執(zhí)行SHOW PROCESSLIST命令,結(jié)果如下所示:

mysql> SHOW PROCESSLIST;
+----+-----------------+-----------------+----------+---------+------+------------------------+------------------+
| Id | User      | Host      | db    | Command | Time | State         | Info       |
+----+-----------------+-----------------+----------+---------+------+------------------------+------------------+
| 2 | root      | localhost:50405 | NULL   | Sleep  | 1986 |            | NULL       |
| 3 | root      | localhost:50406 | luyaran | Sleep  | 1984 |            | NULL       |
| 4 | root      | localhost:50407 | luyaran | Query  |  0 | starting        | SHOW PROCESSLIST |
| 5 | event_scheduler | localhost    | NULL   | Daemon |  6 | Waiting on empty queue | NULL       |
+----+-----------------+-----------------+----------+---------+------+------------------------+------------------+
4 rows in set

要禁用并停止事件調(diào)度程序線程,可通過(guò)執(zhí)行SET GLOBAL命令將event_scheduler其值設(shè)置為OFF :

SET GLOBAL event_scheduler = OFF;

我們知道,事件是一個(gè)包含SQL語(yǔ)句的命名對(duì)象,創(chuàng)建事件與創(chuàng)建其他數(shù)據(jù)庫(kù)對(duì)象(如存儲(chǔ)過(guò)程或觸發(fā)器)類(lèi)似,然而,存儲(chǔ)過(guò)程僅在直接調(diào)用時(shí)執(zhí)行; 觸發(fā)器則與一個(gè)表相關(guān)聯(lián)的事件(例如插入,更新或刪除)事件發(fā)生時(shí),可以在一次或更多的規(guī)則間隔執(zhí)行事件時(shí)執(zhí)行觸發(fā)。那么,事件呢?我們接下來(lái)就嘗試使用CREATE EVENT語(yǔ)句,來(lái)創(chuàng)建事件,下面先來(lái)看下語(yǔ)法結(jié)構(gòu):

CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body

我們來(lái)詳細(xì)看下上述sql中的參數(shù)的含義:

首先,在CREATE EVENT子句之后指定事件名稱(chēng)。事件名稱(chēng)在數(shù)據(jù)庫(kù)模式中必須是唯一的。

其次,在ON SCHEDULE子句后面加上一個(gè)表。如果事件是一次性事件,則使用語(yǔ)法:AT timestamp [+ INTERVAL],如果事件是循環(huán)事件,則使用EVERY子句:EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL]

第三,將DO語(yǔ)句放在DO關(guān)鍵字之后。請(qǐng)注意,可以在事件主體內(nèi)調(diào)用存儲(chǔ)過(guò)程。 如果您有復(fù)合SQL語(yǔ)句,可以將它們放在BEGIN END塊中。

我們先來(lái)創(chuàng)建一個(gè)messages表來(lái)做演示:

CREATE TABLE IF NOT EXISTS messages (
  id INT PRIMARY KEY AUTO_INCREMENT,
  message VARCHAR(255) NOT NULL,
  created_at DATETIME NOT NULL
);

完事我們來(lái)使用CREATE EVENT語(yǔ)句創(chuàng)建一個(gè)事件:

CREATE EVENT IF NOT EXISTS test_event_01
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
 INSERT INTO messages(message,created_at)
 VALUES('Test MySQL Event 1',NOW());

檢查messages表; 會(huì)看到有1條記錄,這意味著事件在創(chuàng)建時(shí)被執(zhí)行:

mysql> SELECT * FROM messages;
+----+--------------------+---------------------+
| id | message      | created_at     |
+----+--------------------+---------------------+
| 1 | Test MySQL Event 1 | 2017-08-03 04:23:11 |
+----+--------------------+---------------------+
1 row in set

要顯示數(shù)據(jù)庫(kù)(testdb)的所有事件,請(qǐng)使用以下語(yǔ)句:

SHOW EVENTS FROM testdb;

執(zhí)行上面查詢看不到任何行返回,因?yàn)槭录诘狡跁r(shí)自動(dòng)刪除。 在我們的示例中,它是一次性的事件,在執(zhí)行完成時(shí)就過(guò)期了。要更改此行為,可以使用ON COMPLETION PRESERVE子句。以下語(yǔ)句創(chuàng)建另一個(gè)一次性事件,在其創(chuàng)建時(shí)間1分鐘后執(zhí)行,執(zhí)行后不會(huì)被刪除:

CREATE EVENT test_event_02
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
  INSERT INTO messages(message,created_at)
  VALUES('Test MySQL Event 2',NOW());

等待1分鐘后,查看messages表,添加了另一條記錄:

mysql> SELECT * FROM messages;
+----+--------------------+---------------------+
| id | message      | created_at     |
+----+--------------------+---------------------+
| 1 | Test MySQL Event 1 | 2017-08-03 04:23:11 |
| 2 | Test MySQL Event 2 | 2017-08-03 04:24:48 |
+----+--------------------+---------------------+
2 rows in set

如果再次執(zhí)行SHOW EVENTS語(yǔ)句,看到事件是由于ON COMPLETION PRESERVE子句的影響:

mysql> SHOW EVENTS FROM testdb;
+--------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
| Db   | Name     | Definer    | Time zone | Type   | Execute at     | Interval value | Interval field | Starts | Ends | Status  | Originator | character_set_client | collation_connection | Database Collation |
+--------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
| testdb | test_event_02 | root@localhost | SYSTEM  | ONE TIME | 2017-08-03 04:24:48 | NULL      | NULL      | NULL  | NULL | DISABLED |     0 | utf8         | utf8_general_ci   | utf8_general_ci  |
+--------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
1 row in set

我們?cè)賮?lái)創(chuàng)建一個(gè)循環(huán)的事件,每分鐘執(zhí)行一次,并在其創(chuàng)建時(shí)間的1小時(shí)內(nèi)過(guò)期:

CREATE EVENT test_event_03
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
  INSERT INTO messages(message,created_at)
  VALUES('Test MySQL recurring Event',NOW());

我們要注意,我們使用STARTS和ENDS子句定義事件的有效期。等待個(gè)3,5分鐘后再查看messages表數(shù)據(jù),以測(cè)試驗(yàn)證此循環(huán)事件的執(zhí)行:

mysql> SELECT * FROM messages;
+----+----------------------------+---------------------+
| id | message          | created_at     |
+----+----------------------------+---------------------+
| 1 | Test MySQL Event 1     | 2017-08-03 04:23:11 |
| 2 | Test MySQL Event 2     | 2017-08-03 04:24:48 |
| 3 | Test MySQL recurring Event | 2017-08-03 04:25:20 |
| 4 | Test MySQL recurring Event | 2017-08-03 04:26:20 |
| 5 | Test MySQL recurring Event | 2017-08-03 04:27:20 |
+----+----------------------------+---------------------+
5 rows in set

完事我們可以使用DROP EVENT語(yǔ)句來(lái)刪除事件,看下語(yǔ)法結(jié)構(gòu):

DROP EVENT [IF EXISTS] event_name;

要?jiǎng)h除test_event_03的事件,我們可以使用如下sql:

DROP EVENT IF EXISTS test_event_03;

好啦,本次記錄就到這里了。

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《MySQL索引操作技巧匯總》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過(guò)程技巧大全》及《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》

希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。

您可能感興趣的文章:
  • MySQL計(jì)劃任務(wù)(事件調(diào)度器) Event Scheduler介紹
  • MySQL定時(shí)任務(wù)(EVENT事件)如何配置詳解
  • 帶你了解MySQL中的事件調(diào)度器EVENT
  • mysql事件之修改事件(ALTER EVENT)、禁用事件(DISABLE)、啟用事件(ENABLE)、事件重命名及數(shù)據(jù)庫(kù)事件遷移操作詳解
  • mysql定時(shí)任務(wù)(event事件)實(shí)現(xiàn)詳解
  • 老生常談mysql event事件調(diào)度器(必看篇)
  • MySQL binlog中的事件類(lèi)型詳解
  • 詳解MySQL用事件調(diào)度器Event Scheduler創(chuàng)建定時(shí)任務(wù)
  • 逐步講解MySQL中定時(shí)事件計(jì)劃的創(chuàng)建
  • MySQL的事件調(diào)度器使用介紹
  • mysql事件的開(kāi)啟和調(diào)用
  • MySQL 使用事件(Events)完成計(jì)劃任務(wù)

標(biāo)簽:果洛 鞍山 河北 來(lái)賓 黃石 赤峰 陽(yáng)江 煙臺(tái)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql的計(jì)劃任務(wù)與事件調(diào)度實(shí)例分析》,本文關(guān)鍵詞  mysql,的,計(jì)劃,任務(wù),與,事件,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《mysql的計(jì)劃任務(wù)與事件調(diào)度實(shí)例分析》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于mysql的計(jì)劃任務(wù)與事件調(diào)度實(shí)例分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章