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;















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