在前面的文章中有讲到docker部署mysql并挂载,同时配置文件时默认启动了event定时功能
复制
-- 方法一
SELECT @@event_scheduler;
-- 方法二
SHOW VARIABLES LIKE 'event%';
显示 “ON”说明功能已开启;如下图:
复制
mysql> SELECT @@event_scheduler;
+-------------------+
| @@event_scheduler |
+-------------------+
| ON |
+-------------------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'event%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
1 row in set (0.00 sec)
复制
-- 开启功能命令:
SET GLOBAL event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
-- 关闭功能命令:
SET GLOBAL event_scheduler = 0;
SET GLOBAL event_scheduler = OFF;
当然,通过命令开启当数据库重启后会自动关闭;
持久化开启方式:将event_scheduler=ON写到my.cnf配置文件中,如下图:
复制
[mysqld]
event_scheduler=ON
default-time-zone='+08:00'
常用的事件操作命令:
下面是EVENT事件创建语句,乍一看挺复杂的,让我们拆开解读一下
复制
CREATE EVENT [IFNOT EXISTS] event_name
ON SCHEDULE schedule(调度时间设置)
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO sql_statement;
SQL语法 | 说明 |
---|---|
DEFINER | 可选项,给指定用户使用权限 |
IF NOT EXISTS | 可选项,用于判断要创建的事件是否存在 |
EVENT event_name | 必选项,指定事件名称,event_name的最大长度为64个字符,如果为指定event_name,则默认为当前的MySQL用户名(不区分大小写) |
ON SCHEDULE schedule | 必选项,这里的schedule用于定义执行的时间和时间间隔,在下面我们详细讲解 |
ON COMPLETION [NOT] PRESERVE | 可选项,配置事件执行完一次后的处理方式,当为on completion preserve 的时候,当event到期了,event会被disable,但是该event还是会存在当为on completion not preserve的时候,当event到期的时候,该event会被自动删除掉. |
ENABLE、DISABLE、DISABLE ON SLAVE | 可选项,用于指定事件的一种属性。ENABLE表示该事件是开启的,也就是调度器检查事件是否必选调用;DISABLE表示该事件是关闭的,也就是事件的声明存储到目录中,但是调度器不会检查它是否应该调用;DISABLE ON SLAVE表示事件在从机中是关闭的。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它立即变为活动的 |
COMMENT ‘comment’ | 可选项,用于定义事件的注释 |
DO event_body | 必选项,用于指定事件启动时所要执行的代码。可以是任何有效的SQL语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用BEGIN…END复合结构 |
schedule 调度时间配置语法:调度时间配置包括AT 和 EVERY两种
复制
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
-- INTERVAL中包含的时间单位如下:
{YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
复制
AT TIMESTAMP 时间字符串 [+ INTERVAL INTERVAL]
需要注意的是,TIMESTAMP和具体字符串连用,如果不是具体字符串(如CURRENT_TIMESTAMP取当前时间等),则不加TIMESTAMP;
复制
CREATE EVENT demo_event2
ON SCHEDULE AT TIMESTAMP '2020-11-20 00:00:00'
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, 'Anyc', NOW())
结果查询:
复制
mysql> select * from demo_1119;
+-----+-----------+---------------------+
| id | name | createTime |
+-----+-----------+---------------------+
| 145 | Anyc | 2020-11-20 00:00:00 |
+-----+-----------+---------------------+
9 rows in set (0.00 sec)
复制
CREATE EVENT demo_event2
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 HOUR
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, 'Anyc', NOW())
复制
EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
复制
CREATE EVENT demo_event3
ON SCHEDULE EVERY 10 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, 'Anyc', NOW())
复制
mysql> select * from demo_1119;
+-----+-----------+---------------------+
| id | name | createTime |
+-----+-----------+---------------------+
| 145 | Anyc | 2023-04-20 11:10:39 |
| 146 | Anyc | 2023-04-20 11:10:49 |
| 147 | Anyc | 2023-04-20 11:10:59 |
| 148 | Anyc | 2023-04-20 11:11:09 |
| 149 | Anyc | 2023-04-20 11:11:19 |
| 150 | Anyc | 2023-04-20 11:11:29 |
| 151 | Anyc | 2023-04-20 11:11:39 |
+-----+-----------+---------------------+
9 rows in set (0.00 sec)
复制
CREATE EVENT demo_event4
ON SCHEDULE EVERY 10 MINUTE STARTS '2020-11-20 12:00:00'
ON COMPLETION PRESERVE
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, '陈哈哈', NOW())
复制
mysql> select * from demo_1119;
+-----+-----------+---------------------+
| id | name | createTime |
+-----+-----------+---------------------+
| 152 | Anyc | 2023-04-20 12:00:00 |
| 153 | Anyc | 2023-04-20 12:10:00 |
| 154 | Anyc | 2023-04-20 12:20:00 |
| 155 | Anyc | 2023-04-20 12:30:00 |
| 156 | Anyc | 2023-04-20 12:40:00 |
+-----+-----------+---------------------+
5 rows in set (0.00 sec)
复制
CREATE EVENT demo_event5
ON SCHEDULE EVERY 10 MINUTE STARTS CURRENT_TIMESTAMP+INTERVAL 1 HOUR
ON COMPLETION PRESERVE
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, 'Anyc', NOW())
复制
CREATE EVENT demo_event5
ON SCHEDULE EVERY 1 HOUR
STARTS CURRENT_TIMESTAMP+INTERVAL 1 DAY
ENDS CURRENT_TIMESTAMP+INTERVAL 3 DAY
ON COMPLETION PRESERVE
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, 'Anyc', NOW())
复制
CREATE EVENT demo_event5
ON SCHEDULE EVERY 1 DAY STARTS '2023-4-20 00:00:00'
ON COMPLETION PRESERVE
DO TRUNCATE table `demo_1119`
修改事件语句跟创建语句如出一辙,语法如下:
复制
ALTER EVENT event_name
[ONSCHEDULE schedule]
[old_NAME TO new_NAME]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']
[ENABLE | DISABLE]
[DO sql_statement]
复制
DROP EVENT [IF EXISTS] event_name
定时从中间数据库拿数据并推至业务数据库(全量更新)
复制
CREATE EVENT full_update
ON SCHEDULE
EVERY 18 SECOND
ON COMPLETION PRESERVE
COMMENT '新增用户信息定时任务'
DO
BEGIN
TRUNCATE TABLE ncu.xs_xsjbsj; # 清空表
INSERT INTO ncu.xs_xsjbsj SELECT * FROM reservation.xs_xsjbsj; # 插入全量数据
END;
复制
create event full_update_b
#每天凌晨三点同步b数据
on schedule every 1 day starts '2016-12-30 03:00:00'
on completion preserve enable
comment '同步b数据'
do
BEGIN
TRUNCATE TABLE db1.b; # 清空表
INSERT INTO db1.b SELECT * FROM db2.b; # 插入全量数据
END;
复制
create event full_update_y
#每天凌晨三点十分同步y数据
on schedule every 1 day starts '2016-12-30 03:10:00'
on completion preserve enable
comment '同步y数据'
do
BEGIN
TRUNCATE TABLE db1.y; # 清空表
INSERT INTO db1.y SELECT * FROM db2.y; # 插入全量数据
END;
复制
create event full_update_j
#每天凌晨三点二十同步j数据
on schedule every 1 day starts '2016-12-30 03:20:00'
on completion preserve enable
comment '同步j数据'
do
BEGIN
TRUNCATE TABLE db1.j; # 清空表
INSERT INTO db1.j SELECT * FROM db2.j; # 插入全量数据
END;
复制
create event full_update_x
#每天凌晨三点三十同步x数据
on schedule every 1 day starts '2016-12-30 03:30:00'
on completion preserve enable
comment '同步x数据'
do
BEGIN
TRUNCATE TABLE db1.x; # 清空表
INSERT INTO db1.x SELECT * FROM db2.x; # 插入全量数据
END;