出自:http://blog.chinaunix.net/uid-20639775-id-3323098.html

Mysql事件学习

在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQL语句。对于linux系统熟悉的人都知道linux的cron计划任务,能很方便地实现定期运行指定命令的功能。Mysql在5.1以后推出了事件调度器(Event Scheduler),和linux的cron功能一样,能方便地实现 mysql数据库的计划任务,而且能精确到秒。使用起来非常简单和方便。

由于最近需要用到事件这个功能,因此学习了一下,感觉非常棒,总结一下,方便以后使用,也希望能对其他的初学者有帮助。

一、    如果开启事件

在使用事件这个功能,首先要保证你的mysql的版本是5.1以上,然后还要查看你的mysql服务器上的事件是否开启。

查看事件是否开启,使用如下命令查看:

SHOW VARIABLES LIKE 'event_scheduler';

SELECT @@event_scheduler;

SHOW PROCESSLIST;

如果看到event_scheduler为on或者PROCESSLIST中显示有event_scheduler的信息说明就已经开启了事件。如果显示为off或者在PROCESSLIST中查看不到event_scheduler的信息,那么就说明事件没有开启,我们需要开启它。

开启mysql的事件,通过如下三种方式开启:

  • 通过动态参数修改

SET GLOBAL event_scheduler = ON;

更改完这个参数就立刻生效了

注意:还是要在my.cnf中添加event_scheduler=ON。因为如果没有添加的话,mysql重启事件又会回到原来的状态了。

  • 更改配置文件然后重启

在my.cnf中的[mysqld]部分添加如下内容,然后重启mysql。

event_scheduler=ON

  • 通过制定事件参数启动

mysqld ... --event_scheduler=ON

二、    Mysql事件的语法简介

  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;

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。

ENABLE | DISABLE | DISABLE ON SLAVE: 定义事件创建以后是开启还是关闭,以及在从上关闭。如果是从服务器自动同步主上的创建事件的语句的话,会自动加上DISABLE ON SLAVE。

COMMENT 'comment': 定义事件的注释。

  1. 更改事件的语法

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. 删除事件的语法

DROP EVENT [IF EXISTS] event_name

三、    Mysql事件实战

  1. 测试环境

创建一个用于测试的test表:

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `t1` datetime DEFAULT NULL,
  `id2` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8

  1. 实战1
  • 创建一个每隔3秒往test表中插入一条数据的事件,代码如下:

CREATE EVENT IF NOT EXISTS test ON SCHEDULE EVERY 3 SECOND

ON COMPLETION PRESERVE

DO INSERT INTO test(id,t1)
VALUES('',NOW());

  • 创建一个10分钟后清空test表数据的事件

CREATE EVENT IF NOT EXISTS test

ON SCHEDULE

AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE

DO TRUNCATE TABLE test.aaa;

  • 创建一个在2012-08-23
    00:00:00时刻清空test表数据的事件,代码如下:

CREATE EVENT IF NOT EXISTS test

ON SCHEDULE

AT TIMESTAMP '2012-08-23 00:00:00'

DO TRUNCATE TABLE test;

  • 创建一个从2012年8月22日21点45分开始到10分钟后结束,运行每隔3秒往test表中插入一条数据的事件,代码如下:

CREATE EVENT IF NOT EXISTS test ON SCHEDULE EVERY 3 SECOND

STARTS '2012-08-22 21:49:00'

ENDS '2012-08-22 21:49:00'+ INTERVAL 
10 MINUTE

ON COMPLETION PRESERVE

DO INSERT INTO test(id,t1) VALUES('',NOW());

  1. 实战2

通常的应用场景是通过事件来定期的调用存储过程,下面是一个简单的示例:

创建一个让test表的id2字段每行加基数2的存储过程,存储过程代码如下:

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天后结束,代码如下:

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();

四、   
参考链接

http://dev.mysql.com/doc/refman/5.1/en/events-configuration.html

http://dev.mysql.com/doc/refman/5.1/en/create-event.html

http://blog.163.com/duanpeng3@126/blog/static/8854373520105182123112/

Mysql事件学习的更多相关文章

  1. MySQL事件【转载】

    在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQL语句.对于linux系统熟悉的人都知道linux的cron计划任务,能很方便地实现定期运行指定命令的功能.Mysql在5.1以后推出了 ...

  2. MySQl Study学习之--MySQl二进制日志管理

    MySQl Study学习之--MySQl二进制日志管理 MySQL二进制日志(Binary Log)   a.它包括的内容及作用例如以下:     包括了全部更新了数据或者已经潜在更新了数据(比方没 ...

  3. 基于【 MySql 】二 || mysql详细学习笔记

    mysql重点学习笔记 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysql ...

  4. mysql 事件

    经常要周期性的执行某一个命令或者SQL语句.mysql事件,mysql的版本是5.1以上. 首先要查看事件是否开启了, SHOW VARIABLES LIKE 'event_scheduler'; S ...

  5. MySQL事件 Events

    MySQL事件 Events   一.关键字: EVENT   二.语法: CREATE EVENT? [IF NOT EXISTS ] //如果不存在则创建 event_name? ON SCHED ...

  6. MySQL事务学习-->隔离级别

    MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...

  7. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. MySQL数据库学习笔记(十)----JDBC事务处理、封装JDBC工具类

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  9. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. 给Debian浏览器安装flash播放插件

    sudo apt-get install flashplugin-nonfree  

  2. /etc/passwd /etc/shadow

    一./etc/passwd/etc/passwd 文件是一个纯文本文件,每行采用了相同的格式: name:password:uid:gid:comment:home:shell name 用户登录名  ...

  3. django中request对象详解(转载)

    django中的request对象详解 Request 我们知道当URLconf文件匹配到用户输入的路径后,会调用对应的view函数,并将  HttpRequest对象  作为第一个参数传入该函数. ...

  4. Python File.readlines() 方法

    python3的用法:

  5. [转]Dynamics AX and Generic collections of .Net

    转自:http://blogs.msdn.com/b/emeadaxsupport/archive/2009/04/23/dynamics-ax-and-generic-collections-of- ...

  6. iOS Button按钮 热区的放大

      Apple的iOS人机交互设计指南中指出,按钮点击热区应不小于44x44pt,否则这个按钮就会让用户觉得“很难用”,因为明明点击上去了,却没有任何响应. 但我们有时做自定义Button的时候,设计 ...

  7. Oracle之主键的创建、添加、删除操作

    一.创建表的同时创建主键约束 1.1.无命名 SQL)); Table created SQL> select table_name,index_name from user_indexes w ...

  8. nginx完美支持tp框架

    nginx完美支持tp框架 server { listen 80; server_name mit.520m.com.cn; access_log /data/wwwlogs/mit.520m.com ...

  9. ectouch第八讲 之模板内容修改

    前台:1.前台页面logo代码[ 文件位置:\mobile\themes\default\index.dwt] <div style="text-align: center;paddi ...

  10. “wsimport -keep ”生成客户端报错“Use of SOAP Encoding is not supported.”

    本来想用 “wsimport -keep ” 生成客户端,结果报错“Use of SOAP Encoding is not supported.” 应该是缺jar包, 闲麻烦就发现了百度经验上的 这个 ...