mysql 定时任务详解

/*
有必要说下语法:
    CREATE EVENT [IFNOT EXISTS] event_name
       ON SCHEDULE schedule
       [ON COMPLETION [NOT] PRESERVE]
       [ENABLE | DISABLE]
     [COMMENT 'comment']
       DO sql_statement;
SCHEDULE表示的是时间,
[ON COMPLETION [NOT] PRESERVE] 表示的是否保持这个定时任务 默认不保持
[ENABLE | DISABLE] 初始化是否可用 默认可用
[COMMENT 'comment'] 注释
*/


-- 查看版本 MySQL5.1.6起
SELECT VERSION();

-- 查看事件调度器是否开启 ;
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST;

-- 开关事件调度器
SET GLOBAL event_scheduler = ON;

-- 创建推送表
drop TABLE if EXISTS ttx_test_db_push;
CREATE TABLE if not EXISTS `ttx_test_db_push` (
  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'ID',
    `CREATE_time` datetime COMMENT '创建时间',
    `is_push` INT(1) DEFAULT '0' COMMENT '是(0)否(1)推送',
  `is_deleted` int(1) DEFAULT '0' COMMENT '是否删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据互通测试推送表';

-- 创建接收表
drop TABLE if EXISTS ttx_test_db_receive;
CREATE TABLE if not EXISTS `ttx_test_db_receive` (
  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'ID',
    `CREATE_time` datetime COMMENT '创建时间',
  `is_deleted` int(1) DEFAULT '0' COMMENT '是否删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据互通测试接收表';

-- 创建事件 每秒钟插入推送表一条数据
DROP EVENT IF EXISTS ttx_test_inset;-- 删除
CREATE EVENT ttx_test_inset ON SCHEDULE EVERY 1 SECOND DO
    INSERT INTO ttx_test_db_push values (uuidUtils(), SYSDATE(),1, 0)
    ;

-- 查看
SELECT  CURRENT_TIMESTAMP() from ttx_test_db_push;

-- 创建事件 没分钟清空一次
DROP EVENT IF EXISTS ttx_test_delete;-- 存在就删除
create event ttx_test_delete on SCHEDULE EVERY 1 MINUTE DO TRUNCATE TABLE ttx_test_db_push;

-- 一天之后清空
DROP EVENT IF EXISTS ttx_test_del_day; -- 存在就删除
CREATE EVENT ttx_test_del_day on SCHEDULE AT CURRENT_TIMESTAMP() + INTERVAL 1 DAY DO TRUNCATE TABLE ttx_test_db_push;

-- 某个时间点清空
DROP EVENT IF EXISTS ttx_test_del_some_day; -- 存在就删除
CREATE EVENT ttx_test_del_some_day on SCHEDULE AT TIMESTAMP('2017-10-09 13:10:10') DO TRUNCATE TABLE ttx_test_db_push;

-- 每天定时清空
DROP EVENT IF EXISTS ttx_test_del_one_day;-- 存在就删除
CREATE EVENT ttx_test_del_one_day on SCHEDULE EVERY 1 DAY DO TRUNCATE TABLE ttx_test_db_push;

-- 1天后开始 每天清空
DROP EVENT IF EXISTS ttx_test_del_start_one_day; -- 存在就删除
CREATE EVENT ttx_test_del_start_one_day on SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP() + INTERVAL 1 DAY DO TRUNCATE TABLE ttx_test_db_push;

-- 每天定时清空 1个月后结束
DROP EVENT IF EXISTS ttx_test_del_end_one_day; -- 存在就删除
CREATE EVENT ttx_test_del_end_one_day on SCHEDULE EVERY 1 DAY ENDS CURRENT_TIMESTAMP+ INTERVAL 1 MONTH DO TRUNCATE TABLE ttx_test_db_push;

-- 关闭事件
ALTER EVENT ttx_test_del_end_one_day DISABLE;

-- 开启事件
ALTER EVENT ttx_test_del_end_one_day ENABLE;

-- 修改时间
ALTER EVENT ttx_test_del_one_day ON SCHEDULE EVERY 5 DAY;


-- 案例 调用存储过程 一分钟推送一次到接收表
-- 推送表1秒钟一条数据 每天凌晨清空一次 接收表每分钟接收一次接收表10天清空一次
DROP PROCEDURE if EXISTS ttx_data_push;
CREATE PROCEDURE ttx_data_push()
BEGIN
    DECLARE vcount int(10) ;
    drop table if EXISTS tem_com;
    CREATE TEMPORARY TABLE tem_com(
        `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'ID',
        `CREATE_time` datetime COMMENT '创建时间'
    );
    -- 开启事务
    START TRANSACTION;

        SELECT count(1) into vcount from ttx_test_db_push t where t.is_push=1;
    SELECT CONCAT(CURRENT_DATE(),'推送了:',vcount);

      -- 清空临时表
      TRUNCATE TABLE tem_com;
        -- 插入数据
        insert into tem_com(id,CREATE_time) SELECT  t.id,t.CREATE_time from ttx_test_db_push  t where t.is_push = 1 and t.is_deleted = 0 ;
    -- 更新推送表
    UPDATE ttx_test_db_push set is_push=0 where is_push = 1 and is_deleted = 0 ;
    -- 更新接收表
    insert into  ttx_test_db_receive(id,CREATE_time,is_deleted)SELECT id,CREATE_time,0 from tem_com;
    -- 提交事务
    commit;

end;

-- 创建事件 每秒钟插入推送表一条数据
DROP EVENT IF EXISTS ttx_test_inset;-- 删除
CREATE EVENT ttx_test_inset ON SCHEDULE EVERY 1 SECOND DO INSERT INTO ttx_test_db_push values (uuidUtils(), SYSDATE(),1, 0);

-- 每天定时清空
DROP EVENT IF EXISTS ttx_test_del_one_day;-- 存在就删除
CREATE EVENT ttx_test_del_one_day on SCHEDULE EVERY 1 DAY DO TRUNCATE TABLE ttx_test_db_push;

DROP EVENT IF EXISTS ttx_test_data_push;
CREATE EVENT ttx_test_data_push ON SCHEDULE EVERY 1 MINUTE DO call ttx_data_push();




-- 验证 完成
SELECT * from ttx_test_db_push;
SELECT * from ttx_test_db_receive;















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章