mysql 事件计划区别_MySQL 计划事件
MySQL 計劃事件
簡介:在本教程中,您將了解MySQL事件調度程序以及如何創建MySQL事件以自動執行數據庫任務。
MySQL事件是基于預定義的計劃運行的任務,因此有時它被稱為計劃事件。MySQL事件也稱為“時間觸發器”,因為它是由時間觸發的,而不是像觸發器那樣的表更新。MySQL事件類似于UNIX中的cron作業或Windows中的任務調度程序。
您可以在許多情況下使用MySQL事件,例如優化數據庫表,清理日志,歸檔數據或在非高峰時間生成復雜報告。
MySQL事件調度程序配置
MySQL使用一個稱為事件調度線程的特殊線程來執行所有調度事件。您可以通過執行以下命令來查看事件調度程序線程的狀態:
SHOW PROCESSLIST;
+------+------+-----------+-----------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+------+-----------+-----------+---------+------+-------+------------------+
| 2040 | root | localhost | mysqldemo | Query | 0 | init | SHOW PROCESSLIST |
+------+------+-----------+-----------+---------+------+-------+------------------+
1 row in set (0.01 sec)
默認情況下,未啟用事件調度程序線程。要啟用和啟動事件調度程序線程,您需要執行以下命令:
SET GLOBAL event_scheduler = ON;
現在,要查看事件調度程序線程的狀態,請SHOW PROCESSLIST再次執行??命令。
SHOW PROCESSLIST;
+------+-----------------+-----------+-----------+---------+------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+-----------------+-----------+-----------+---------+------+------------------------+------------------+
| 2040 | root | localhost | mysqldemo | Query | 0 | init | SHOW PROCESSLIST |
| 2048 | event_scheduler | localhost | NULL | Daemon | 5 | Waiting on empty queue | NULL |
+------+-----------------+-----------+-----------+---------+------+------------------------+------------------+
2 rows in set (0.00 sec)
要禁用和停止事件調度程序線程的事件,請執行SET GLOBAL命令,其中event_scheduler的值為OFF:
SET GLOBAL event_scheduler = OFF;
創建新的MySQL事件
創建事件與創建其他數據庫對象(如存儲過程或觸發器)類似。事件是一個包含SQL語句的命名對象。
存儲過程只在調用時才執行; 一個觸發時與表相關聯的事件被執行,例如插入,更新,或刪除而事件可以一次或更多規則的間隔執行發生的事件。
要創建和計劃新事件,請使用以下??CREATE EVENT語句:
CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body
讓我們更詳細地研究一下這個陳述。
首先,在CREATE EVENT子句后指定事件名稱??。事件名稱在數據庫模式中必須是唯一的。
其次,你在ON SCHEDULE條款之后加上一個時間表??。如果事件是一次性事件,則使用以下語法:AT timestamp [+ INTERVAL]。如果事件是重復事件,則使用以下EVERY子句:EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL]
第三,將SQL語句放在DO關鍵字之后。請注意,您可以在事件正文中調用存儲過程。如果您有復合SQL語句,可以將它們包裝在一個??BEGIN END塊中。
讓我們看幾個創建事件的例子來理解上面的語法。
要創建和計劃將消息插入名為messages的表的新一次性事件,請執行以下步驟:
首先,使用??CREATE TABLE語句創建一個messages命名的新表,如下所示:
CREATE TABLE IF NOT EXISTS messages (
id INT PRIMARY KEY AUTO_INCREMENT,
message VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL
);
其次,使用以下CREATE EVENT語句創建事件??:
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表;?你會看到我們有1條記錄。這意味著事件在創建時執行。
SELECT * FROM messages;
+----+--------------------+---------------------+
| id | message | created_at |
+----+--------------------+---------------------+
| 1 | Test MySQL Event 1 | 2019-08-24 00:58:51 |
+----+--------------------+---------------------+
1 row in set (0.00 sec)
要顯示數據庫模式的所有事件,請使用以下語句:
SHOW EVENTS FROM mysqldemo;
mysql> SHOW EVENTS FROM mysqldemo;
Empty set (0.00 sec)
我們沒有看到任何行返回,因為事件在過期時會自動刪除。在我們的例子中,它是一次性事件,并在執行完成時過期。
要更改此行為,可以使用??ON COMPLETION PRESERVE子句。以下語句創建另一個一次性事件,事件在創建時間為1分鐘后執行,并且在執行后不會被刪除。
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分鐘,檢查消息表,添加了另一條記錄:
SELECT * FROM messages;
+----+--------------------+---------------------+
| id | message | created_at |
+----+--------------------+---------------------+
| 1 | Test MySQL Event 1 | 2019-08-24 00:58:51 |
| 2 | Test MySQL Event 2 | 2019-08-24 01:03:51 |
+----+--------------------+---------------------+
2 rows in set (0.00 sec)
如果我們再次執行 SHOW EVENTS 語句,我們會看到事件是因為ON COMPLETION PRESERVE子句的效果??:
SHOW EVENTS FROM mysqldemo;
+-----------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
| Db | Name | Definer | Time zone | Type | Execute at | Interval value | Interval field | Starts | Ends | Status | Originator | character_set_client | collation_connection | Database Collation |
+-----------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
| mysqldemo | test_event_02 | root@localhost | SYSTEM | ONE TIME | 2019-08-24 01:02:21 | NULL | NULL | NULL | NULL | DISABLED | 1 | utf8 | utf8_general_ci | utf8mb4_general_ci |
+-----------+---------------+----------------+-----------+----------+---------------------+----------------+----------------+--------+------+----------+------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
以下語句創建一個每分鐘執行一次的重復事件,并在創建時間后的1小時內過期:
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子句來定義事件的有效期。您可以通過等待幾分鐘并檢查messages表來測試此重復事件。
SELECT * FROM messages;
+----+----------------------------+---------------------+
| id | message | created_at |
+----+----------------------------+---------------------+
| 1 | Test MySQL Event 1 | 2019-08-24 00:58:51 |
| 2 | Test MySQL Event 2 | 2019-08-24 01:03:51 |
| 3 | Test MySQL recurring Event | 2019-08-24 01:06:16 |
| 4 | Test MySQL recurring Event | 2019-08-24 01:07:16 |
...
刪除MySQL事件
要刪除現有事件,請使用以下??DROP EVENT語句:
DROP EVENT [IF EXIST] event_name;
例如,要刪除??test_event_03事件,請使用以下語句:
DROP EVENT [IF EXIST] test_event_03;
在本教程中,您了解了MySQL事件,如何從數據庫模式創建和刪除事件。在下一個教程中,我們將向您展示如何更改現有事件。
總結
以上是生活随笔為你收集整理的mysql 事件计划区别_MySQL 计划事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu下使用apt安装mysql_
- 下一篇: mysql两条记录合成一条数据_踩坑记录