Mysql创建事件执行任务

1、CREATE EVENT创建事件语法

在 MySQL 中,可以通过CREATE EVENT语句来创建事件,其语法格式如下:

CREATE EVENT [IF NOT EXISTS] event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'comment']
    DO event_body;

从上面的语法可以看出,CRATE EVENT 语句由多个子句组成,各子句的详细说明如下表所示。

子句说明
DEFINER可选
用于定义事件执行时检查权限的用户
IF NOT EXISTS可选
用于判断要创建的事件是否存在
EVENT event_name必选
用于指定事件名称,event_name 的最大长度为 64 个字符
如果未指定 event_name,则默认为当前的 MySQL 用户名(不区分大小写)
ON SCHEDULE schedule必选
用于定义执行的时间和时间间隔
schedule 表示触发点
ON COMPLETION [NOT] PRESERVE可选
用于定义事件是否循环执行,即是一次执行还是永久执行,默认为一次执行,即 NOT PRESERVE
ENABLE | DISABLE | DISABLE ON SLAVE可选,用于指定事件的一种属性。
其中,关键字 ENABLE 表示该事件是活动的,即调度器检查事件是否必须调用;
关键字 DISABLE 表示该事件是关闭的,即事件的声明存储到目录中,但是调度器不会检查它是否应该调用;
关键字 DISABLE ON SLAVE 表示事件在从机中是关闭的。
如果不指定以上 3 个选项中的任何一个,默认为 ENABLE
COMMENT 'comment'可选,用于定义事件的注释
DO event_body必选
用于指定事件启动时所要执行的代码,可以是任何有效的 SQL 语句、存储过程或者一个计划执行的事件。
如果包含多条语句,则可以使用 BEGIN..END 复合结构

2、查看事件是否开启

show VARIABLES like 'event%';   -- 若为OFF,则执行下列指令

-- 开启
SET GLOBAL event_scheduler = 1;
SET GLOBAL event_scheduler = ON;

-- 关闭
SET GLOBAL event_scheduler = 0;
SET GLOBAL event_scheduler = OFF;

-- 查看所有事件
SHOW EVENTS;

-- 查看具体的事件执行情况
SELECT * FROM information_schema.events WHERE EVENT_SCHEMA='test' ;   -- 查询事件详情

3、创建事件并查看执行数据

 3.1 创建一张表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for one_data
-- ----------------------------
DROP TABLE IF EXISTS `one_data`;
CREATE TABLE `one_data`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '名称',
  `sort_number` int(11) NULL DEFAULT NULL COMMENT '序号',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci COMMENT = '创建事件每秒添加一条数据' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

3.2 创建事件

-- 如果存在存储过程e_test,则删除
DROP PROCEDURE IF EXISTS e_test;

-- 创建事件   
CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY '1' SECOND STARTS '2022-04-14 10:01:00'
ON COMPLETION  PRESERVE COMMENT '每隔1秒钟添加一条数据'
DO INSERT INTO one_data(name, sort_number, create_time) VALUES ('名称', 2, NOW());


-- 创建事件
CREATE EVENT IF NOT EXISTS event_delete_de_records_7days ON SCHEDULE EVERY 1 DAY STARTS '2018-01-01 02:00:00'
ON COMPLETION  NOT PRESERVE  COMMENT '每天凌晨2点执行一次' 
DO INSERT INTO one_data(name, sort_number, create_time) VALUES ('名称', 2, NOW());

3.3 事件参数说明

-- 	参数名	说明
-- EVENT_CATALOG	事件存放目录,一般情况下,值为 def,不建议修改
-- EVENT_SCHEMA	事件所在的数据库
-- EVENT_NAME	事件名称
-- DEFINER	事件的定义者
-- TIME_ZONE	事件使用的时区,默认是 SYSTEM,不建议修改
-- EVENT_BODY	一般情况下,值为 SQL,不建议修改
-- EVENT_DEFINITION	该事件的内容,可以是具体的 INSERT 等 SQL,也可以是一个调用的存储过程
-- EVENT_TYPE	事件类型,这个参数比较重要,在定义时指定
-- 有两个值:RECURRING 和 ONE TIME
-- RECURRING 表示只要符合条件就会重复执行,RECURRING 类型的事件一般为 NULL,表示该事件的预计执行时间
-- ONE TIME 只会调用 EXECUTE_AT,针对 one-time 类型的事件有效
-- INTERVAL_VALUE	针对 RECURRING 类型的事件有效,表示执行间隔长度
-- INTERVAL_FIELD	针对 RECURRING 类型的事件有效,表示执行间隔的单位,一般是 SECOND,DAY 等值,可参考创建语法
-- SQL_MODE	当前事件采用的 SQL_MODE
-- STARTS	针对 RECURRING 类型的事件有效,表示一个事件从哪个时间点开始执行,和 one-time 的 EXECUTE_AT 功能类似。
-- 为 NULL 时表示一符合条件就开始执行
-- ENDS	针对 RECURRING 类型的事件有效,表示一个事件到了哪个时间点后不再执行,如果为 NULL 就是永不停止
-- STATUS	一般有三个值,ENABLED、DISABLED 和 SLAVESIDE_DISABLED
-- ON_COMPLETION	只有两个值,PRESERVE 和 NOT PRESERVE
-- CREATED	事件的创建时间
-- LAST_ALTERED	事件最近一次被修改的时间
-- LAST_EXECUTED	事件最近一次执行的时间,如果为 NULL 表示从未执行过
-- EVENT_COMMENT	事件的注释信息
-- ORIGINATOR	当前事件创建时的 server-id,用于主从上的处理,比如 SLAVESIDE_DISABLED
-- CHARACTER_SET_CLIENT	事件创建时的客户端字符集
-- COLLATION_CONNECTION	事件创建时的连接字符校验规则
-- DATABASE_COLLATION	事件创建时的数据库字符集校验规则

3.4 验证查看数据

SELECT * FROM `one_data`;

select lpad((select max(sort_number)+1 from one_data),3,'0')

4、创建第二个事件

4.1 创建表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for interface_call
-- ----------------------------
DROP TABLE IF EXISTS `interface_call`;
CREATE TABLE `interface_call`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '接口名称',
  `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '唯一编码',
  `all_value` int(10) NULL DEFAULT NULL COMMENT '总调用次数',
  `today_value` int(10) NULL DEFAULT NULL COMMENT '今日调用次数',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '健康报告-接口调用数据' ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

4.2 每天凌晨执行一次

CREATE DEFINER = `root`@`%` EVENT `interface_call`
ON SCHEDULE
EVERY '1' DAY STARTS '2021-10-12 00:00:00'
COMMENT '每天凌晨执行更新今日调用量为零'
DO UPDATE `interface_call` SET  `today_value` = 0, `update_time` = NOW();

4.3 查看事件执行详情

-- 查看具体的事件执行情况
SELECT * FROM information_schema.events WHERE EVENT_SCHEMA='test' and EVENT_NAME='e_test';

-- test:是数据库名称
-- e_test: 具体的事件名称   

posted @ 2022-08-04 19:11  码奴生来只知道前进~  阅读(137)  评论(0编辑  收藏  举报