美文网首页
MySQL使用 Event 事件失效

MySQL使用 Event 事件失效

作者: 饿肚子吃瓜子 | 来源:发表于2019-06-12 21:13 被阅读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    |
    +-----+----------+----------------+-----------+-----------+---------------------+----------------+----------------+---------------------+------+---------+------------+----------------------+----------------------+--------------------+
    
    

    参考

    相关文章

      网友评论

          本文标题:MySQL使用 Event 事件失效

          本文链接:https://www.haomeiwen.com/subject/fjolfctx.html