MySQL使用 Event 事件失效

2019-06-12  本文已影响0人  饿肚子吃瓜子

简介

事件(event)是MySQL在相应的时刻调用的过程式数据库对象,它由一个特定的线程来管理的,也就是所谓的 事件调度器
有两种调度方式。

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

MySQL事件跟WindowsLinux(crontab)系统中的定时任务很像,在特定的时间内执行任务。但是它们只能精确到分钟,而MySQL event 事件可以实现每秒都去执行任务。

优缺点

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

问题

MySQL 的定时触发的event建好后没有发生预定的事件,归纳起来有以下几种:

  1. 全局的event是关闭的;
  2. 用户权限的修改导致event失效(这种情况很少发生);
  3. event 设成了DISABLE;

解决方案

下面来演示如何解决上面出现所出现的问题

问题1 解决方案:
  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

  1. 通过修改配置文件的方式 (推荐)

windows 系统的 MySQL的配置文件名是 my.iniLinux系统的 MySQL 的配置文件名是 my.cnf

  • 打开配置文件在 [mysqld] 模块下添加 event_scheduler=onevent_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    |
+-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+

参考

上一篇下一篇

猜你喜欢

热点阅读