自MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MYSQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。

事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。

在使用这个功能之前必须确保event_scheduler已开启,可执行

SET GLOBAL event_scheduler = 1;

或我们可以在配置my.ini文件 中加上event_scheduler = 1或

SET GLOBAL event_scheduler = ON;

来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:

mysqld ... --event_scheduler=1

要查看当前是否已开启事件调度器,可执行如下SQL:

SHOW VARIABLES LIKE 'event_scheduler';

SELECT @@event_scheduler;

拥有SUPER 权限的账户执行SHOW PROCESSLIST 就可以看到这个线程了。

5.3、定时服务配置

CREATE EVENT [IF NOT EXISTS] event_name

ON 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}

5.3.1每秒插入一条记录到数据表

USE test;

CREATE TABLE aaa (timeline TIMESTAMP);

CREATE EVENT e_test_insert

ON SCHEDULE EVERY 1 SECOND

DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);

等待3秒钟后,再执行查询看看:

mysql> SELECT * FROM aaa;

+---------------------+

| timeline |

+---------------------+

| 2007-07-18 20:44:26 |

| 2007-07-18 20:44:27 |

| 2007-07-18 20:44:28 |

+---------------------+

5.3.2 5秒(天)后清空test表

CREATE EVENT e_test

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 SECOND

DO TRUNCATE TABLE test.aaa;

CREATE EVENT e_test

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

5.3.3 2008年5月23日9点39分20秒整清空test表

CREATE EVENT e_test

ON SCHEDULE AT TIMESTAMP '2008-05-23 9:39:20'

DO TRUNCATE TABLE test.aaa;

这个测试有问题。还不太明白原因。

5.3.4每天定时清空test表

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

DO TRUNCATE TABLE test.aaa;

5.3.5 5天后开启每天定时清空test表

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

这里5天也可以为0天,当时就开启清空表

5.3.6每天定时清空test表,5天后停止执行

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

该设置要求天数大于1,否则报错。而且创建不成功

5.3.7 5天后开启每天定时清空test表,一个月后停止执行

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY

ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH

DO TRUNCATE TABLE test.aaa;[ON COMPLETION [NOT] PRESERVE]

可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。

该事件会停止每隔一秒插入数据的事件,感觉这点上mysql做的还是有问题。

5.3.8每天定时清空test表(只执行一次,任务完成后就终止该事件)

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

ON COMPLETION NOT PRESERVE

DO TRUNCATE TABLE test.aaa;

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。

[COMMENT ‘comment’]可以给该事件加上注释。

5.4、定时服务日常维护测试

5.4.1修改事件(ALTER EVENT)

ALTER EVENT event_name

[ON SCHEDULE schedule]

[RENAME TO new_event_name]

[ON COMPLETION [NOT] PRESERVE]

[COMMENT 'comment']

[ENABLE | DISABLE]

[DO sql_statement]

a、临时关闭事件

ALTER EVENT e_test DISABLE;

b、开启事件

ALTER EVENT e_test ENABLE;

c、将每天清空test表改为5天清空一次:

ALTER EVENT e_test

ON SCHEDULE EVERY 5 DAY;

d、重命名事件并加上注释

alter event test.new_e_test rename to e_test comment 'e_test_cm';

5.4.2删除事件(DROP EVENT)

语法很简单,如下所示:

DROP EVENT [IF EXISTS] event_name例如删除前面创建的e_test事件

DROP EVENT e_test;当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;

5.4.3查看事件

a、查看一个event的详细信息可以用下面的视图:

SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'test_insert' AND EVENT_SCHEMA = 'test'\G;

b、简要列出所有的event:show events

语法:

SHOW EVENTS [FROM schema_name]

[LIKE 'pattern' | WHERE expr]

格式化显示所有event

SHOW EVENTS\G

格式化显示test用户的event

show events FROM test;

c、查看event的创建信息

SHOW CREATE EVENT event_name

show create event test.e_test\G

5.5、结论

该特性确实非常有用,可作为定时清空数据表、监控主从服务器、汇总数据到另一张表等等,并且可以精确到每秒,实时性也可以得到保障。

不过如果当两个事件的针对相同的对象的时候,会出现冲突,这种情况还不明确是我理解的问题还是确实是这样,比如每秒插入和定时删除就会冲突。除了调度SQL语句之外,MYSQL的调度器也可以调度存储过程。

5.6、缺点

SELECT * FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME = 'test_insert' AND EVENT_SCHEMA = 'troaudit_db'\G;

*************************** 1. row ***************************

EVENT_CATALOG: NULL

EVENT_SCHEMA: troaudit_db

EVENT_NAME: event_session_table

DEFINER: egilance@%

TIME_ZONE: SYSTEM

EVENT_BODY: SQL

EVENT_DEFINITION: BEGIN

CALL create_table_process;

END

EVENT_TYPE: RECURRING

EXECUTE_AT: NULL

INTERVAL_VALUE: 1800

INTERVAL_FIELD: SECOND

SQL_MODE:

STARTS: 2011-08-23 10:51:28

ENDS: NULL

STATUS: ENABLED

ON_COMPLETION: PRESERVE

CREATED: 2011-08-23 10:51:28

LAST_ALTERED: 2011-08-23 10:51:28

LAST_EXECUTED: 2011-08-23 17:55:51

EVENT_COMMENT:

ORIGINATOR: 0

CHARACTER_SET_CLIENT: utf8

COLLATION_CONNECTION: utf8_general_ci

DATABASE_COLLATION: utf8_unicode_ci

1 row in set (0.00 sec)

