1. Event事件介绍

有时候我们想让MySQL服务器在某个时间点或者每隔一段时间自动地执行一些语句 , 这时候就需要去创建一个事件。其实我觉得MySQL的事件就和Linux操作系统的定时任务一样(Crontab) , 设置某个时间点或者按照设置的时间频率执行某些特定任务。TRIGGER触发器一样 , 也不用像FUNCTION函数和PROCEDURE存储过程需要进行调用触发 , 事件只需要到设定的时间MySQL服务器自动触发

MySQL支持定时执行的计划任务 , 类似于Unix crontab或者Windows定时任务 ,被称为事件(Event)或者计划事件。事件是一个存储在数据库服务器中的SQL程序 , 在指定的时间范围内定期执行 , 调度和执行事件的服务被称为事件调度器(Event Scheduler)。

事件和触发器类似 , 都是在某些事情发生的时候启动。当数据库上启动一条语句的时候 , 触发器就启动了 , 而事件是根据调度事件来启动的。由于它们彼此相似 , 所以事件也称为临时性触发器。

事件取代了原先只能由操作系统的计划任务来执行的工作 , 而且MySQL的事件调度器可以精确到每秒钟 执行一个任务 , 而操作系统的计划任务(如: Linux下的CRONWindows下的任务计划)只能精确到 每分钟执行一次。

事件的优缺点

优点 : 一些对数据定时性操作不再依赖外部程序 , 而直接使用数据库本身提供的功能 , 可以实现每秒钟 执行一个任务 , 这在一些对实时性要求较高的环境下就非常实用

缺点 : 定时触发 , 不可以直接调用

2. Event管理

2.1 相关变量和服务器选项

MySQL事件调度器通过全局系统变量event_scheduler控制是否允许和启动事件调度器 , 默认是关闭的 , 它有三种可能的取值 :

  • ON , 表示启用事件调度器线程 , 负责事件的调度和执行, 系统自动打开专用的线程。

  • OFF , 默认值, 关闭事件调度器线程 , SHOW PROCESSLIST命令不再显示相关信息 , 计划事件不再执行。

  • DISABLED , 禁用事件调度器线程 , 不但停止了调度器线程 , 而且无法通过 ON 或者 OFF 设置它的状态。

