设为首页 收藏本站
查看: 637|回复: 0

[经验分享] MySQL数据库高级(八)——事件

[复制链接]

尚未签到

发表于 2018-9-27 06:30:04 | 显示全部楼层 |阅读模式
MySQL数据库高级(八)——事件

一、事件简介

1、事件简介
  事件是用来执行定时任务的一组SQL集,在时间到时会触发。
  一个事件可调用一次,也可周期性的启动,由一个特定的事件调度器线程来管理的。
  事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

2、事件的优点
  A、对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
  B、可以实现每秒钟执行一个任务,在一些对实时性要求较高的环境下非常实用。

3、事件的缺点
  定时触发,不可以调用。

4、事件的适用场景
  对于每隔一段时间就有固定需求的操作,如创建表,删除数据等操作,可以使用event来处理。

二、事件的操作

1、事件的创建
  

CREATE  
[DEFINER = { user | CURRENT_USER }]
  
EVENT [IF NOT EXISTS] event_name
  
ON SCHEDULE schedule
  
[ON COMPLETION [NOT] PRESERVE]
  
[ENABLE | DISABLE | DISABLE ON SLAVE]
  
[COMMENT 'comment']
  
DO event_body;
  

  event_name :事件名,不能超64个字符,名字必须是当前Dateabase中唯一的,同一个数据库不能有同名的event。创建事件时,可以同时指定Schema,语法结构为:schema_name.eventname。使用event常见的工作是创建表、插入数据、删除数据、清空表、删除表。为了规范事件命名,事件名称需具备描述整个事件的能力。建议命名规则如下:动作名称(INTO/FROM_)表名_TIME,如每天插入表中记录事件命名,insert_into_tablename_day。
  ON SCHEDULE schedule:计划任务
  schedule:调度规则,规定事件的执行时间与执行规则。决定event的执行时间和频率(时间必须是将来的时间,过去的时间会出错),有AT和EVERY两种形式。
  语法结构如下:
  schedule:
  AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...]
  interval:
  quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
  AT timestamp,用来完成单次的计划任务。
  EVERY n quantity [STARTS timestamp] [ENDS timestamp],用来完成重复的计划任务。
  时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。
  在重复的计划任务中,时间(单位)的数量可以是任意非空(Not Null)的整数式,时间单位是关键词:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
  AT timestamp一般用于只执行一次,一般可以使用当前时间加上延后的一段时间,例如:AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR;也可以定义一个时间常量,例如:AT '2006-02-10 23:59:00';EVERY interval一般用于周期性执行,可以设定开始时间和结束时间。
  ON COMPLETION [NOT] PRESERVE:事件到期后的操作,默认事件到期后会自动删除。如果想保留事件使用ON COMPLETION PRESERVE;如果不想保留事件,可以设置ON COMPLETION NOT PRESERVE。
  [ENABLE | DISABLE]:参数Enable和Disable表示设定事件的状态。Enable表示系统将执行事件,Disable表示系统不执行事件。
  [COMMENT 'comment']:增加注释,注释会出现在元数据中,存储在information_schema表的COMMENT列,最大长度为64个字节。'comment'表示将注释内容放在单引号之间,建议使用注释以表达更全面的信息。
  event_body:事件体,可以是单行SQL语法,或是BEGIN……END语句块,或是存储过程。

2、事件调度器的开启
  MySQL默认关闭事件调度器。
  查看事件调度器信息
  

show global variables like '%event_scheduler%';  
SHOW PROCESSLIST;
  

  开启事件调度器
  set global event_scheduler=ON;
  在MySQL的my.cnf配置文件中修改。
  event_scheduler = 1 #或者ON  

3、事件的查看
  

SELECT * FROM mysql.event;  SHOW EVENTS;
  SELECT * FROM information_schema.events;
  

4、删除事件
  DROP EVENT [IF EXISTS] eventname;

5、禁用事件
  ALTER EVENT eventname DSIABLE;

6、开启事件
  ALTER EVENT eventname ENABLE;

7、事件的修改
  

ALTER  
    [DEFINER = { user | CURRENT_USER }]
  
    EVENT event_name
  
    [ON SCHEDULE schedule]
  
    [ON COMPLETION [NOT] PRESERVE]
  
    [RENAME TO new_event_name]
  
    [ENABLE | DISABLE | DISABLE ON SLAVE]
  
    [COMMENT 'comment']
  
    [DO event_body]
  

三、事件实例

1、每隔一定时间插入一次记录
  创建一个表
  CREATE TABLE event_table(timeline TIMESTAMP);
  创建一个事件,每隔1秒插入一条记录
  

CREATE EVENT insert_into_event_table_second  
ON SCHEDULE EVERY 1 SECOND
  
DO INSERT INTO schoolDB.event_table VALUES(CURRENT_TIMESTAMP);
  

  过一定时间查看插入记录
  select * from event_table;
  停止事件
  alter event insert_into_event_table_second disable;
  删除事件
  drop event insert_into_event_table_second;

2、特定时间插入一条记录
  创建一个事件在特定时间插入一条记录
  

CREATE EVENT insert_into_event_table_time  
ON SCHEDULE AT TIMESTAMP '2018-04-11 21:27:30'
  
DO INSERT INTO schoolDB.event_table values(CURRENT_TIMESTAMP);
  

  在特定时间后查看插入记录,已经插入记录
  select * from event_table;

3、特定时间清空表
  创建一个事件,特定时间清空表,事件执行完后保留事件
  

CREATE EVENT truncate_event_table_time  
ON SCHEDULE AT TIMESTAMP '2018-04-11 21:35:00'
  
ON COMPLETION PRESERVE
  
DO TRUNCATE TABLE schoolDB.event_table;
  

  时间过后查询表的内容,已经清空
  select * from event_table;

4、某个事件段内定时清空表
  创建一个事件,5天后开启,每天定时清空表,一个月后停止执行
  

CREATE EVENT truncate_event_table_day  
ON SCHEDULE EVERY 1 DAY
  
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
  
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH
  
ON COMPLETION PRESERVE
  
DO TRUNCATE TABLE schoolDB.event_table;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-602475-1-1.html 上篇帖子: mysql-mmm-2.2.1安装手册 下篇帖子: mysql master-slave读写分离
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表