简介
事件(event)
是MySQL在相应的时刻调用的过程式数据库对象,它由一个特定的线程来管理的,也就是所谓的 事件调度器
。
有两种调度方式。
- 一次性的调用。
- 周期性的调用。
事件和触发器类似,都是在某些事情发生的时候启动。当数据库上启动一条语句的时候,触发器就启动了,而事件是根据 调度事件
来启动的。由于他们彼此相似,所以事件也称为临时性触发器
。
MySQL事件跟Windows
和 Linux(crontab)
系统中的定时任务很像,在特定的时间内执行任务。但是它们只能精确到分钟,而MySQL event
事件可以实现每秒都去执行任务。
优缺点
- 优点
- 一些对数据定时性操作不再依赖外部程序,而直接使用数据库本身提供的功能。
- 可以实现每秒钟执行一个任务,这在一些对实时性要求较高的环境下就非常实用了。
- 缺点
- 定时触发,不可以调用。
问题
MySQL 的定时触发的event
建好后没有发生预定的事件,归纳起来有以下几种:
- 全局的
event
是关闭的; - 用户权限的修改导致
event
失效(这种情况很少发生); -
event
设成了DISABLE
;
解决方案
下面来演示如何解决上面出现所出现的问题
问题1 解决方案:
- 临时修改
(不推荐)
实际上MySQL的
event
默认值是off
进入MySQL命令行模式
- 查看
event
是否开启:show variables like 'event_scheduler';
这时你会发现event_scheduler
的值是OFF
mysql> show variables like 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | OFF | +-----------------+-------+
- 临时开启
event
事件:set global event_scheduler=1;
输入完上面的命令后在执行查看命令会发现 event_scheduler
的值变成了 ON
了。
但是针对上面的操作方案个人是不推荐的。因为这只是临时的,当数据库重新启动的时候,以上方法就会失效,event_scheduler
的值会还原成默认值 OFF
。
- 通过修改配置文件的方式
(推荐)
windows
系统的 MySQL的配置文件名是my.ini
;Linux
系统的 MySQL 的配置文件名是my.cnf
;
- 打开配置文件在
[mysqld]
模块下添加event_scheduler=on
或event_scheduler=1
;- 重新启动MySQL。
问题 2 解决方案(暂未遇到过):
这种情况很少发生,但发生后又找不到问题,那就看看你建的event
所属者有没有这个执行权限吧。
执行下面的SQL语句:
-- 查看用户权限
show grants for 'root'@'localhost';
-- 会得到下面的结果, ALL 或者 ALL PRIVILEGES 代表全部的权限
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
修改 localhost
权限就可以了。
问题 3 解决方案:
event
设成了DISABLE
这种情况。
-- 这里以test_event为例:
-- 关闭事件任务:
alter event test_event ON COMPLETION PRESERVE DISABLE;
--开户事件任务:
alter event test_event ON COMPLETION PRESERVE ENABLE;
-- 获取当前数据库的event:
show events;
-- 获取全部的event:
select * from information_schema.events;
-- 下面通过 show events; 命令的出来的结果,event 事件的状态为 ENABLED
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| Db | Name | Definer | Time zone | Type | Execute at | Interval value | Interval field | Starts | Ends | Status | Originator | character_set_client | collation_connection | Database Collation |
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
| api | test | root@localhost | SYSTEM | RECURRING | NULL | 1 | DAY | 2019-07-01 00:00:00 | NULL | ENABLED | 1 | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |
| api | test_one | root@localhost | SYSTEM | ONE TIME | 2019-07-01 00:00:00 | NULL | NULL | NULL | NULL | ENABLED | 1 | utf8mb4 | utf8mb4_general_ci | utf8_general_ci |
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
网友评论