MySQL事件调度器event_scheduler负责调用事件 , 。这个调度器不断地监视一个事件 是否要调用 , 要创建事件 , 必须打开调度器服务器系统变量和服务器选项:

  • 查看event_scheduler

    SELECT @@event_scheduler;
    SHOW VARIABLES LIKE 'event%';

    范例

    MariaDB [(none)]> select @@event_scheduler;
    +-------------------+
    | @@event_scheduler |
    +-------------------+
    | OFF               |
    +-------------------+
    1 row in set (0.000 sec)
    ​
    MariaDB [(none)]> SHOW VARIABLES LIKE 'event%';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | event_scheduler | OFF   |
    +-----------------+-------+
    1 row in set (0.001 sec)
  • 临时调整event功能

    开启功能命令

    SET GLOBAL event_scheduler = 1;
    SET GLOBAL event_scheduler = ON;

    关闭功能命令

    SET GLOBAL event_scheduler = 0; 
    SET GLOBAL event_scheduler = OFF;

    范例

    MariaDB [(none)]> SET GLOBAL event_scheduler = 1;
    Query OK, 0 rows affected (0.000 sec)
    ​
    MariaDB [(none)]> SHOW VARIABLES LIKE 'event%';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | event_scheduler | ON    |
    +-----------------+-------+
    1 row in set (0.000 sec)
    ​
    MariaDB [(none)]> show processlist ;
    +----+-----------------+-----------+------+---------+------+--------------------------+------------------+----------+
    | Id | User            | Host      | db   | Command | Time | State                    | Info             | Progress |
    +----+-----------------+-----------+------+---------+------+--------------------------+------------------+----------+
    .....
    | 38 | event_scheduler | localhost | NULL | Daemon  |  192 | Waiting on empty queue   | NULL             |    0.000 |
    +----+-----------------+-----------+------+---------+------+--------------------------+------------------+----------+
    7 rows in set (0.000 sec)
    ​
  • 持久化配置

    [root@centos8 ~]# cat /etc/my.cnf
    [client-server]
    [mysqld]
    event_scheduler=ON
    !includedir /etc/my.cnf.d
    ​
    或
    [root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
    [mysqld]
    event_scheduler=ON
    [root@centos8 ~]#systemctl restart mariadb
    ​
  • 禁用event_scheduler

    只有在启动服务的时候才能够将事件调度器设置为DISABLED ,运行时无法从ON或者OFF设置为DISABLED ; 同样也无法在运行时从DISABLED修改为其他状态。在启动服务时指定以下命令行参数可以禁用事件调度器 :

    --event-scheduler=DISABLED

    MySQL配置文件中的[mysqld] 部分增加以下配置项:

    event_scheduler=DISABLED

    [root@localhost mysql]# cat  /etc/my.cnf
    [client-server]
    [mysqld]
    event_scheduler=DISABLED
    !includedir /etc/my.cnf.d
    
    MariaDB [(none)]> SHOW VARIABLES LIKE 'event%';
    +-----------------+----------+
    | Variable_name   | Value    |
    +-----------------+----------+
    | event_scheduler | DISABLED |
    +-----------------+----------+
    1 row in set (0.001 sec)
    
    MariaDB [(none)]> SET GLOBAL event_scheduler = 1;
    ERROR 1290 (HY000): The MariaDB server is running with the --event-scheduler=DISABLED or --skip-grant-tables option so it cannot execute this statement

2.2 管理事件

create event语句创建一个事件。每个事件由两个主要部分组成 , 第一部分是事件调度(event schedule) , 表示事件何时启动以及按什么频率启动 , 第二部分是事件动作(event action ) , 这是事件启动时执行的代码 , 事件的动作包含一条SQL语句 , 它可能是一个简单地insert或者update语句 , 也可以使一个存储过程或者benin...end语句块 , 这两种情况允许我们执行多条SQL

一个事件可以是活动(打开)的或停止(关闭)的 , 活动意味着事件调度器检查事件动作是否必须调用 , 停止意味着事件的声明存储在目录中 , 但调度器不会检查它是否应该调用。在一个事件创建之后 , 它立即变为活动的 , 一个活动的事件可以执行一次或者多次

创建事件

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

说明 :

event_name : 创建的event名字 , 必须是唯一确定的

ON SCHEDULE : 计划任务

schedule : 决定event的执行时间和频率(注意时间一定要是将来的时间 , 过去的时间会出错) , 有两种形式ATEVERY

[ON COMPLETION [NOT] PRESERVE] : 可选项 , 默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件 ; ON COMPLETION PRESERVE则不会drop

[COMMENT 'comment'] : 可选项 , comment用来描述event ; 相当注释 , 最大长度64个字节

[ENABLE | DISABLE] :设定event的状态 , 默认ENABLE : 表示系统尝试执行这个事件 , DISABLE : 关闭该事情 , 可以用alter修改

DO event_body : 需要执行的sql语句 , 可以是复合语句

提示 : event事件是存放在mysql.event表中

  • 创建单此定时执行事件

    AT TIMESTAMP 时间字符串 [+ INTERVAL INTERVAL]

    AT TIMESTAMP表示该事件只执行一次 , TIMESTAMP表示一个具体的时间点 , 后面可以加上一个时间间隔 , 表示在这个时间间隔后事件发生。[+ INTERVAL INTERVAL]表示延迟触发时间 ;

    需要注意的是 , TIMESTAMP和具体字符串连用 , 如果不是具体字符串( 如CURRENT_TIMESTAMP取当前时间等 ) , 则不加TIMESTAMP;

    : 就在AT ... 语句和DO ... 语句中间加ON COMPLETION PRESERVE ,指定某个时间点执行的事件执行完成后就不会被删除了。

    #往demo_1119表中插入一行数据 , 执行时间 : 2020-11-20 00:00:00
    CREATE EVENT demo_event2 
    ON SCHEDULE AT TIMESTAMP '2020-11-20 00:00:00' 
    DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, '陈哈哈', NOW())
    
    mysql> select * from demo_1119;
    +-----+-----------+---------------------+
    | id  | name      | createTime          |
    +-----+-----------+---------------------+
    | 145 | 陈哈哈    | 2020-11-20 00:00:00 |
    +-----+-----------+---------------------+
    9 rows in set (0.00 sec)
    
    
    #往demo_1119表中插入一行数据 , 执行时间 : 当前时间往后5个小时;
    CREATE EVENT demo_event2 
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 HOUR
    DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, '陈哈哈', NOW())
  • 创建循环定时执行事件

    EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

    EVERY表示循环执行该事件 , 其中STARTS子句用于指定开始时间 ; ENDS子句用于指定结束时间。

    • 时间配置说明

      表示事件间隔的单位除了HOUR , 还可以用YEARQUARTERMONTHDAYHOURMINUTEWEEKSECONDYEAR_MONTHDAY_HOURDAY_MINUTEDAY_SECONDHOUR_MINUTEHOUR_SECONDMINUTE_SECOND这些单位 ,根据具体需求选用我们需要的时间间隔单位。

      • 每隔1分钟执行

        ON SCHEDULE EVERY 1 MINUTE
      • 每天凌晨1点执行

        ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(), INTERVAL 1 DAY), INTERVAL 1 HOUR)
      • 每个月的第1天凌晨1点执行

        ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY),INTERVAL 1 MONTH),INTERVAL 1 HOUR)
      • 每3个月 , 从现在起1周后开始

        ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK
      • 每12个小时 , 从现在起30分钟后开始 , 并于现在起4个星期后结束

        ON SCHEDULE EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK

    #从当前开始 , 每10秒往demo_1119表中插入一行数据
    CREATE EVENT demo_event3 
    ON SCHEDULE EVERY 10 SECOND 
    ON COMPLETION PRESERVE 
    DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, '陈哈哈', NOW())
    
    mysql> select * from demo_1119;
    +-----+-----------+---------------------+
    | id  | name      | createTime          |
    +-----+-----------+---------------------+
    | 145 | 陈哈哈    | 2020-11-19 11:10:39 |
    | 146 | 陈哈哈    | 2020-11-19 11:10:49 |
    | 147 | 陈哈哈    | 2020-11-20 11:10:59 |
    | 148 | 陈哈哈    | 2020-11-20 11:11:09 |
    | 149 | 陈哈哈    | 2020-11-20 11:11:19 |
    | 150 | 陈哈哈    | 2020-11-20 11:11:29 |
    | 151 | 陈哈哈    | 2020-11-20 11:11:39 |
    +-----+-----------+---------------------+
    9 rows in set (0.00 sec)
    
    #从2020-11-20 12:00:00开始 , 每10分钟往demo_1119表中插入一行数据
    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 | 陈哈哈    | 2020-11-20 12:00:00 |
    | 153 | 陈哈哈    | 2020-11-20 12:10:00 |
    | 154 | 陈哈哈    | 2020-11-20 12:20:00 |
    | 155 | 陈哈哈    | 2020-11-20 12:30:00 |
    | 156 | 陈哈哈    | 2020-11-20 12:40:00 |
    +-----+-----------+---------------------+
    5 rows in set (0.00 sec)
    
    
    #从当前时间一小时后开始 , 每10分钟往demo_1119表中插入一行数据;已经测试过可用 , 我就不再贴冗余查询的数据咯~
    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, '陈哈哈', NOW())
    
    #从当前时间一天后开始 , 每1小时往demo_1119表中插入一行数据 , 三天后结束
    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, '陈哈哈', NOW())
    
    #每天零点定时清一下demo_1119表数据
    CREATE EVENT demo_event5 
    ON SCHEDULE EVERY 1 DAY STARTS '2020-11-20 00:00:00' 
    ON COMPLETION PRESERVE 
    DO TRUNCATE table `demo_1119`

