MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

1 篇文章 0 订阅
1 篇文章 0 订阅

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

 

由于一些业务需求,我们可能需要定时清除数据库一些废弃的数据,可以使用mysql的存储过程和事件来完成。

下面例子定时清除日志表tbl_base_count中指定天数前的数据

1.创建日志表tbl_base_count:

[sql] view plain

1. CREATE TABLE `tbl_base_count` (  

2.   `id` int(11) NOT NULL AUTO_INCREMENT,  

3.   `CAPTCHA` varchar(12) COLLATE utf8_bin NOT NULL,  

4.   `PHONE` varchar(12) COLLATE utf8_bin NOT NULL,  

5.   `SENDTIME` varchar(32) COLLATE utf8_bin NOT NULL,  

6.   PRIMARY KEY (`id`)  

7. ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  


2.创建事件e_del_tbl_base_count:

[sql] view plain

1. CREATE EVENT `e_del_tbl_base_count`   

2. ON SCHEDULE EVERY 1 DAY STARTS '2013-06-23 17:33:43'   

3. ON COMPLETION NOT PRESERVE ENABLE DO CALL p_del_count (90);  

上面代码表示从2013-07-30 17:33:43起每一天执行一次p_del_count这个存储过程,并带上参数

 

3.创建存储过程:

[sql] view plain

1. p_del_count   

2. DELIMITER $$  

3.   

4. --  

5. -- 存储过程  

6. --  

7. CREATE PROCEDURE `p_del_count`(IN `date_inter` INT)  

8. BEGIN  

9.     DELETE FROM LOG WHERE (TO_DAYS(NOW()) - TO_DAYS(FROM_UNIXTIME(SENDTIME)))>=date_inter;  

10. END$$  

11. DELIMITER ;  

按事件传过来的参数90,删除操作时间90天之前的数据

这样mysql就会定制每天去执行这个任务了。

 

4.(一)查看当前是否已开启事件计划(调度器)有3种方法:

[sql] view plain

1. SHOW VARIABLES LIKE 'event_scheduler';  

2.  SELECT @@event_scheduler;  

3.  SHOW PROCESSLIST;  

5.(二)开启事件计划(调度器)开关有4种方法:

[sql] view plain

1. SET GLOBAL event_scheduler = 1;  

2. SET @@global.event_scheduler = 1;  

3. SET GLOBAL event_scheduler = ON;  

4. SET @@global.event_scheduler = ON;  

 

键值1或者ON表示开启;0或者OFF表示关闭;


6.(三)事件开启与关闭:

[sql] view plain

1. 开启某事件:ALTER EVENT e_del_logs ON COMPLETION PRESERVE ENABLE;  

2. 关闭某事件:ALTER EVENT e_del_logs ON COMPLETION PRESERVE DISABLE; 

 

 

---------------------------------------案例-----------------------------------

  

CREATE TABLE `admin`.`tbl_base_count` (  

  `id` int(11) NOT NULL AUTO_INCREMENT,  

  `CAPTCHA` varchar(12) NOT NULL,  

  `PHONE` varchar(12)  NOT NULL,  

  `SENDTIME` varchar(32) NOT NULL,  

  PRIMARY KEY (`id`)  

) ENGINE=InnoDB AUTO_INCREMENT=15 ;  

  

 

--  新增事件

CREATE event `e_del_tbl_base_counts`   

ON SCHEDULE EVERY 1 DAY STARTS '2017-03-22 14:15:00'   

ON COMPLETION NOT PRESERVE ENABLE DO CALL p_del_counts (1);

 

-- 修改事件

alter event `e_del_tbl_base_counts`   

ON SCHEDULE EVERY 1 DAY STARTS '2017-03-22 14:15:00'   

ON COMPLETION NOT PRESERVE ENABLE DO CALL p_del_counts (1);

 

-- 删除事件

drop event if exists e_del_tbl_base_counts;

  

-- 新建存储过程

p_del_counts   

DELIMITER $$  

  

--  

-- 存储过程  

--  

CREATE PROCEDURE `p_del_counts`(IN `date_inter` INT)  

BEGIN  

    DELETE FROM admin.tbl_base_count WHERE (TO_DAYS(NOW()) - TO_DAYS(FROM_UNIXTIME(unix_timestamp(SENDTIME),'%Y%m%d')))>=date_inter;  

END$$  

DELIMITER ;  

 

select * FROM admin.tbl_base_count WHERE (TO_DAYS(NOW()) - TO_DAYS(FROM_UNIXTIME(unix_timestamp(SENDTIME),'%Y%m%d')))>=1;

 

-- 删除存储过程

drop PROCEDURE `p_del_counts`;

 

-- 查看当前是否已开启事件计划(调度器)有3种方法:

SHOW VARIABLES LIKE 'event_scheduler';  

 SELECT @@event_scheduler;  

 SHOW PROCESSLIST;  

 

-- 开启事件计划(调度器)开关有4种方法: 键值1或者ON表示开启;0或者OFF表示关闭;  

SET GLOBAL event_scheduler = 1;  

SET @@global.event_scheduler = 1;  

SET GLOBAL event_scheduler = ON;  

SET @@global.event_scheduler = ON;  

 

-- 开启某事件  

ALTER EVENT e_del_tbl_base_counts ON COMPLETION PRESERVE ENABLE ;

-- 关闭某事件

alter event e_del_tbl_base_counts on completion preserve disable;

 

 

 

 

 

 

 

 

======================详细讲解===========================

MySQL5.1.x版本中引入了一项新特性EVENT,顾名思义就是事件、定时任务机制,在指定的时间单元内执行特定的任务,因此今后一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。

创建EVENT非常简单,语法如下:

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

例如创建一个每30秒清空tableA数据的任务

CREATE EVENT E_DELETE_ASO_TOKEN ON SCHEDULE EVERY 30 SECOND DO DELETE FROM tableA ;

默认EVENT支持是没有启动的,可以通过下面的命令来查看状态:

Select @@event_scheduler;

如果返回OFF,则需要执行下面的命令启动:

SET GLOBAL event_scheduler = ON;

好了,上面虽然启动了EVENT,但是每次重启MySQL之后EVENT并没有自动启动,

那么如何让它自动启动呢?

方法之一:找到当前使用的.cnf文件,在[mysqld]的下面加入如下行...

event_scheduler=1

方法二:启动mysql的时候增加--event_scheduler=1

mysql start --event_scheduler=1

 

事件详细语法事例(EVENT)

 
1>创建事件(CREATE EVENT)

先来看一下它的语法:

CREATE EVENT [IF NOT EXISTS] event_name

    ON SCHEDULE schedule

    [ON COMPLETION [NOT] PRESERVE]

    [ENABLE | DISABLE]

    [COMMENT 'comment']

    DO sql_statement;

 

schedule:

    AT TIMESTAMP [+ INTERVAL INTERVAL]

  | EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

 INTERVAL:

    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |

              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |

              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表

USE test;CREATE TABLE aaa (timeline TIMESTAMP);CREATE EVENT e_test_insert

ON SCHEDULE EVERY 1 SECOND 

DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);

