第13节-MySQL事件调度器()

14.1、事件调度器使用场景

数据库管理是一项重要且烦琐的工作,许多日常管理任务往往会频繁地﹑周期性地执行,例如定期维护索引﹑定时刷新数据﹑定时关闭帐户﹑定义打开或关闭数据库等操作,实际应用中,数据库管理员会定义事件对象以自动化完成这些任务。本任务将详细介绍MySQL中事件调度的创建﹑维护和管理等。

14.2、事件调度器介绍

1、事件是在特定时刻调用的数据库对象。
2、一个事件可调用一次,也可周期性的被调用,它由一个特定的线程来管理,也就是“事件调度器”
3、事件调度器取代了原先只能由操作系统的计划任务来执行的工作。
4、 MySQL的事件调度器可以精确到每秒钟执行一个任务
5、事件在实时性要求较高的应用(如股票﹑期货等)中广泛使用
6、事件调度器是MySQL数据库服务器的一部分
7、负责事件的调度,它不断监视某个事件是否需要被调用。在创建事件前,必须先打开事件调度器。
8、MySQL中的全局变量@@GLOBAL.EVENT_SCHEDULER用于监控事件调度器是否开启

14.3、事件调度器开启与关闭

14.3.1、查询事件调度器是否开启

mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

14.3.3、开启事件调度器

set @@global.event_scheduler=on;
-- 或
set @@global.event_scheduler=1;

14.3.4、关闭事件调度器

set @@global.event_scheduler=off;
-- 或
set @@global.event_scheduler=0;

14.4、事件调度器管理

14.1.1、事件的语法

1、要完成自动化作业就需要创建事件。
2、每个事件由事件调度(event schedule)和事件动作(event action)两个部分组成。

语法介绍:
CREATE
    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    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}

14.1.2、创建事件

14.1.2.1、将学生表(student)的数据转移到学生历史表(student_history)

-- 复制表结构
create table student_history like student;

-- at now() 立即执行
create event event_copy_student on schedule at now() do insert into student_history select * from student;

14.1.2.2、每一分钟调用存储过程,往表插入数据

-- 往表插入一条数据的存储过程 
delimiter $$
create procedure add_rows()
begin
declare vsno varchar(20);
select max(sno) into vsno from cjgl.student_history;
set vsno=vsno+1;
insert into student_history values (vsno,'test-event','男',100,'软件技术',now());
end$$
delimiter ;

-- 每一分钟,插入一条数据
create event event_add on schedule every 1 MINUTE do call add_rows;

14.1.2.3、查看事件

show events;
show create event event_add;

14.1.2.4、修改事件

-- 禁用事件与启用事件
alter event event_add disable;
alter event event_add enable;

-- 每15天执行1次
alter event event_add on schedule every 15 day starts '2022-11-11 03:00:00' ends '2023-11-11 03:00:00';

14.1.2.3、删除事件

drop event event_add;

14.2、实战

14.2.1、用于每过10秒钟往users表中插入一条记录

-- 要求用户名为user+当前的时间戳,时间戳可用UNIX_TIMESTAMP(now())获得。

create table users(
    id int auto_increment primary key,
    username varchar(20),
    cre_time timestamp default current_timestamp()
);

create event event_insertuser on schedule every 10 second ends now()+600 do insert into users(username) values (concat('user',unix_timestamp(now())));
————————

14.1、事件调度器使用场景

数据库管理是一项重要且烦琐的工作,许多日常管理任务往往会频繁地﹑周期性地执行,例如定期维护索引﹑定时刷新数据﹑定时关闭帐户﹑定义打开或关闭数据库等操作,实际应用中,数据库管理员会定义事件对象以自动化完成这些任务。本任务将详细介绍MySQL中事件调度的创建﹑维护和管理等。

14.2、事件调度器介绍

1、事件是在特定时刻调用的数据库对象。
2、一个事件可调用一次,也可周期性的被调用,它由一个特定的线程来管理,也就是“事件调度器”
3、事件调度器取代了原先只能由操作系统的计划任务来执行的工作。
4、 MySQL的事件调度器可以精确到每秒钟执行一个任务
5、事件在实时性要求较高的应用(如股票﹑期货等)中广泛使用
6、事件调度器是MySQL数据库服务器的一部分
7、负责事件的调度,它不断监视某个事件是否需要被调用。在创建事件前,必须先打开事件调度器。
8、MySQL中的全局变量@@GLOBAL.EVENT_SCHEDULER用于监控事件调度器是否开启

14.3、事件调度器开启与关闭

14.3.1、查询事件调度器是否开启

mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

14.3.3、开启事件调度器

set @@global.event_scheduler=on;
-- 或
set @@global.event_scheduler=1;

14.3.4、关闭事件调度器

set @@global.event_scheduler=off;
-- 或
set @@global.event_scheduler=0;

14.4、事件调度器管理

14.1.1、事件的语法

1、要完成自动化作业就需要创建事件。
2、每个事件由事件调度(event schedule)和事件动作(event action)两个部分组成。

语法介绍:
CREATE
    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    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}

14.1.2、创建事件

14.1.2.1、将学生表(student)的数据转移到学生历史表(student_history)

-- 复制表结构
create table student_history like student;

-- at now() 立即执行
create event event_copy_student on schedule at now() do insert into student_history select * from student;

14.1.2.2、每一分钟调用存储过程,往表插入数据

-- 往表插入一条数据的存储过程 
delimiter $$
create procedure add_rows()
begin
declare vsno varchar(20);
select max(sno) into vsno from cjgl.student_history;
set vsno=vsno+1;
insert into student_history values (vsno,'test-event','男',100,'软件技术',now());
end$$
delimiter ;

-- 每一分钟,插入一条数据
create event event_add on schedule every 1 MINUTE do call add_rows;

14.1.2.3、查看事件

show events;
show create event event_add;

14.1.2.4、修改事件

-- 禁用事件与启用事件
alter event event_add disable;
alter event event_add enable;

-- 每15天执行1次
alter event event_add on schedule every 15 day starts '2022-11-11 03:00:00' ends '2023-11-11 03:00:00';

14.1.2.3、删除事件

drop event event_add;

14.2、实战

14.2.1、用于每过10秒钟往users表中插入一条记录

-- 要求用户名为user+当前的时间戳,时间戳可用UNIX_TIMESTAMP(now())获得。

create table users(
    id int auto_increment primary key,
    username varchar(20),
    cre_time timestamp default current_timestamp()
);

create event event_insertuser on schedule every 10 second ends now()+600 do insert into users(username) values (concat('user',unix_timestamp(now())));