MySQL只会记录最后一次调度的时间,如果时间往前调整,小于最近执行的时间,则不会执行事件调度。

示例:

CREATE  EVENT real_data_statistics_job

ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(),INTERVAL 1 DAY),INTERVAL 1 MINUTE)

ON COMPLETION PRESERVE ENABLE

DO

CALL p_statistics_weather_data();

ALTER EVENT real_data_statistics_job ON

COMPLETION PRESERVE ENABLE;

总结:

仅有两种方式:1、AT方式,只执行1次,如:AT TIMESTAMP '2008-05-23 9:39:20' 或者 AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR。

2、EVERY方式,可以执行多次,STARTS和ENDS可选,均是指时间点,指任务什么时间开始执行和任务什么时间结束执行,EVERY是周期的意思,每隔多长时间执行一次。如:EVERY 1 DAY或者EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY或者SCHEDULE EVERY 1 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY或者 EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH。

mysql 5.5 查看事件_MySQL5.5如何事件调度相关推荐

  1. mysql查看执行计划任务_MySQL_MySQL计划任务(事件调度器) Event Scheduler介绍,要查看当前是否已开启事件调 - phpStudy...

    MySQL计划任务(事件调度器) Event Scheduler介绍 要查看当前是否已开启事件调度器,可执行如下SQL: SHOW VARIABLES LIKE 'event_scheduler'; ...

  2. rsyslog概要以及源码安装mysql,rsyslog输出到Mysql基于loganalyzer查看分析

    Rsyslog:syslog的加强版本 日志对于系统中程序和服务的运行起着很大的作用,我们经常需要去看日志记录来查看各种信息,有用户登录信息,有网页访问信息,有系统故障信息,等等.. 日志通常有日志级 ...

  3. mysql事件创建_mysql 创建事件

    mysql 事件说明: 创建事件CREATE EVENT 的语法如下: CREATE EVENT [IF NOT EXISTS] ----------------------------------- ...

  4. 阿里云mysql事件启动_mysql 启动事件-阿里云开发者社区

    事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里. ...

  5. oracle数据库查看等待,Oracle常见等待事件说明(三)-enqueue/free buffer waits

    排队是应用于数据库对象.重做线程.后台工作的锁,用来控制多个并发会话在锁模式相容/不相容时如何共享相同的资源.排队是事务的,由应用程序初始化. 事件参数(9i环境,10g中参数二.三有所变化) 事件编 ...

  6. 关于MySQL相关的查看显示信息:

    关于MySQL相关的查看显示信息: 数据库范围: 一.查看所有的数据库:(仅仅是看数据库数量与名字) mysql> show databases; 二.查看某个数据库的创建信息:(主要看数据库的 ...

  7. mysql 5.5 slave 配置_mysql5.5 master-slave(Replication)配置方法

    一主一从: master: os:centos release 5.6 db:mysql 5.5.8 ip:192.168.1.2 slave: os:centos release 5.6 db:my ...

  8. mysql 5.7 数据库备份_MySQL5.7.20数据库备份与恢复

    MySQL数据库备份与恢复 · ####造成数据丢失的原因#### 程序错误 人为操作错误 运算错误 磁盘故障 灾难(如火灾.地震)和盗窃 · ####物理与逻辑的角度#### 1.物理备份: 冷备份 ...

  9. mysql中怎样查看和删除唯一索引

    mysql中怎样查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果例如以下: 查询到唯一索引后,怎样删除唯一索引呢,使用例如以下 ...

最新文章

  1. Javascript标准DOM Range操作
  2. Android 教程
  3. (仿头条APP项目)6.点击过的新闻列表文字变灰和下拉刷新与滚动加载新闻数据
  4. ACM MM18 | 用于跨模态检索的综合距离保持自编码器
  5. 设计模式在Netty 中的应用-单例模式源码举例
  6. 线性表之链式存储结构_单链表相关算法
  7. 零基础也可现学苹果Swift语言?太傻太天真
  8. 【bzoj5110】[CodePlus2017]Yazid 的新生舞会 Treap
  9. java学生考勤代码免费,基于jsp的学生考勤管理-JavaEE实现学生考勤管理 - java项目源码...
  10. 【概率论】5-9:多项式分布(The Multinomial Distributions)
  11. 极客大学架构师训练营 秒杀 搜索引擎 爬虫 Lucene Elastic Search 第18课 听课总结
  12. win10系统托盘图标不见了_win10托盘图标不显示怎么回事_win10任务栏托盘图标显示不完全如何修复...
  13. 基于Salt Event系统构建Master端returner
  14. 【一文搞懂】FD_SET的使用
  15. Cloudflare Radar 2021 年回顾
  16. 漫画程序猿惯用口头禅
  17. 阿里云无影云桌面服务关联角色设置及删除方法
  18. 网络工程师2017上半年软考上午试题
  19. 生成服务器证书 启用HTTPS 生成自签名证书
  20. 基于RabbitMq的削峰实例

热门文章

  1. Python 异或运算
  2. 排序算法的稳定性判断原则及其意义
  3. Python 爬取公众号文章链接并生成html
  4. 单例设计模式中三重检索
  5. k8s_deployment 以及灰度发布、滚动发布和蓝绿发布的零散笔记
  6. SSM框架在线考试网站-在线考试系统(idea开发javaweb-javaee-j2ee-springboot)自动交卷-倒计时
  7. node.js使用multiparty上传文件
  8. HTML显示相机图像
  9. python获取标签属性值_Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
  10. Nginx一把梭完:防盗链、动静分离、高可用、压缩、跨域、缓存等