等待3秒钟后,再执行查询看看:

mysql> SELECT * FROM aaa;

+---------------------+

| timeline            |

+---------------------+

| 2007-07-18 20:44:26 |

| 2007-07-18 20:44:27 |

| 2007-07-18 20:44:28 |

+---------------------+

2) 5天后清空test表:

CREATE EVENT e_test

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

3) 200772012点整清空test表:

CREATE EVENT e_test

ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'

DO TRUNCATE TABLE test.aaa;

4) 每天定时清空test表:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

DO TRUNCATE TABLE test.aaa;

5) 5天后开启每天定时清空test表:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

6) 每天定时清空test表,5天后停止执行:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

7) 5天后开启每天定时清空test表,一个月后停止执行:

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;

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE
8) 每天定时清空test(只执行一次,任务完成后就终止该事件)

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

ON COMPLETION NOT PRESERVE

DO TRUNCATE TABLE test.aaa;

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE
[COMMENT ‘comment’]可以给该事件加上注释。

2>修改事件(ALTER EVENT)

ALTER EVENT event_name

    [ON SCHEDULE schedule]

    [RENAME TO new_event_name]

    [ON COMPLETION [NOT] PRESERVE]

    [COMMENT 'comment']

    [ENABLE | DISABLE]

    [DO sql_statement]

1) 临时关闭事件

ALTER EVENT e_test DISABLE;

2) 开启事件

ALTER EVENT e_test ENABLE;

3) 将每天清空test表改为5天清空一次:

ALTER EVENT e_test

ON SCHEDULE EVERY 5 DAY;

3>删除事件(DROP EVENT)

语法很简单,如下所示:

DROP EVENT [IF EXISTS] event_name

例如删除前面创建的e_test事件

DROP EVENT e_test;

当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值