mysql启动时自动启动event事件

mysql定时执行-mysql event事件
2012年12月07日  ⁄ mysql基础语法  ⁄ 共 3221字 ⁄ 被围观 167 views+⁄ 发帖人:  admin

分别有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)

event_scheduler=ONimage

  • 编译的时候开启

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的安装目录里面

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事件不运行的原因可能有多种。首先,可能是由于MySQL事件调度器未启用而导致事件不会自动运行。在MySQL中,事件调度器默认情况下是禁用的,需要通过设置成员变量event_scheduler为ON来启用它。如果未手动启用事件调度器,事件将不会启动并且不会被执行。 第二,事件的执行规则可能不满足事件调度器的要求。事件调度器在计算将要运行的事件,将考虑事件的开始和结束间以及循环规则。如果事件的规则与当前间不匹配,事件将不会被调度和执行。 第三,在事件的定义中可能出现了错误。事件可能包含无效的SQL语句、语法错误或其他类型的错误。如果事件定义中存在这些错误,MySQL将无法正确解析和执行事件,并可能导致事件不运行。 第四,可能是由于数据库或服务器的配置问题导致事件不运行。例如,如果数据库中的存储引擎不支持事件或配置文件中的事件调度器配置不正确,事件将无法正常运行。 最后,事件也可能被显式地禁用或删除。如果管理员或用户手动禁用或删除了事件,它将不会运行。 总结来说,MySQL事件不运行的原因可能是未启用事件调度器、事件执行规则不匹配、事件定义中存在错误、配置问题导致事件无法正常工作,或者事件被禁用或删除。解决这些问题通常需要检查和调整事件调度器配置、事件定义、数据库或服务器配置,并确保事件未被禁用或删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值