一、前言

自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得 一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精 确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
在使用这个功能之前必须确保event_scheduler已开启,可执行
<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>
来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:
<span style="font-size: 12px;">mysqld ... --event_scheduler=1</span>
要查看当前是否已开启事件调度器,可执行如下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>

二、创建事件(CREATE EVENT)

先来看一下它的语法:
<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) 首先来看一个简单的例子来演示每秒插入一条记录到数据表
<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秒钟后,再执行查询看看:
<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点整清空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) 每天定时清空test表:
<span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYDO TRUNCATE TABLE test.aaa;</span>

5) 5天后开启每天定时清空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) 每天定时清空test表,5天后停止执行:
<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天后开启每天定时清空test表,一个月后停止执行:
<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]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):
<span style="font-size: 12px;">CREATE EVENT e_testON SCHEDULE EVERY 1 DAYON COMPLETION NOT PRESERVEDO TRUNCATE TABLE test.aaa;</span>

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为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) 临时关闭事件
<span style="font-size: 12px;">ALTER EVENT e_test DISABLE;</span>

2) 开启事件
<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)

语法很简单,如下所示:
<span style="font-size: 12px;">DROP EVENT [IF EXISTS] event_name</span>

例如删除前面创建的e_test事件
<span style="font-size: 12px;">DROP EVENT e_test;</span>

当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS
<span style="font-size: 12px;">DROP EVENT IF EXISTS e_test;
注意:如果你将event执行了Alter event event_name disable.那么当你重新启动mysql服务
器后,该event将被删除(测试版本:5.1.30)</span>

应用案例

本案例是利用 event scheduler 的特性,每秒钟调用一次存储过程,用于判断 SLAVE 是否正常运行,如果发现 SLAVE 关闭了,忽略 0 次错误,然后重新启动 SLAVE。
  • 首先创建存储过程

    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 ;    
    由于存储过程中无法调用类似 SHOW SLAVE STATUS 这样的语句,因此无法得到确切的复制错误信息和错误代码,不能进一步的处理 SLAVE 停止的各种情况。
  • 接着,创建任务
    CREATE EVENT IF NOT EXISTS `Slave_Monitor`ON SCHEDULE EVERY 5 SECONDON COMPLETION PRESERVEDOCALL Slave_Monitor();
    创建了一个任务,每 5秒钟执行一次,任务结束后依旧保留该任务,而不是删除。当然了,在本例中的任务不会结束,除非将它手动禁止了。
  • 如果在运行中想要临时关闭一下某个任务,执行 ALTER EVENT 语句即可:
        (root:localhost:)test> alter event `Slave_Monitor` ONCOMPLETION PRESERVE DISABLE;(root:localhost:)test> alter event `Slave_Monitor` ONCOMPLETION PRESERVE ENABLE;

MySQL Event相关推荐

  1. Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

    /usr/local/mysql/bin/mysqldump -uroot -pxxxxx --all-databases > all.sql mysql用mysqldump导出数据库时提示&q ...

  2. mysql event scheduler机制 与 动态表名创建

    mysql event scheduler机制 与 动态表名创建 今天有一个需求,需要定时在mysql创建表与删除表,以及根据日期命名表名.诚然,通过外部程序很容易实现与控制这一切. 但是需要额外的服 ...

  3. mysql event执行记录_mysql event建立模板(可记录执行履历)

    建立履历记录表 CREATE TABLE `mysql`.`t_event_history` ( `dbname` VARCHAR(128) NOT NULL DEFAULT '', `eventna ...

  4. mysql维护计划任务_浅谈MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  5. mysql event 变量_mysql 中event的用法

    二.适用范围对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理. 例如:使用event在每月的1日凌晨1点自动创建下个月需要使用的三张表. 三.使用权限 开启eve ...

  6. mysql 计划任务消耗_浅谈MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  7. mysql event 同步,MySQL Event Scheduler(事件调度器)

    这篇文章主要为大家详细介绍了MySQL Event Scheduler(事件调度器),具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编小韵来看看吧!一.概述 事件调 ...

  8. mysql event 学习

    mysql 通过事件可以实现定时任务 : 1. 检查你的MYSQL是否开了这个功能 show variables like "%scheduler" //注意 最后是er 2.   ...

  9. 【Mysql】MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

最新文章

  1. 布隆过滤器 redis_使用基于 Redis 的 Java 布隆过滤器
  2. 宁‘内卷‘,勿‘躺平‘
  3. 比特币要升级成为“比特币现金”
  4. 图解SqlServer更改sa密码
  5. 21.3.3 原子性与易变性 21.3.4 原子类
  6. windows mac 安装lua
  7. Stanford CS230深度学习(四)TensorFlow2.1
  8. 软件度量都该度个啥?
  9. delphi 剪切板变量_delphi读写剪贴板
  10. hkust ucl 电子工程比较_通信工程专业
  11. 安卓模拟器所有版本系统xp框架安装方法(万能)
  12. 版本管理工具之ClearCase
  13. 打开计算机文件反应慢怎么解决方法,电脑反应慢怎么解决
  14. gsm在linux下工作原理,GSM模块详解 从工作原理到应用案例
  15. svc预测概率_sklearn-SVC实现与类参数
  16. Java8 新特性 (五)Stream API
  17. Python相关文章索引(13)
  18. php pack ode,Python中的数值ODE求解
  19. mysql汉字转拼音首字母_MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)...
  20. linux动态链接库全局变量共享问题DLL共享数据段

热门文章

  1. oracle中区间大小,Oracle的逻辑结构(表空间、段、区间、块)——总结
  2. c语言从入门到精通第四版电子书_C语言从入门到精通(吐血分享)4.pdf
  3. Python中的高级数据结构
  4. 两种常见挂载Jenkins slave节点的方法
  5. 频繁项集-------产生强关联规则的过程
  6. [SPOJ DQUERY] D-query(树状数组,离线)
  7. Delphi:ADOConnection连接SQLServer自动断网问题解决
  8. Weblogic EJB 学习笔记(3)精
  9. w3ctech 2011 北京站(组图)
  10. 计算机考研新大纲,2020考研计算机新大纲考情分析