MySQL的事件

MYSQL的事件是5.1新增加的,如果想体验,建议升级版本。
至于语法我就不多说了,手册上讲的很详细,我来说说几个要点以及一些实例。
注意事项:
1、EVENT权限是针对模式的(在MYSQL中也就是库的级别),不能对单独表来赋予权限。
2、必须在全局开启。
3、性能上的损失一定得考虑到。

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

mysql> set global event_scheduler = on;
Query OK, 0 rows affected (0.00 sec)

mysql> use event;
Database changed
例子:
我们来创建一个简单的文章表:
mysql> create table article (id serial,title varchar(64) not null, author_name varchar(64),content mediumtext not null, create_time datetime not null,update_time datetime not null);
Query OK, 0 rows affected (0.01 sec)
以及统计表:
mysql> create table report (id int not null auto_increment primary key, r_date date not null,aid int not null,total int not null);
Query OK, 0 rows affected (0.01 sec)



mysql> 插入测试数据。。。
我们来建立一个存储过程。

mysql> delimiter ||
mysql> create procedure sp_report()
    -> begin
    -> insert into report(r_date,aid,total) select date(update_time) as r_date, id,count(1) from article group by date(create_time) order by r_date asc;
    -> end||
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

创建EVENT;
在一分钟后执行这个存储过程。
mysql> create event report_dawn on schedule at date_add(now(),interval 1 minute) on completion preserve do call sp_report();
Query OK, 0 rows affected (0.00 sec)



mysql> show processlist;
|  7 | event_scheduler | localhost         | NULL   | Daemon  |     5 | Waiting for next activation | NULL             |
mysql> select * from report;
Empty set (0.00 sec)

察看现在的EVENT
mysql> show create event report_dawn\G
*************************** 1. row ***************************
               Event: report_dawn
            sql_mode:
           time_zone: SYSTEM
        Create Event: CREATE EVENT `report_dawn` ON SCHEDULE AT '2008-03-21 15:46:57' ON COMPLETION PRESERVE DISABLE DO call sp_report()
character_set_client: latin1
collation_connection: latin1_swedish_ci
  Database Collation: utf8_general_ci
1 row in set (0.00 sec)

mysql>


我们来查看更新后的结果:
mysql> select * from report;
+----+------------+-----+-------+
| id | r_date     | aid | total |
+----+------------+-----+-------+
|  1 | 2008-03-21 |   1 |     3 |
|  2 | 2008-03-22 |  16 |     1 |
|  3 | 2008-03-23 |   4 |     2 |
|  4 | 2008-03-23 |   6 |     2 |
|  5 | 2008-03-23 |   7 |     1 |
|  6 | 2008-03-23 |   8 |     2 |
|  7 | 2008-03-23 |  10 |     2 |
|  8 | 2008-04-13 |  12 |     1 |
|  9 | 2008-04-13 |  13 |     2 |
+----+------------+-----+-------+
9 rows in set (0.00 sec)
现在看看这个EVENT的状态,
mysql> select event_schema,event_name,status from information_schema.events where event_schema = 'event';
+--------------+-------------+----------+
| event_schema | event_name  | status   |
+--------------+-------------+----------+
| event        | report_dawn | DISABLED |
+--------------+-------------+----------+
1 row in set (0.00 sec)
已经停止运行了。


mysql> select * from report;
+----+------------+-----+-------+
| id | r_date     | aid | total |
+----+------------+-----+-------+
|  1 | 2008-03-21 |   1 |     3 |
|  2 | 2008-03-22 |  16 |     1 |
|  3 | 2008-03-23 |   4 |     2 |
|  4 | 2008-03-23 |   6 |     2 |
|  5 | 2008-03-23 |   7 |     1 |
|  6 | 2008-03-23 |   8 |     2 |
|  7 | 2008-03-23 |  10 |     2 |
|  8 | 2008-04-13 |  12 |     1 |
|  9 | 2008-04-13 |  13 |     2 |
| 10 | 2008-03-21 |   1 |     3 |
| 11 | 2008-03-22 |  16 |     1 |
| 12 | 2008-03-23 |   4 |     2 |
| 13 | 2008-03-23 |   6 |     2 |
| 14 | 2008-03-23 |   7 |     1 |
| 15 | 2008-03-23 |   8 |     2 |
| 16 | 2008-03-23 |  10 |     2 |
| 17 | 2008-04-13 |  12 |     1 |
| 18 | 2008-04-13 |  13 |     2 |
+----+------------+-----+-------+
18 rows in set (0.00 sec)


多了9条记录,
不过默认修改时间后。
在运行完毕后没有保存它。
因为时间已经过去了。
mysql> select event_schema,event_name,status from information_schema.events where event_schema = 'event';
Empty set (0.00 sec)

ON COMPLETION [NOT]PRESERVE
这个选项用来确认事件在执行完毕后是否保存其定义。
### 如何调整或调度 MySQL 事件(Event Scheduler) #### 调整 Event Scheduler 的状态 要控制 MySQL 事件调度器的状态,可以通过设置 `event_scheduler` 系统变量来实现。该变量有三个可能的值:`ON`, `OFF`, 和 `DISABLED`。当其值为 `ON` 时表示事件调度器已启用;如果为 `OFF` 则表示禁用但仍然保留定义好的事件;而 `DISABLED` 表示完全关闭并忽略所有的事件配置。 可以在运行时动态更改此参数或者通过 my.cnf 文件永久生效[^3]: ```sql SET GLOBAL event_scheduler = ON; ``` 上述语句会立即激活当前实例上的事件调度功能。 #### 创建新的 MySQL 事件 为了新建一个周期性的任务,需要用到 CREATE EVENT 命令。下面是一个简单的例子展示如何每天凌晨两点删除超过一个月的日志记录表中的条目[^2]: ```sql CREATE EVENT IF NOT EXISTS cleanup_old_logs ON SCHEDULE EVERY 1 DAY STARTS '2023-09-01 02:00:00' DO DELETE FROM logs WHERE created_at < DATE_SUB(CURDATE(), INTERVAL 1 MONTH); ``` 这里需要注意的是,在创建之前应该确认是否有足够的权限去执行这样的操作以及确保所指定的时间格式正确无误。 #### 修改现有的 MySQL 事件 对于已经存在的事件对象来说,我们无法直接对其进行编辑。但是可以先将其丢弃再重新建立一个新的同名替代品达到目的: ```sql ALTER EVENT existing_event_name DISABLE; -- 或者 DROP EVENT existing_event_name; -- 接着按照需求重建它... CREATE EVENT ... ``` 另外一种方法就是利用 ALTER EVENT 来改变某些属性而不必彻底移除原事件: ```sql ALTER EVENT existing_event_name RENAME TO new_event_name; ALTER EVENT existing_event_name ENABLE|DISABLE; ``` 以上两种方式都可以满足不同场景下的修改要求。 #### 删除不再需要的 MySQL 事件 最后,如果你发现某个特定的任务已经没有必要继续存在下去,则可以直接把它给删掉即可: ```sql DROP EVENT unnecessary_event; ``` 这一步骤非常简单明了,只需提供准确的目标名称就可以了。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值