mysql启动时自动启动event事件
分别有liunx,js,php 现在学习一个mysql的定时执行-event事件:
前言:
自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的
查看event是否开启
1
2
3
4
5
|
SHOW VARIABLES LIKE ‘event%’; SELECT @@event_scheduler; SHOW PROCESSLIST; |
如果看到event_scheduler为on或者PROCESSLIST中显示有event_scheduler的信息说明就已经开启了事件。如果显示为off或者在PROCESSLIST中查看不到event_scheduler的信息,那么就说明事件没有开启,我们需要开启它。
开启event_scheduler
- 临时开启(mysql服务重启后之后失效)
1
2
3
4
5
6
7
|
SET GLOBAL event_scheduler = ON ; SET @@ global .event_scheduler = ON ; SET GLOBAL event_scheduler = 1; — 0代表关闭 SET @@ global .event_scheduler = 1; |
永久开启
在my.cnf中的[mysqld]部分添加如下内容,然后重启mysql(mysql重启命令:service mysqld restart)
- 编译的时候开启
mysqld … –event_scheduler=ON
Mysql事件的语法简介
创建定时任务(CREATE EVENT)
1
2
3
4
5
|
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} |
参数详细说明:
DEFINER: 定义事件执行的时候检查权限的用户。
ON SCHEDULE schedule: 定义执行的时间和时间间隔。
ON COMPLETION [NOT] PRESERVE: 定义事件是一次执行还是永久执行,默认为一次执行,即NOT PRESERVE。
AT 表示指定一个时间只执行一次。
EVERY 周期性计划,可指定计划开始时间 STARTS 和结束时间 ENDS,执行具体时间周期可以为:YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND。
COMPLETION 计划任务完毕后,该计划任务对象是否还在数据库中保留。默认不保留
ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。
COMMENT ‘comment’: 定义事件的注释。
修改计划任务(ALTER EVENT)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
ALTER EVENT [DEFINER = { user | CURRENT_USER }] #更改缺省用户 event_name [ ON SCHEDULE schedule] #更改调度时间 [RENAME TO new_event_name] #计划任务改名 [ ON COMPLETION [ NOT ] PRESERVE] #更改一次运行结束后的行为 [ENABLE | DISABLE | SLAVESIDE_DISABLED] #更改计划任务状态 [COMMENT 'comment' ] #修改注释 [DO sql_statement] #修改计划执行体 |
临时关闭事件
ALTER EVENT test_event DISABLE;
开启事件
ALTER EVENT test_event ENABLE;
删除计划任务(DROP EVENT)
DROP EVENT [IF EXISTS] event_name
如果产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS
实战演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Create Table : CREATE TABLE `test` ( //测试表 ` time ` varchar (20) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 1 row in set (0.00 sec) //创建事件 5秒钟 插入一次当前时间 mysql> CREATE EVENT IF NOT EXISTS test_event ON SCHEDULE EVERY 5 SECOND do insert into test( time ) values (now()); 5天后开启每天定时清空test表,一个月后停止执行: |
1
2
3
4
5
|
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; |
其他例子:
实际应用场景:事件+存储过程
通常的应用场景是通过事件来定期的调用存储过程,下面是一个简单的示例:
创建一个让test表的id2字段每行加基数2的存储过程,存储过程代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
DROP PROCEDURE IF EXISTS test_add; DELIMITER CREATE PROCEDURE test_add() BEGIN DECLARE 1_id INT DEFAULT 1; DECLARE 1_id2 INT DEFAULT 0; DECLARE error_status INT DEFAULT 0; DECLARE datas CURSOR FOR SELECT id FROM test; DECLARE CONTINUE HANDLER FOR NOT FOUND SET error_status=1; OPEN datas; FETCH datas INTO 1_id; REPEAT SET 1_id2=1_id2+2; UPDATE test SET id2=1_id2 WHERE id=1_id; FETCH datas INTO 1_id; UNTIL error_status END REPEAT; CLOSE datas; END |
事件设置2012-08-22 00:00:00时刻开始运行,每隔1调用一次存储过程,40天后结束,代码如下:
1
2
3
4
5
6
|
view sourceprint? CREATE EVENT test ON SCHEDULE EVERY 1 DAY STARTS '2012-08-22 00:00:00' ENDS '2012-08-22 00:00:00' +INTERVAL 40 DAY ON COMPLETION PRESERVE DO CALL test_add(); |
linux上默认这几个位置:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/etc/my.cnf
~/.my.cnf
windows上是my.ini,my-default.ini
一般是在你mysql的安装目录里面
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?