MySQL 事件调度器

一 event 介绍

事件调度器是定时触发执行的,在这个角度上也可以称作是"定时的触发器"。触发器只是针对某个表产生的事件执行一些语句,而事件调度器则是在某一个(间隔)时间执行特定的语句/存储过程。事件是由一个特定的线程来管理的,也就是所谓的"事件调度器"。启用事件调度器后,拥有SUPER权限的账户执行 SHOW PROCESSLIST 就可以看到这个线程了。通过设定全局变量event_scheduler 的值即可动态的控制事件调度器是否启用。

在使用这个功能之前必须确保event_scheduler已开启,可执行

SET GLOBAL event_scheduler = 1;

SET GLOBAL event_scheduler = on;

设置成功之后,执行show proceslist;

 11:56:09> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)
11:56:30> SET GLOBAL event_scheduler = 1;
Query OK, 0 rows affected (0.03 sec)
11:56:41> show variables like '%event_scheduler%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.01 sec)
11:59:57> show processlist;
+--------+-----------------+-----------------+------+---------+------+------------------------+------------------+
| Id     | User            | Host            | db   | Command | Time | State                  | Info             |
+--------+-----------------+-----------------+------+---------+------+------------------------+------------------+
| 165933 | root            | localhost:34672 | NULL | Query   |    0 | NULL                   | show processlist |
| 165934 | event_scheduler | localhost       | NULL | Daemon  |  204 | Waiting on empty queue | NULL             |
+--------+-----------------+-----------------+------+---------+------+------------------------+------------------+
2 rows in set (0.00 sec)

进程中会出现一个event_scheduler的用户用于执行调度事件。

二 创建事件

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}

1) 创建一个任务每隔两秒向表插入数据

create event e_insert on schedule every 2 sencond do insert into test.evnt values (now());

2) 10天后清空evnt表:

create event e_10d_truncate_evnt on schedule at current_timestamp + interal 10 day do truncate table yang.evnt;

3) 2013年4月5日12点整清空evnt表:

create event eevnt1 on schedule at timestamp '2013-04-05 12:00:00' do truncate table yang.evnt;

4) 2天后开启每天定时清空evnt表,一年后停止执行

create event e_x on schedule every 1 day starts current_timestamp + interval 2 day ends current_timestamp + interval 1 year do truncate table yang.evnt

[on completion [not] preserve] 默认是on completion not preserve即计划任务执行完毕后自动drop该事件;on completion preserve则不会drop掉 。

5) 每天定时清空evnt表(只执行一次,任务完成后就终止该事件):

create event e_evnt_3 on schedule every 1 day on completion not preserve do truncate table yang.evnt

[enable | disenable]可是设置该事件创建后状态是否开启或关闭,默认为enable。 [commet 'commet']可以给该事件加上注释。

三 修改事件

ALTER
    [DEFINER = { user | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    [DO event_body]

1) 关闭事件

alter event e_evnt disenable;

2) 开启事件

alter event e_evnt enable;

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

alter event e_evnt on schedule every 5 day;

四 删除事件

drop event [IF EXISTS] event_name

五 主从复制对event的影响

对于主从架构的数据库要注意将从库的任务调度关闭,以防止在主库执行了之后,从库又重复在备库进行调度evnet。

test  07:31:16 >create event  e_insert  
    -> on schedule every 2 second
    -> do insert into test.evnt values (now());
Query OK, 0 rows affected (0.01 sec)

test  07:33:13 > SELECT EVENT_SCHEMA,EVENT_NAME,
EVENT_DEFINITION,
INTERVAL_FIELD,STATUS,LAST_EXECUTED 
FROM information_schema.EVENTS\G
*************************** 1. row ******************
    EVENT_SCHEMA: test
      EVENT_NAME: e_insert
EVENT_DEFINITION: insert into test.evnt values (now())
  INTERVAL_FIELD: SECOND
          STATUS: ENABLED
   LAST_EXECUTED: NULL

在从库上查看

test [RO]  07:33:21 > SELECT EVENT_SCHEMA,EVENT_NAME,
-> EVENT_DEFINITION,
    -> INTERVAL_FIELD,STATUS,LAST_EXECUTED
    -> FROM information_schema.EVENTS\G
*************************** 1. row *******************
    EVENT_SCHEMA: test
      EVENT_NAME: e_insert
EVENT_DEFINITION: insert into test.evnt values (now())
  INTERVAL_FIELD: SECOND
          STATUS: SLAVESIDE_DISABLED
   LAST_EXECUTED: NULL
1 row in set (0.00 sec)

新创建的event在master上的状态是ENABLED,在slave上的状态是SLAVESIDE_DISABLED。

修改event的状态

test [RW] 07:50:30 >SELECT EVENT_SCHEMA,EVENT_NAME,
-> EVENT_DEFINITION,
    -> INTERVAL_FIELD,STATUS,LAST_EXECUTED
    -> FROM information_schema.EVENTS\G
*************************** 1. row *********************** 
    EVENT_SCHEMA: test
      EVENT_NAME: e_insert
