MySQL数据库DDL操做之事件调度器

MySQL中的事件调度器是在5.1版本以后新增的,能够在数据库中定时触发某种操做,相似于Spring中的Quartz定时任务或者Linux中的crontab任务调度器,下面将介绍MySQL中事件调度器的用法。

一、调度器的建立:
(1)语法:mysql

CREATE EVENT event_name ON SCHEDULE <time_frequency> DO <event_statement>;

参数解释:sql

event_name:表示自定义的事件调度器的名称,放在CREATE EVENT关键字以后;
time_frequency:表示该事件调度器什么时间执行以及执行周期为多少;
event_statement:表示该事件调度器中要执行的具体操做或者事件,能够为一个语句,也能够为一个语句块,即:由BEGIN...END包含的语句块,中间能够添加一些执行逻辑,须要使用\d指定定界符。除此以外,还能够在event_statement中调用其余的存储过程和函数;

(2)示例:数据库

示例1:建立一张测试表t_test,每隔10秒钟向该表中插入一条记录,操做以下:服务器

建立表结构:函数

mysql> CREATE TABLE t_test(
           id INT PRIMARY KEY AUTO_INCREMENT,
            name VARCHAR(10) NOT NULL DEFAULT '',
            create_time DATETIME
       ) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

建立事件调度器:性能

mysql> CREATE EVENT insert_event 
    ON SCHEDULE EVERY 10 SECOND 
    DO 
        INSERT INTO t_test(name,create_time) VALUES('test_name',NOW());

10秒以后查询t_test表,结果以下:学习

mysql> SELECT * FROM t_test;
Empty set (0.00 sec)

发现并无起做用,10秒以后并未插入数据,这是因为事件调度器未打开致使,经过以下命令查看事件调度器的状态,发现结果为OFF,表示未打开:测试

mysql> SHOW VARIABLES LIKE 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

使用以下命令打开事件调度器:操作系统

mysql> SET GLOBAL event_scheduler = ON;
或者使用:mysql> SET @@global.event_scheduler = ON;
Query OK, 0 rows affected (0.11 sec)

再次查看,已经打开事件调度器:线程

mysql> SHOW VARIABLES LIKE 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+
1 row in set (0.00 sec)

打开事件调度器的开关以后,在通过10秒,查看t_test表,发现事件调度器已经正常执行了,以下:

mysql> SELECT * FROM t_test;
+----+-----------+---------------------+
| id | name      | create_time         |
+----+-----------+---------------------+
|  1 | test_name | 2018-05-16 16:58:45 |
+----+-----------+---------------------+

注意:上述使用"SET GLOBAL"命令只能全局修改服务器参数,若是数据库重启,该参数会失效。若是要永久修改,须要修改MySQL的配置文件,编辑/etc/my.cnf,在[mysqld]中添加以下内容:

[mysqld]
event_scheduler = ON  #添加该项
...

示例2:上述示例是每10秒给t_test表中插入一条记录,表中的记录会快速增多,如今经过另一个事件调度器,完成每1分钟清空一次t_test表中的记录,以下:
建立事件调度器:

mysql> CREATE EVENT clear_event
ON SCHEDULE EVERY 1 MINUTE
DO
    TRUNCATE TABLE t_test;

建立完成以后,马上查看,会发现t_test表中的数据已经被清空,再10秒后差生的数据,在1分钟以后又会被再次清空:

mysql> SELECT * FROM t_test;
Empty set (0.00 sec)

示例3:按期清理t_log日志表,并将清除时间及清除的记录数量写入t_delete_log中,经过事件调度器和存储过程实现:
建立t_delete_log表:

CREATE TABLE t_delete_log(
    id INT PRIMARY KEY AUTO_INCREMENT,
    delete_time DATETIME,
    delete_count INT DEFAULT 0
) ENGINE = InnoDB DEFAULT CHARSET = UTF8;

建立存储过程:

mysql> \d $
mysql> CREATE PROCEDURE p_clear()
    BEGIN
        DECLARE d_count INT DEFAULT 0;
        SET AUTOCOMMIT = 0;
        SET d_count = (SELECT COUNT(*) FROM t_log);
        # 判断是否有待清除的数据
        IF d_count > 0 THEN
            TRUNCATE t_log;
            INSERT INTO t_delete_log(delete_time,delete_count) VALUES(NOW(),d_count);
        END IF;
        COMMIT;
    END $
mysql> \d ;

建立事件调度器:

mysql> CREATE EVENT student_clear_event
    ON SCHEDULE EVERY 1 MINUTE
    DO
        CALL p_clear();

上述事件调度器会每隔1分钟调用一次清除表数据的存储过程,完成一次历史数据清理及记录归档,综合使用到了事件调度器和存储过程。

二、调度器信息的查看:
语法:

