zoukankan      html  css  js  c++  java
  • Mysql事件

    需求

    由于公司的项目运营了四年之久,数据量庞大,有的表已经达到了几百M,为了不影响查询效率,需要定期把一些日志老数据删除,公司负责人把之前的清理数据文档发来作为参考,发现了一些比较陌生的字眼,百度一看,原来是Mysql事件。

    了解

    熟悉linux系统的人都知道linux的cron计划任务,能很方便地实现定期运行指定命令的功能。其实Mysql事件就和Linux的cron功能一样,Mysql在5.1以后推出了事件调度器(Event Scheduler),能方便地实现 mysql数据库的计划任务,而且能精确到秒。

    实践

    Linux:Centos6.5,  Mysql:5.7.22

    想要使用Mysql的事件功能,前提是确保服务开启,我这里是开启的。

    MySQL [test]> show variables like 'event_scheduler';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | event_scheduler | ON    |
    +-----------------+-------+
    1 row in set (1.76 sec)

    如果没有开启,进入Mysql客户端,执行以下命令开启

    SET GLOBAL event_scheduler = ON;
    SET @@global.event_scheduler = ON;
    SET GLOBAL event_scheduler = 1;
    SET @@global.event_scheduler = 1;

    当然也可以执行以下命令关闭

    SET GLOBAL event_scheduler = OFF;
    SET @@global.event_scheduler = OFF;
    SET GLOBAL event_scheduler = 0;
    SET @@global.event_scheduler = 0;

    提醒:虽然这里用set global event_scheduler = on语句开启了事件,但是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,最好修改配置文件,让mysql服务启动的时候开启时间,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下

    编辑mysql的配置文件my.cnf,在[mysqld]中添加下面一行代码

    [mysqld]
    event_scheduler=ON

    然后重启Mysql服务,进入Mysql客户端执行命令查看是否开启。确认是开启的。

    # service mysqld restart --event_scheduler=ON  //通过制定事件参数启动

     简单小案例测试一下

    //创建user表
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `name` varchar(200) NOT NULL,
      `address` varchar(500) NOT NULL,
      `addtime` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    创建好了表之后,然后创建事件。事件类型分为两种,一个是间隔触发,另一个是特定事件触发。

    事件参数说明:

    • DEFINER:创建者
    • ON COMPLETION [NOT] PRESERVE :表示当事件不会再发生的情况下,删除事件(注意特定时间执行的事件,如果设置了该参数,执行完毕后,事件将被删除,不想删除的话可以设置成ON COMPLETION PRESERVE);
    • ENABLE:表示系统将执行这个事件;

    第一种类型:每隔一分钟插入一条数据

    //创建事件
    DROP EVENT IF EXISTS `event_minute`;
    DELIMITER ;;
    CREATE DEFINER=`root`@`localhost` EVENT `event_minute` ON SCHEDULE EVERY 1 MINUTE STARTS '2018-06-20 20:00:00' ON COMPLETION NOT PRESERVE ENABLE DO 
    
    BEGIN
        INSERT INTO USER(name, address,addtime) VALUES('test1','test1',now());
        INSERT INTO USER(name, address,addtime) VALUES('test2','test2',now());
    END
    ;;
    DELIMITER ;

    经过我将近两天的挂机测试,数据表结果,观察数据,每一分钟入库一条数据。

    mysql> select * from user;
    
    | 5248 | name2 | test2   | 2018-06-21 14:59:00 |
    | 5249 | name1 | test1   | 2018-06-21 15:00:00 |
    | 5250 | name2 | test2   | 2018-06-21 15:00:00 |
    | 5251 | name1 | test1   | 2018-06-21 15:01:00 |
    | 5252 | name2 | test2   | 2018-06-21 15:01:00 |
    | 5253 | name1 | test1   | 2018-06-21 15:02:00 |
    | 5254 | name2 | test2   | 2018-06-21 15:02:00 |
    | 5255 | name1 | test1   | 2018-06-21 15:03:00 |
    | 5256 | name2 | test2   | 2018-06-21 15:03:00 |
    | 5257 | name1 | test1   | 2018-06-21 15:04:00 |
    | 5258 | name2 | test2   | 2018-06-21 15:04:00 |
    | 5259 | name1 | test1   | 2018-06-21 15:05:00 |
    | 5260 | name2 | test2   | 2018-06-21 15:05:00 |
    +------+-------+---------+---------------------+

    第一种类型:特定时间插入一条数据,如2018-06-21 15:37:00

    //新事件
    DROP EVENT IF EXISTS `event_at`;
    DELIMITER ;;
    CREATE DEFINER=`root`@`localhost` EVENT `event_at` ON SCHEDULE AT '2018-06-21 15:37:00' ON COMPLETION NOT PRESERVE ENABLE DO 
    
    BEGIN
        INSERT INTO USER(name, address,addtime) VALUES('AT','AT',now());
    END
    ;;
    DELIMITER ;

    查看结果

    | 5317 | name1 | test1   | 2018-06-21 15:34:00 |
    | 5318 | name2 | test2   | 2018-06-21 15:34:00 |
    | 5319 | name1 | test1   | 2018-06-21 15:35:00 |
    | 5320 | name2 | test2   | 2018-06-21 15:35:00 |
    | 5321 | name1 | test1   | 2018-06-21 15:36:00 |
    | 5322 | name2 | test2   | 2018-06-21 15:36:00 |
    | 5323 | AT    | AT      | 2018-06-21 15:37:00 |  //--------结果
    | 5324 | name1 | test1   | 2018-06-21 15:37:00 |
    | 5325 | name2 | test2   | 2018-06-21 15:37:00 |
    +------+-------+---------+---------------------+

    公司业务需求,删除两个月前的老数据

    关于更多Mysql事件的例子,看一下下面的帖子。运用在自己的项目里就可以了

    https://blog.csdn.net/shaobingj126/article/details/50680216

    https://blog.csdn.net/eastmount/article/details/60984798

    https://www.cnblogs.com/18JG23/p/6296679.html

  • 相关阅读:
    Linux 修改最大线程数
    Openresty+Nginx+Lua+Nginx_http_upstream_check_module 搭建
    SSDB 性能测试
    面向对象:类的成员
    封装,多态,类的约束,super()深入了解
    面向对象:继承
    面向对象:类的空间问题,类之间关系
    面向对象初识
    软件开发规范
    模块(四)包和logging日志
  • 原文地址:https://www.cnblogs.com/wt645631686/p/9208245.html
Copyright © 2011-2022 走看看