EVENT_DEFINITION: insert into test.evnt(dt) values (now())
  INTERVAL_FIELD: SECOND
          STATUS: DISABLED
   LAST_EXECUTED: 2018-06-07 19:41:51
1 row in set (0.00 sec)
(none) [RW]  07:51:00 >use test;
Database changed
test [RW]  07:51:02 >alter event e_insert enable;
Query OK, 0 rows affected (0.00 sec)
test [RW] 07:51:04 >SELECT EVENT_SCHEMA,EVENT_NAME,
-> EVENT_DEFINITION,
    -> INTERVAL_FIELD,STATUS,LAST_EXECUTED
    -> FROM information_schema.EVENTS\G
*************************** 1. row ***********************
    EVENT_SCHEMA: test
      EVENT_NAME: e_insert
EVENT_DEFINITION: insert into test.evnt(dt) values (now())
  INTERVAL_FIELD: SECOND
          STATUS: ENABLED
   LAST_EXECUTED: 2018-06-07 19:41:51
1 row in set (0.00 sec)

查看从库中event的状态

test [RO] 07:51:07 > SELECT EVENT_SCHEMA,EVENT_NAME,
-> EVENT_DEFINITION,
    -> INTERVAL_FIELD,STATUS,LAST_EXECUTED
    -> FROM information_schema.EVENTS\G
*************************** 1. row ***********************
    EVENT_SCHEMA: test
      EVENT_NAME: e_insert
EVENT_DEFINITION: insert into test.evnt(dt) values (now())
  INTERVAL_FIELD: SECOND
          STATUS: SLAVESIDE_DISABLED
   LAST_EXECUTED: NULL
1 row in set (0.00 sec)

可以看出,在主库上修改event的status状态不会改变slave上面的状态。

总结一下 主从对event_scheduler的影响:

  1. 在主库上新建event,在slave上event的状态为SLAVESIDE_DISABLED没有影响。
  2. 通过xtrabackup恢复出来的从库,如果有events那么需要在slave上把event_scheduler设置为off,并且检查 events的status状态,如果是enable,则需要执行: ALTER EVENT e_insert DISABLE ON SLAVE;
  3. 当主从发生切换时,需要人工(或者有配套的机制)来维护event的状态改为: 新主库 set global event_scheduler=on; alter event e_insert enable; 新从库 set global event_scheduler=off; alter event e_insert disable on slave;
  4. 在主库上对event的进行状态修改不影响从库的状态。

推荐阅读

https://dev.mysql.com/doc/refman/5.7/en/create-event.html

https://dev.mysql.com/doc/refman/5.7/en/alter-event.html

原文发表时间:2018-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 数据字典和数据字典视图

是元数据的集合,从逻辑上和物理上描述了数据库及内容,存储于SYSTEM与SYSAUX表空间内的若干段。

823
来自专栏数据库新发现

在Mac上通过Docker部署Oracle Database 12.2版本

Oracle 已经宣布支持了Docker部署,这也让我们在Mac上部署 Oracle 数据库有了多一个选择,这是我的第一个Docker应用,非常简便快速的就完...

3146
来自专栏Porschev[钟慰]的专栏

得到真实外网IP、IP所在国家、省份、地区

实现方式:通过正则抓取IP显示网站中的数据。。。。 友情提示:这种方式效率不算高,如果用在WEB中,如果用得少可以用这种方式,如果常用,还是建议用IP库 #r...

3405
来自专栏乐沙弥的世界

Oracle db_file_mulitblock_read_count参数

     Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数,可以影响系统级别及sessioin级别...

1013
来自专栏杨建荣的学习笔记

使用impdp不当导致的数据丢失问题(r5笔记第1天)

今天有个朋友问我们一个问题,说他在使用了impdp导入数据的时候,使用了TABLE_EXISTS_ACTION=REPLACE这个选项,结果现在数据都给覆盖了。...

3655
来自专栏乐沙弥的世界

从ORA-27300,ORA-27301到ORA-00064

    最近由于session数量增加,需要调整session,也就是要调整process参数。看是比较简单的一个问题,却遭遇了ORA-27300,ORA-2...

881
来自专栏数据和云

诊断案例:从实例挂起到归档失败和内存管理的蝴蝶效应

杨廷琨(yangtingkun) 云和恩墨 CTO 高级咨询顾问,Oracle ACE 总监,ITPUB Oracle 数据库管理版版主 编辑手记:在很多数据...

3239
来自专栏乐沙弥的世界

Oracle 联机重做日志文件(ONLINE LOG FILE)

--=========================================

1142
来自专栏乐沙弥的世界

ORA-02019 错误处理

       ORA-02019 错误提示是未找到远程数据库的连接说明,通常发生在本地数据库无法连接到远程数据库。引发该问题的原因很多,比如网络连接,连接方式(...

1211
来自专栏杨建荣的学习笔记

关于sysdba,sysoper,dba的区别(r3笔记第62天)

关于sysdba,sysoper,dba这些名词在工作中可能接触的比较多,如果接触的环境是服务器端的,sysdba可能是经常用到的。如果是数据库的维护工作,db...

2736

扫码关注云+社区

领取腾讯云代金券