查看event

SHOW EVENTS [{FROM | IN} schema_name]
   [LIKE 'pattern' | WHERE expr]

注意 : 事件执行完即释放 , 如立即执行事件 , 执行完后 , 事件便自动删除 , 多次调用事件或等待执行事件,才可以用上述命令查看到。

修改event

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 'comment']
   [DO event_body]
  • 关闭事件任务: ALTER EVENT 事件名称 ON COMPLETION PRESERVE DISABLE;

  • 开启事件任务: ALTER EVENT 事件名称 ON COMPLETION PRESERVE ENABLE;

注意: alter event语句可以修改事件的定义和属性。可以让一个事件成为停止的或者再次让它活动 , 也可以修改一个事件的名字或者整个调度。然而当一个使用ON COMPLETION NOT PRESERVE属性定义的事件最后一次执行后 , 事件直接就不存在了 , 不能修改

删除event

DROP EVENT [IF EXISTS] event_name

2.3 范例

范例 : 创建立即启动事件

MariaDB [(none)]> create database testdb;
#创建一个表记录每次事件调度的名字和事件戳
MariaDB [testdb]> create table events_list(event_name varchar(20) not null, 
event_started timestamp not null);

#临时关闭事件调度功能
MariaDB [testdb]> set global event_scheduler=0;
Query OK, 0 rows affected (0.000 sec)
MariaDB [testdb]> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set (0.001 sec)
#创建一次性事件
MariaDB [testdb]> create event event_now   on schedule   at now()   do insert
into events_list values('event_now', now());
Query OK, 0 rows affected (0.001 sec)

