zoukankan      html  css  js  c++  java
  • mysql-常用组件之定时器

    定时器主要用于定时的执行一次或者循环执行一条sql,在实际场景上,例如,定期清理数据表,定期导出日志文件等等场景。本次公司晚上维护系统,晚上需要定期挂维护页,用到了定时器,这里简单总结一下。

    启用定时器

    MySQL event 功能默认是关闭的,可以使用下面的语句来看 event 的状态,如果是 OFF 或者 0,表示是关闭的。

    • 检查命令
    SHOW VARIABLES LIKE 'event_scheduler';
    
    • 定时器已经开启的执行结果:

    开启成功示例.png
    如果未开启定时器,执行以下命令开启定时器:

    SET GLOBAL event_scheduler = 1;
    
    • 注意:虽然这里用 set global event_scheduler = on 语句开启了事件,但是每次重启服务器或重启 mysql 服务后,事件会自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,最好修改配置文件,让 mysql 服务启动的时候开启时间,只需要在 my.cnf 配置文件的 [mysqld] 部分加上 event_scheduler=ON 即可:
      设置定时器自启动.png
    • 关闭定时器命令:
    SET GLOBAL event_scheduler = 0;
    

    创建定时器

    创建定时器 SQL 模板:

    DELIMITER $$
    
    -- SET GLOBAL event_scheduler = ON$$     -- required for event to execute but not create    
    
    CREATE	/*[DEFINER = { user | CURRENT_USER }]*/	EVENT `dbName`.`eventName` -- 事件名
    
    ON SCHEDULE
    	 /* uncomment the example below you want to use */
    
    	-- scheduleexample 1: run once 只执行一次
    
    	   --  AT 'YYYY-MM-DD HH:MM.SS'/CURRENT_TIMESTAMP { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] }
    
    	-- scheduleexample 2: run at intervals forever after creation 创建完后周期性执行
    
    	   -- EVERY 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...]
    
    	-- scheduleexample 3: specified start time, end time and interval for execution 指定开始和结束时间,并在期间内周期性的执行
    	   /*EVERY 1  [HOUR|MONTH|WEEK|DAY|MINUTE|...]
    
    	   STARTS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1[HOUR|MONTH|WEEK|DAY|MINUTE|...] }
    
    	   ENDS CURRENT_TIMESTAMP/'YYYY-MM-DD HH:MM.SS' { + INTERVAL 1 [HOUR|MONTH|WEEK|DAY|MINUTE|...] } */
    
    /*[ON COMPLETION [NOT] PRESERVE] -- 时间完成后是否删除事件
    [ENABLE | DISABLE] -- 是否立即生效
    [COMMENT 'comment']*/
    
    DO
    	BEGIN
    	    (sql_statements) -- 需要周期性执行的 sql 语句
    	END$$
    
    DELIMITER ;
    
    • 注意
    1. DELIMITER $$ 这个是将mysql中以 ; 结尾的规定修改为以 $$ 为语句结束符,因为存储过程里可以有多条 sql 语句,里面的 sql 语句都以 ; 结尾,如果回车了那么系统会当做 sql 语句直接执行了,我们希望的是先定义这一系列 sql 语句而先不执行,所以要改下操作结束符。当然你在改后一定要改回来,大家可以看到最后一行有对应的修改回来的语句。

    2. 如果需要周期性执行的语句也可用存储过程来代替,使用 DO CALL procedure() 语句来代替。

    3. 设置定时器事件的生效与否语句:

    ALTER EVENT event_minute DISABLE;  # 关闭事件
    ALTER EVENT event_minute ENABLE;   # 启用事件
    

    举例

    1.从现在开始每隔九天定时执行

    ON SCHEDULE EVERY 9 DAY STARTS NOW() ;
    

    2.每个月的一号凌晨 1 点执行

    on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);
    

    3.每个季度一号的凌晨1点执行

    on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
    
    天行健,君子以自强不息;地势坤,大地以厚德载物
  • 相关阅读:
    客商支付明细SQL_billdate
    两张表判断赋值,都是NULL惹的祸…
    DataGridView使用初步
    在SQL Server 2005中启用“SQL Server”身份验证
    .Net学习笔记——细节问题
    C#调用带返回值的存储过程
    利用ASP.NET一般处理程序动态生成Web图像
    Windows Forms数据绑定技术
    C#中产生SQL语句的几种方式
    风讯dotNETCMS源码分析—数据存取篇
  • 原文地址:https://www.cnblogs.com/aizen-sousuke/p/11965897.html
Copyright © 2011-2022 走看看