SHOW EVENTS <LIKE statement>; #查看已有调度器的信息,能够添加LIKE对调度器的名称进行筛选
SHOW CREATE EVENT event_name; #查看指定名称的调度器的建立信息
SHOW PROCESSLIST; #若是用户具备PROCESS权限,可使用该命令查看调度器的线程状态
SELECT <field> FROM information_schema.event; #也能够从系统库中查看

输出结果中重要参数说明:

Db:表示调度器所在的数据库
Name:表示调度器的名称,可使用Like条件过滤查看
Definer:表示调度器的定义者
Time zone:表示调度器使用的时区,SYSTEM表示使用系统默认的时区
Interval value:表示调度器时间周期的单位,包括:YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
Starts:表示调度器的开始执时间
Status:表示调度器的可用状态,包括:ENABLE,DISABLE,ENABLE ON SLAVE

示例1:查看在test库中建立的事件调度器,能够发现刚才建立的调度器器insert_event和clear_event,以下:

mysql> USE test;
mysql> SHOW EVENTS \G
*************************** 1. row ***************************
                  Db: test
                Name: clear_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2018-05-16 17:08:43
                Ends: NULL
              Status: ENABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: test
                Name: insert_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2018-05-16 16:53:55
                Ends: NULL
              Status: ENABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.00 sec)

示例2:查看触发器clear_event的建立信息:

mysql> USE test;
mysql> SHOW CREATE EVENT clear_event;
*************************** 1. row ***************************
               Event: clear_event
            sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
           time_zone: SYSTEM
        Create Event: CREATE DEFINER=`root`@`127.0.0.1` EVENT `clear_event` ON SCHEDULE EVERY 1 MINUTE STARTS '2018-05-16 17:08:43' ON COMPLETION NOT PRESERVE ENABLE DO TRUNCATE TABLE t_test
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

示例3:查看调度器的线程状态:

mysql> SHOW PROCESSLIST \G
*************************** 1. row ***************************
     Id: 1
   User: event_scheduler
   Host: localhost
     db: NULL
Command: Daemon
   Time: 55
  State: Waiting for next activation
   Info: NULL

三、调度器的修改:
语法:

ALTER
    [DEFINER = { user | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name] #修更名称,支持RENAME语法
    [ENABLE | DISABLE | DISABLE ON SLAVE] #将其修改成可用或者不可用
    [COMMENT 'string'] #添加注释信息
    [DO event_body]

示例:
示例1:将test库中的insert_event事件调度器更名为save_event,操做以下:

mysql> USE test;
mysql> ALTER EVENT insert_event RENAME TO save_event;
mysql> SHOW EVENTS  LIKE 'save_event'\G
*************************** 1. row ***************************
                  Db: test
                Name: save_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2018-05-16 16:53:55
                Ends: NULL
              Status: ENABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

#查看,发现已经修改。

示例2:将save_event调度器改成不可用:

mysql> USE test;
mysql> ALTER EVENT save_event DISABLE;
#查看save_event,发现Status已经变为DISABLE,表示该调度器已经不可用了
mysql> SHOW EVENTS LIKE 'save_event'\G
*************************** 1. row ***************************
                  Db: test
                Name: save_event
             Definer: root@127.0.0.1
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: SECOND
              Starts: 2018-05-16 16:53:55
                Ends: NULL
              Status: DISABLED
          Originator: 3
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

#修改完成以后,再次查看save_event,已经发现没有新数据插入了,表示修改生效。

四、调度器的禁用和删除:
语法:

ALTER EVENT event_name DISABLE; #禁用某个调度器
DROP EVENT [IF EXISTS] event_name;  #删除某个调度器

示例:禁用和删除save_event事件调度器并查看:

mysql> USE test;

#若是某个调度器不用了,能够先把其禁用
mysql> ALTER EVENT save_event DISABLE;

#肯定删除以后,可使用DROP完成调度器删除操做
mysql> DROP EVENT save_event;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW EVENTS LIKE 'save_event';
Empty set (0.00 sec)

五、调度器的优缺点及适用场景:
(1)优势:
a.能够实现相似于操做系统层面的定时任务调度;
b.能够再数据库层面解决事件的调度,由DBA统一维护,不依赖于操做系统层面的事件调度,有效防止了系统维护人员误操做调度器而致使的错误;

(2)缺点:
a.在服务器繁忙的状况下,或者功能对于性能要求很高的状况下,使用调度器会对性能产生必定影响,由于调度器也是在后台开启线程一直在运行及判断;
b.须要具备SUPER权限的用户才能够建立调度器,而SUPER用户权限通常开发人员是不可能具备的,须要DBA专门建立;

(3)适用场景:
a.历史数据按期统计
b.过时数据清除

至此,MySQL事件调度器的内容介绍完毕,下篇文章将详细介绍MySQL中索引的使用,原理及注意事项,欢迎你们评论,转发,共同窗习~

后续更多文章将更新在我的小站上,欢迎查看。

另外提供一些优秀的IT视频资料,可免费下载!如须要请查看https://www.592xuexi.com

相关文章
相关标签/搜索