超详细的MySQL数据库事件

您所在的位置:网站首页 数据库定时器 超详细的MySQL数据库事件

超详细的MySQL数据库事件

#超详细的MySQL数据库事件| 来源: 网络整理| 查看: 265

概述

之前头条由于没有分类了,不做维护了,所以会把一些偏汇总的文章迁移到CSDN上。 这里也简单总结一下mysql如何用事件来实现定时任务。

一、事件概述

在MySQL 5.1中新增了一个特色功能事件调度器(Event Scheduler),简称事件。 事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。

事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据调度事件来启动的。由于他们彼此相似,所以事件也称为临时性触发器。事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。

二、事件的优缺点 1、优点

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

2、缺点

定时触发,不可以调用。

三、事件调度器参数

事件由一个特定的线程来管理。启用事件调度器后,拥有SUPER权限的账户执行SHOW PROCESSLIST就可以看到这个线程了。

--查看事件是否开启。 SHOW VARIABLES LIKE 'event_scheduler'; SELECT @@event_scheduler; --全局开启事件调度器 SET GLOBAL event_scheduler = ON; --全局关闭事件调度器 SET GLOBAL event_scheduler = OFF; --永久开启事件调度器(在my.cnf配置文件中添加) #事件调度器启动状态 event_scheduler = on 四、创建事件

一条create event语句创建一个事件。每个事件由两个主要部分组成,第一部分是事件调度(eventschedule,表示事件何时启动以及按什么频率启动; 第二部分是事件动作(event action),这是事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单地insert或者update语句,也可以使一个存储过程或者 benin…end语句块,这两种情况允许我们执行多条SQL。 一个事件可以是活动(打开)的或停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次。 相关语法:

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

说明: 在这里插入图片描述 ps: 一些常用的时间间隔设置:

--每隔5秒钟执行 ON SCHEDULE EVERY 5 SECOND --每隔1分钟执行 ON SCHEDULE EVERY 1 MINUTE --每天凌晨1点执行 ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR) --每个月的第一天凌晨1点执行 ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR) --每 3 个月,从现在起一周后开始 ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK --每十二个小时,从现在起三十分钟后开始,并于现在起四个星期后结束 ON SCHEDULE EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK 五、事件(定时任务)管理 1、查询事件

在MySQL中可以通过查询information_schema.events表,查看已创建的事件。

--查看当前所在库的事件 show events; --查看所有事件 SELECT * FROM information_schema.events; 2、修改事件

事件被创建之后,还可以使用ALTER EVENT语句修改其定义和相关属性

ALTER [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; 3、启动与关闭事件

ALTER EVENT语句可以让一个事件关闭或再次活动。

--启动事件。 ALTER EVENT event_name ENABLE; --关闭事件。 ALTER EVENT event_name DISABLE; 4、删除事件

删除已经创建的事件可以使用DROP EVENT语句来实现。

DROP EVENT IF EXISTS event_name; 六、实例演示 1、事件+sql

创建名称为event_t1的事件,用于每隔5秒钟向数据表t1(用户信息表)中插入一条数据。

-- 创建用户信息表 CREATE TABLE IF NOT EXISTS t1 ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号', name VARCHAR(30) NOT NULL COMMENT '用户姓名', create_time TIMESTAMP COMMENT '创建时间' ) COMMENT = '用户信息表'; -- 创建事件 CREATE EVENT IF NOT EXISTS event_t1 ON SCHEDULE EVERY 5 SECOND ON COMPLETION PRESERVE COMMENT '新增用户信息定时任务' DO INSERT INTO t1(name,create_time) VALUES('hwb',NOW()); 2、事件+存储过程 --创建总表 CREATE TABLE IF NOT EXISTS t_total ( userNumber INT COMMENT '用户数', createtime TIMESTAMP COMMENT '创建时间' ) COMMENT = '总表'; --创建名称为t_total的存储过程,用于统计前面表插入的数量 CREATE PROCEDURE t_total() BEGIN DECLARE n_total INT default 0; SELECT COUNT(*) INTO n_total FROM t1; INSERT INTO t_total (userNumber,createtime) VALUES(n_total,NOW()); END; --创建名称为event_total的事件,用于在每天12点调用存储过程。 CREATE EVENT IF NOT EXISTS event_total ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 12 HOUR) ON COMPLETION PRESERVE ENABLE DO CALL t_total();


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3