分别有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=ON
- 编译的时候开启
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的安装目录里面