#因为事件调度功能禁用 , 所有表中无记录
MariaDB [testdb]> select *from events_list;
Empty set (0.000 sec)
#查看事件
MariaDB [testdb]> show events\G;
*************************** 1. row ***************************
                  Db: testdb
                Name: event_now
             Definer: root@localhost
           Time zone: SYSTEM
                Type: ONE TIME
          Execute at: 2023-03-17 21:34:13
      Interval value: NULL
      Interval field: NULL
              Starts: NULL
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)


#任务计划存放在mysql.event表中
MariaDB [testdb]> select * from mysql.event\G;
*************************** 1. row ***************************
                  db: testdb
                name: event_now
                body: insert
into events_list values('event_now', now())
             definer: root@localhost
          execute_at: 2023-03-17 13:34:13
      interval_value: NULL
      interval_field: NULL
             created: 2023-03-17 21:34:13
            modified: 2023-03-17 21:34:13
       last_executed: NULL
              starts: NULL
                ends: NULL
              status: ENABLED
       on_completion: DROP
            sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             comment: 
          originator: 1
           time_zone: SYSTEM
character_set_client: utf8
collation_connection: utf8_general_ci
        db_collation: latin1_swedish_ci
           body_utf8: insert
into events_list values('event_now', now())
1 row in set (0.000 sec)


#开启事件调度功能
MariaDB [testdb]> set global event_scheduler=1;
Query OK, 0 rows affected (0.000 sec)
#事件立即执行 , 每秒插入一条记录
MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-17 21:38:35 |
+------------+---------------------+
1 row in set (0.000 sec)
#事件执行完成后自动删除
MariaDB [testdb]> show events;
Empty set (0.000 sec)

范例 : 创建每秒启动的事件

MariaDB [testdb]> CREATE EVENT event_every_second   ON SCHEDULE   EVERY 1 SECOND 
DO INSERT INTO events_list VALUES('event_now', now());
MariaDB [testdb]> show events\G;
*************************** 1. row ***************************
                  Db: testdb
                Name: event_every_second
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: SECOND
              Starts: 2023-03-17 21:41:02
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)
#事件是存放在mysql.event表中
MariaDB [testdb]> select * from mysql.event\G;
*************************** 1. row ***************************
                  db: testdb
                name: event_every_second
                body: INSERT INTO events_list VALUES('event_now', now())
             definer: root@localhost
          execute_at: NULL
      interval_value: 1
      interval_field: SECOND
             created: 2023-03-17 21:41:02
            modified: 2023-03-17 21:41:02
       last_executed: 2023-03-17 13:41:39
              starts: 2023-03-17 13:41:02
                ends: NULL
              status: ENABLED
       on_completion: DROP
            sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             comment: 
          originator: 1
           time_zone: SYSTEM
character_set_client: utf8
collation_connection: utf8_general_ci
        db_collation: latin1_swedish_ci
           body_utf8: INSERT INTO events_list VALUES('event_now', now())
1 row in set (0.000 sec)


MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-17 21:38:35 |
| event_now  | 2023-03-17 21:41:02 |
| event_now  | 2023-03-17 21:41:03 |
| event_now  | 2023-03-17 21:41:04 |
.......
+------------+---------------------+

20 rows in set (0.000 sec)
MariaDB [testdb]> drop event event_every_second;
Query OK, 0 rows affected (0.000 sec)
MariaDB [testdb]> SHOW EVENTS\G
Empty set (0.001 sec)
MariaDB [testdb]> select *from mysql.event\G
Empty set (0.000 sec)

范例 : 创建每分钟启动的事件

MariaDB [testdb]> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON   |
+-----------------+-------+
1 row in set (0.001 sec)
MariaDB [testdb]> create event testdb.event_every_minute   on schedule   every
1 minute    do insert into events_list values('event_now', now());
Query OK, 0 rows affected (0.001 sec)
MariaDB [testdb]> select now();
+---------------------+
| now()               |
+---------------------+
| 2023-03-18 18:22:39 |
+---------------------+
1 row in set (0.000 sec)

MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-18 18:21:47 |
+------------+---------------------+
1 row in set (0.000 sec)

MariaDB [testdb]> show events\G ;
*************************** 1. row ***************************
                  Db: testdb
                Name: event_every_minute
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: MINUTE
              Starts: 2023-03-18 18:19:47
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)

MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-18 18:21:47 |
| event_now  | 2023-03-18 18:22:47 |
| event_now  | 2023-03-18 18:23:47 |
+------------+---------------------+
3 rows in set (0.000 sec)

范例 : 创建定时调用存储过程的事件

