Mysql事件


需求

由於公司的項目運營了四年之久,數據量龐大,有的表已經達到了幾百M,為了不影響查詢效率,需要定期把一些日志老數據刪除,公司負責人把之前的清理數據文檔發來作為參考,發現了一些比較陌生的字眼,百度一看,原來是Mysql事件。

了解

熟悉linux系統的人都知道linux的cron計划任務,能很方便地實現定期運行指定命令的功能。其實Mysql事件就和Linux的cron功能一樣,Mysql在5.1以后推出了事件調度器(Event Scheduler),能方便地實現 mysql數據庫的計划任務,而且能精確到秒。

實踐

Linux:Centos6.5,  Mysql:5.7.22

想要使用Mysql的事件功能,前提是確保服務開啟,我這里是開啟的。

MySQL [test]> show variables like 'event_scheduler'; +-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (1.76 sec)

如果沒有開啟,進入Mysql客戶端,執行以下命令開啟

SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1;

當然也可以執行以下命令關閉

SET GLOBAL event_scheduler = OFF; SET @@global.event_scheduler = OFF; SET GLOBAL event_scheduler = 0; SET @@global.event_scheduler = 0;

提醒:雖然這里用set global event_scheduler = on語句開啟了事件,但是每次重啟電腦。或重啟mysql服務后,會發現,事件自動關閉(event_scheduler=OFF),所以想讓事件一直保持開啟,最好修改配置文件,讓mysql服務啟動的時候開啟時間,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下

編輯mysql的配置文件my.cnf,在[mysqld]中添加下面一行代碼

[mysqld] event_scheduler=ON

然后重啟Mysql服務,進入Mysql客戶端執行命令查看是否開啟。確認是開啟的。

# service mysqld restart --event_scheduler=ON  //通過制定事件參數啟動

 簡單小案例測試一下

//創建user表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, `address` varchar(500) NOT NULL, `addtime` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

創建好了表之后,然后創建事件。事件類型分為兩種,一個是間隔觸發,另一個是特定事件觸發。

事件參數說明:

  • DEFINER:創建者
  • ON COMPLETION [NOT] PRESERVE :表示當事件不會再發生的情況下,刪除事件(注意特定時間執行的事件,如果設置了該參數,執行完畢后,事件將被刪除,不想刪除的話可以設置成ON COMPLETION PRESERVE);
  • ENABLE:表示系統將執行這個事件;

第一種類型:每隔一分鍾插入一條數據

//創建事件
DROP EVENT IF EXISTS `event_minute`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` EVENT `event_minute` ON SCHEDULE EVERY 1 MINUTE STARTS '2018-06-20 20:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN INSERT INTO USER(name, address,addtime) VALUES('test1','test1',now()); INSERT INTO USER(name, address,addtime) VALUES('test2','test2',now()); END ;; DELIMITER ;

經過我將近兩天的掛機測試,數據表結果,觀察數據,每一分鍾入庫一條數據。

mysql> select * from user; | 5248 | name2 | test2   | 2018-06-21 14:59:00 |
| 5249 | name1 | test1   | 2018-06-21 15:00:00 |
| 5250 | name2 | test2   | 2018-06-21 15:00:00 |
| 5251 | name1 | test1   | 2018-06-21 15:01:00 |
| 5252 | name2 | test2   | 2018-06-21 15:01:00 |
| 5253 | name1 | test1   | 2018-06-21 15:02:00 |
| 5254 | name2 | test2   | 2018-06-21 15:02:00 |
| 5255 | name1 | test1   | 2018-06-21 15:03:00 |
| 5256 | name2 | test2   | 2018-06-21 15:03:00 |
| 5257 | name1 | test1   | 2018-06-21 15:04:00 |
| 5258 | name2 | test2   | 2018-06-21 15:04:00 |
| 5259 | name1 | test1   | 2018-06-21 15:05:00 |
| 5260 | name2 | test2   | 2018-06-21 15:05:00 |
+------+-------+---------+---------------------+

第一種類型:特定時間插入一條數據,如2018-06-21 15:37:00

//新事件
DROP EVENT IF EXISTS `event_at`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` EVENT `event_at` ON SCHEDULE AT '2018-06-21 15:37:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN INSERT INTO USER(name, address,addtime) VALUES('AT','AT',now()); END ;; DELIMITER ;

查看結果

| 5317 | name1 | test1   | 2018-06-21 15:34:00 |
| 5318 | name2 | test2   | 2018-06-21 15:34:00 |
| 5319 | name1 | test1   | 2018-06-21 15:35:00 |
| 5320 | name2 | test2   | 2018-06-21 15:35:00 |
| 5321 | name1 | test1   | 2018-06-21 15:36:00 |
| 5322 | name2 | test2   | 2018-06-21 15:36:00 |
| 5323 | AT    | AT      | 2018-06-21 15:37:00 |  //--------結果
| 5324 | name1 | test1   | 2018-06-21 15:37:00 |
| 5325 | name2 | test2   | 2018-06-21 15:37:00 |
+------+-------+---------+---------------------+

公司業務需求,刪除兩個月前的老數據

 

關於更多Mysql事件的例子,看一下下面的帖子。運用在自己的項目里就可以了

https://blog.csdn.net/shaobingj126/article/details/50680216

https://blog.csdn.net/eastmount/article/details/60984798

https://www.cnblogs.com/18JG23/p/6296679.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM