Home > Database > Mysql Tutorial > body text

mysql如何定时任务

PHPz
Release: 2018-09-28 17:13:31
Original
2054 people have browsed it

1,需求:每天晚上10点到早上5点,每10分钟定时执行存储过程。

2,实现方式:实现方式有两种:

 一种是比较常规的,用mysql的event定时任务,先介绍一下mysql中event定时任务的相关命令,

查看event是否启用:

SELECT @@event_scheduler;
SHOW VARIABLES LIKE 'event%';
Copy after login

开启定时任务:

set GLOBAL event_scheduler = 1;
SET GLOBAL event_scheduler = ON;
Copy after login

建立定时任务:

DROP EVENT IF EXISTS JOB_ALARM;
CREATE EVENT JOB_ALARM
 ON SCHEDULE EVERY 10 MINUTE
DO
  BEGIN
   if(date_format(current_time(),'%H')>22 || date_format(current_time(),'%H')<5) THEN
     CALL  PRO_ALARM();
   END IF;
END
Copy after login

建立存储过程:

DROP PROCEDURE IF EXISTS PRO_ALARM;
CREATE PROCEDURE PRO_ALARM()
  BEGIN
    DECLARE userId VARCHAR(32);

    #这个用于处理游标到达最后一行的情况
    DECLARE s INT DEFAULT 0;

    #声明游标cursor_name(cursor_name是个多行结果集)
    DECLARE cursor_data CURSOR FOR
      SELECT tmp.USER_ID
      FROM (
             SELECT
               e.USER_ID,
               MAX(e.TIME_GMT) TIME_GMT
             FROM EVENTS e
             GROUP BY e.USER_ID
             HAVING MAX(e.TIME_GMT) < UNIX_TIMESTAMP() - 60 * 30
                    AND MAX(e.TIME_GMT) > UNIX_TIMESTAMP() - 60 * 60 * 24) tmp
        INNER JOIN EVENTS t ON tmp.USER_ID = t.USER_ID
                                     AND tmp.TIME_GMT = t.TIME_GMT
      WHERE TYPE_ID != '34001';

    #设置一个终止标记
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s = 1;

    OPEN cursor_data;

    #获取游标当前指针的记录,读取一行数据并传给变量a,b
    FETCH cursor_data
    INTO userId;

    #开始循环,判断是否游标已经到达了最后作为循环条件
    WHILE s <> 1 DO
      INSERT INTO EVENTS_NOTIFICATION VALUES (NULL, SYSDATE(), UNIX_TIMESTAMP(SYSDATE()),
                                                    UNIX_TIMESTAMP(SYSDATE()), '00000', userId, '1', '0');
      #读取下一行的数据
      FETCH cursor_data
      INTO userId;
    END WHILE;
    #关闭游标
    CLOSE cursor_data;

  END;
Copy after login

在配置定时器时有一些局限性,并且由于博主使用的mysql启用了skip-grant-tables,在设置event开启时,总是报错,所以想到了第二种实现方式,具体报错信息如下:

[HY000][1290] The MySQL server is running with the --event-scheduler=DISABLED or --skip-grant-tables option so it cannot execute this statement
Copy after login

 第二种实现方式是利用linux的定时任务,

linux定时任务基本命令:

查看定时任务:crontab -l

编辑定时任务:crontab -e

        */10 22-23,0-5 * * *   mysql -u用户名 -p密码 -e "use db_name;CALL PRO_ALARM();"

       或者把use db_name;CALL PRO_ALARM();存到sql脚本中,编辑定时任务如下:

       */10 22-23,0-5 * * *   mysql -u用户名 -p密码 < /application/Job_mysql.sql

更多相关教程请访问  MySQL视频教程

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template