MariaDB [testdb]> drop event event_every_minute;
Query OK, 0 rows affected (0.000 sec)
MariaDB [testdb]> truncate table events_list;
Query OK, 0 rows affected (0.010 sec)
MariaDB [testdb]> select *from events_list;
Empty set (0.000 sec)
MariaDB [testdb]> delimiter //
MariaDB [testdb]> create procedure sp_insert()  
   -> begin
   -> insert into events_list values('event_now', now());
   -> end//
Query OK, 0 rows affected (0.001 sec)
MariaDB [testdb]> delimiter ;
MariaDB [testdb]> CREATE definer=`root`@`localhost` EVENT event_test ON SCHEDULE EVERY 10 SECOND STARTS '2023-03-18 18:33:00' ON COMPLETION PRESERVE ENABLE DO call sp_insert();
Query OK, 0 rows affected (0.001 sec)

MariaDB [testdb]> select now();
+---------------------+
| now()               |
+---------------------+
| 2023-03-18 18:36:40 |
+---------------------+
1 row in set (0.000 sec)

MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-18 18:33:00 |
| event_now  | 2023-03-18 18:33:10 |
| event_now  | 2023-03-18 18:33:20 |
....
| event_now  | 2023-03-18 18:36:50 |
+------------+---------------------+
24 rows in set (0.000 sec)

范例 : 修改事件

MariaDB [testdb]> ALTER DEFINER=`root`@`localhost` EVENT event_test ON SCHEDULE EVERY 30 SECOND ON COMPLETION PRESERVE ENABLE DO call sp_insert();
Query OK, 0 rows affected (0.000 sec)


MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-18 18:41:20 |
| event_now  | 2023-03-18 18:41:50 |
| event_now  | 2023-03-18 18:42:20 |
+------------+---------------------+
3 rows in set (0.000 sec)

#禁用事件
MariaDB [testdb]> alter event testdb.event_test disable; 
MariaDB [testdb]> show events\G;
*************************** 1. row ***************************
                  Db: testdb
                Name: event_test
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 30
      Interval field: SECOND
              Starts: 2023-03-18 18:40:20
                Ends: NULL
              Status: DISABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)

MariaDB [testdb]> select now();
+---------------------+
| now()               |
+---------------------+
| 2023-03-18 18:46:53 |
+---------------------+
1 row in set (0.000 sec)

MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-18 18:41:20 |
| event_now  | 2023-03-18 18:41:50 |
| event_now  | 2023-03-18 18:42:20 |
| event_now  | 2023-03-18 18:42:50 |
| event_now  | 2023-03-18 18:43:20 |
| event_now  | 2023-03-18 18:43:50 |
| event_now  | 2023-03-18 18:44:20 |
| event_now  | 2023-03-18 18:44:50 |
| event_now  | 2023-03-18 18:45:20 |
+------------+---------------------+
9 rows in set (0.000 sec)



#启用事件
MariaDB [testdb]> alter event testdb.event_test enable; 
Query OK, 0 rows affected (0.000 sec)

MariaDB [testdb]> show events\G;
*************************** 1. row ***************************
                  Db: testdb
                Name: event_test
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 30
      Interval field: SECOND
              Starts: 2023-03-18 18:40:20
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)

MariaDB [testdb]> select * from events_list;
+------------+---------------------+
| event_name | event_started       |
+------------+---------------------+
| event_now  | 2023-03-18 18:41:20 |
| event_now  | 2023-03-18 18:41:50 |
| event_now  | 2023-03-18 18:42:20 |
| event_now  | 2023-03-18 18:42:50 |
| event_now  | 2023-03-18 18:43:20 |
| event_now  | 2023-03-18 18:43:50 |
| event_now  | 2023-03-18 18:44:20 |
| event_now  | 2023-03-18 18:44:50 |
| event_now  | 2023-03-18 18:45:20 |
| event_now  | 2023-03-18 18:47:50 |
+------------+---------------------+
10 rows in set (0.000 sec)


#修改事件名称
MariaDB [testdb]> alter event testdb.event_test rename to event_test2;
Query OK, 0 rows affected (0.000 sec)

MariaDB [testdb]> show events\G;
*************************** 1. row ***************************
                  Db: testdb
                Name: event_test2
             Definer: root@localhost
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 30
      Interval field: SECOND
              Starts: 2023-03-18 18:40:20
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: latin1_swedish_ci
1 row in set (0.001 sec)
MariaDB [testdb]> drop event  event_test2;
Query OK, 0 rows affected (0.000 sec)

MariaDB [testdb]> show events;
Empty set (0.000 sec)


熊熊