-- CREATE TABLE `event_demo` (
-- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
-- `name` varchar(16) NOT NULL,
-- `seed` int(11) DEFAULT '0',
-- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期',
-- PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
--
-- 【事件1】 :在某个时间点执行事件,只执行一次
DROP event IF EXISTS `event1`;
CREATE EVENT `event1`
ON SCHEDULE AT '2019-03-01 04:44:10'
ON COMPLETION PRESERVE
ENABLE
COMMENT ' 2019-03-01 04:44:10 开始执行,执行了就结束了。这样也可以把 ON COMPLETION 设置成 NOT PRESERVE 。 就是执行结束的时候把事件也删除。当前(PRESERVE)是不会把该事件删除的'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 1;
-- 【事件2】 :某个时间点加上时间单位之后执行事件(+ 表示在多久之后执行),只执行一次。
-- 例1: CURRENT_TIMESTAMP + INTERVAL 1 MONTH 从现在开始,过5个月执行事件
DROP event IF EXISTS `event2`;
CREATE EVENT `event2`
ON SCHEDULE AT '2019-03-01 05:13:10' + INTERVAL 5 SECOND
ON COMPLETION PRESERVE
ENABLE
COMMENT '从 2019-03-01 05:13:10 开始 过5秒之后执行事件,执行完就不执行了,可以把 ON COMPLETION 设置成 NOT PRESERVE 。'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 2;
-- 【事件3】: 周期性的执行事件, 注意将 ON COMPLETION 设置成 NOT PRESERVE 是无效的,并不会删除事件,依然会周期性的执行
-- 例1: EVERY 1 SECOND 从现在开始,每秒执行一次
-- 例2: EVERY 1 DAY 从现在开始,每天执行一次
DROP event IF EXISTS `event3`;
CREATE EVENT `event3`
ON SCHEDULE EVERY 1 DAY
ON COMPLETION PRESERVE
ENABLE
COMMENT '每天执行一次事件'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 3;
-- 【事件4】 : 在某个点之后,周期性的执行事件, 注意将 ON COMPLETION 设置成 NOT PRESERVE 是无效的,并不会删除事件,依然会周期性的执行
-- STARTS 可以是将来时间,也可以是过去时间
-- 例1: EVERY 1 DAY STARTS '2019-03-01 04:44:10' 2019-03-01 04:44:10 之后每天执行一次
-- 例2: EVERY 1 HOUR STARTS '2019-03-01 04:44:10' 2019-03-01 04:44:10 之后每小时执行一次
DROP event IF EXISTS `event4`;
CREATE EVENT `event4`
ON SCHEDULE EVERY 1 MINUTE STARTS '2019-03-01 05:40:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT '每分钟执行一次,从 2019-03-01 05:40:00 开始'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 4;
-- 【事件5】: 在某个时间点之后的时间,周期性的执行事件
-- 例1:EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND 表示: 2019-03-01 04:50:10 再过5秒之后,每秒执行一次事件
DROP event IF EXISTS `event5`;
CREATE EVENT `event5`
ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND
ON COMPLETION PRESERVE
ENABLE
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 5;
-- 【事件6】: 在某个时间点之后的时间,周期性的执行事件 ,并在指定时间点上终结事件。如果要删除事件可以把 ON COMPLETION 设置成 NOT PRESERVE 。
DROP event IF EXISTS `event6`;
CREATE EVENT `event6`
ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT '从2019-03-01 05:51:05 开始触发事件,到2019-03-01 05:52:00结束事件。之后不会再执行事件了'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 6;
-- 【事件7】: 在某个时间点之后的时间,周期性的执行事件 ,并在指定时间点之后一段时间终结事件。如果要删除事件可以把 ON COMPLETION 设置成 NOT PRESERVE 。
DROP event IF EXISTS `event7`;
CREATE EVENT `event7`
ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00' + INTERVAL 5 SECOND
ON COMPLETION PRESERVE
ENABLE
COMMENT '从2019-03-01 05:51:05 开始触发事件,到2019-03-01 05:52:05结束事件。之后不会再执行事件了'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 7;
mysql 创建任务(事件)
1、检查数据库事件是否开启,如果 event_scheduler 等于 NO表示开启
SELECT @@event_scheduler;
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
2、开启任务(事件)
a、set global event_scheduler=1;
b、SET GLOBAL event_scheduler = ON;
c、在my.cnf中的[mysqld]部分添加 event_scheduler=ON 然后重启mysql。
3、关闭事件
SET GLOBAL event_scheduler = OFF;
4、语法:
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': 定义事件的注释。
5、开启事件
alter event event_name(事件名称) ON COMPLETION PRESERVE ENABLE;
6、关闭事件
alter event event_name(事件名称) ON COMPLETION PRESERVE DISABLE;
7、删除事件
DROP EVENT [IF EXISTS] event_name(事件名称)
8、案例
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 <!-- 创建一个每隔3秒往test表中插入一条数据的事件 --> CREATE EVENT IF NOT EXISTS e_test_1 ON SCHEDULE EVERY 3 SECOND ON COMPLETION PRESERVE DO INSERT INTO test(id,t1) VALUES(NULL,NOW()); <!-- 创建一个10分钟后清空test表数据的事件 --> CREATE EVENT IF NOT EXISTS e_test_2 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE DO TRUNCATE TABLE test; <!-- 调用存储过程 --> 1、创建过程 CREATE PROCEDURE pro_test() BEGIN INSERT INTO test(id,t1,id2) VALUES(NULL,NOW(),'1000000'); END 2、调用过程 CREATE EVENT IF NOT EXISTS e_test_3 ON SCHEDULE EVERY 3 SECOND ON COMPLETION PRESERVE DO CALL pro_test();
9、关于事件的权限问题 (Access denied for user 'root'@'%' to database ‘xxxx’)
使用Naicat Premium远程连接的mysql上面创建了一个新数据库和新的用户后,给该用户添加这个新数据库权限时出现:
access denied for user 'root'@'%' to database xxxx的提示。
错误的原因是root用户在远程连接的MYSQL上面,没有这个新数据库的授权。在本地使用mysql应该不存在这个问题。
解决方法,执行授权:
UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='root';
FLUSH PRIVILEGES;
grant all PRIVILEGES on xxxx.* to root@'%' identified by 'password' with grant option;
grant all on xxxx.* to 'root'@'%' identified by 'password' with grant option;
xxxx为创建的数据库,password为root的密码。请按实际要求进行更改。