1. 程式人生 > >mysql 事件

mysql 事件

-- CREATE TABLE `event_demo` (
--   `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
--   `name` varchar(16) NOT NULL,
--   `seed` int(11) DEFAULT '0',
--   `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日期',
--   PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-- 



-- 【事件1】 :在某個時間點執行事件,只執行一次  

DROP event IF EXISTS `event1`;

CREATE EVENT `event1`
ON SCHEDULE AT '2019-03-01 04:44:10' 
ON COMPLETION  PRESERVE
ENABLE
COMMENT ' 2019-03-01 04:44:10 開始執行,執行了就結束了。這樣也可以把 ON COMPLETION 設定成 NOT PRESERVE 。 就是執行結束的時候把事件也刪除。當前(PRESERVE)是不會把該事件刪除的'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 1;


-- 【事件2】 :某個時間點加上時間單位之後執行事件(+ 表示在多久之後執行),只執行一次。  
-- 例1: CURRENT_TIMESTAMP  + INTERVAL 1 MONTH  從現在開始,過5個月執行事件
DROP event IF EXISTS `event2`;

CREATE EVENT `event2`
ON SCHEDULE AT '2019-03-01 05:13:10' + INTERVAL 5 SECOND  
ON COMPLETION  PRESERVE
ENABLE
COMMENT '從 2019-03-01 05:13:10 開始 過5秒之後執行事件,執行完就不執行了,可以把 ON COMPLETION 設定成 NOT PRESERVE 。'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 2;



-- 【事件3】: 週期性的執行事件, 注意將 ON COMPLETION 設定成 NOT PRESERVE 是無效的,並不會刪除事件,依然會週期性的執行
-- 例1: EVERY 1 SECOND  從現在開始,每秒執行一次
-- 例2: EVERY 1 DAY 從現在開始,每天執行一次

DROP event IF EXISTS `event3`;

CREATE EVENT `event3`
ON SCHEDULE EVERY 1 DAY 
ON COMPLETION  PRESERVE
ENABLE
COMMENT '每天執行一次事件'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 3;





-- 【事件4】 : 在某個點之後,週期性的執行事件, 注意將 ON COMPLETION 設定成 NOT PRESERVE 是無效的,並不會刪除事件,依然會週期性的執行
-- STARTS 可以是將來時間,也可以是過去時間
-- 例1: EVERY 1 DAY STARTS '2019-03-01 04:44:10'   2019-03-01 04:44:10 之後每天執行一次
-- 例2:  EVERY 1 HOUR STARTS '2019-03-01 04:44:10' 2019-03-01 04:44:10 之後每小時執行一次

DROP event IF EXISTS `event4`;

CREATE EVENT `event4`
ON SCHEDULE EVERY 1 MINUTE STARTS '2019-03-01 05:40:00'
ON COMPLETION  PRESERVE
ENABLE
COMMENT '每分鐘執行一次,從 2019-03-01 05:40:00 開始'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 4;





-- 【事件5】: 在某個時間點之後的時間,週期性的執行事件
-- 例1:EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND  表示:  2019-03-01 04:50:10 再過5秒之後,每秒執行一次事件
DROP event IF EXISTS `event5`;

CREATE EVENT `event5`
ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 04:50:10' + INTERVAL 5 SECOND
ON COMPLETION  PRESERVE
ENABLE
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 5;





-- 【事件6】: 在某個時間點之後的時間,週期性的執行事件 ,並在指定時間點上終結事件。如果要刪除事件可以把 ON COMPLETION  設定成 NOT PRESERVE 。

DROP event IF EXISTS `event6`;

CREATE EVENT `event6`
ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00'
ON COMPLETION  PRESERVE
ENABLE
COMMENT '從2019-03-01 05:51:05 開始觸發事件,到2019-03-01 05:52:00結束事件。之後不會再執行事件了'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 6;




-- 【事件7】: 在某個時間點之後的時間,週期性的執行事件 ,並在指定時間點之後一段時間終結事件。如果要刪除事件可以把 ON COMPLETION  設定成 NOT PRESERVE 。

DROP event IF EXISTS `event7`;

CREATE EVENT `event7`
ON SCHEDULE EVERY 1 SECOND STARTS '2019-03-01 05:51:00' + INTERVAL 5 SECOND ENDS '2019-03-01 05:52:00' + INTERVAL 5 SECOND
ON COMPLETION  PRESERVE
ENABLE
COMMENT '從2019-03-01 05:51:05 開始觸發事件,到2019-03-01 05:52:05結束事件。之後不會再執行事件了'
DO
UPDATE event_demo SET seed = seed+1 WHERE id = 7;



mysql 建立任務(事件)
  1、檢查資料庫事件是否開啟,如果 event_scheduler 等於 NO表示開啟
    SELECT @@event_scheduler; 
    SHOW VARIABLES LIKE 'event_scheduler';
    SELECT @@event_scheduler;
  2、開啟任務(事件)
    a、set global event_scheduler=1; 
    b、SET GLOBAL event_scheduler = ON;
    c、在my.cnf中的[mysqld]部分新增 event_scheduler=ON 然後重啟mysql。
  3、關閉事件
    SET GLOBAL event_scheduler = OFF;
  4、語法:
 

 

CREATE
        [DEFINER = { user | CURRENT_USER }]
        EVENT
        [IF NOT EXISTS]
        event_name
        ON SCHEDULE schedule
        [ON COMPLETION [NOT] PRESERVE]
        [ENABLE | DISABLE | DISABLE ON SLAVE]
        [COMMENT 'comment']
        DO event_body;
    schedule:
        AT timestamp [+ INTERVAL interval] ...
         | EVERY interval
        [STARTS timestamp [+ INTERVAL interval] ...]
        [ENDS timestamp [+ INTERVAL interval] ...]
    interval:
      quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
                  WEEK | SECOND | YEAR_MONTH | DAY_HOUR |
    DAY_MINUTE |DAY_SECOND | HOUR_MINUTE |
    HOUR_SECOND | MINUTE_SECOND}

 

引數詳細說明:
DEFINER: 定義事件執行的時候檢查許可權的使用者。
ON SCHEDULE schedule: 定義執行的時間和時間間隔。
ON COMPLETION [NOT] PRESERVE: 定義事件是一次執行還是永久執行,預設為一次執行,即NOT PRESERVE。
ENABLE | DISABLE | DISABLE ON SLAVE: 定義事件建立以後是開啟還是關閉,以及在從上關閉。如果是從伺服器自動同步主上的建立事件的語句的話,會自動加上DISABLE ON SLAVE。
COMMENT 'comment': 定義事件的註釋。
5、開啟事件
alter event event_name(事件名稱) ON COMPLETION PRESERVE ENABLE; 
6、關閉事件
alter event event_name(事件名稱) ON COMPLETION PRESERVE DISABLE; 
7、刪除事件
DROP EVENT [IF EXISTS] event_name(事件名稱)
8、案例

 

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `t1` datetime DEFAULT NULL,
  `id2` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8

<!-- 建立一個每隔3秒往test表中插入一條資料的事件 -->
CREATE EVENT IF NOT EXISTS e_test_1 ON SCHEDULE EVERY 3 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO test(id,t1) VALUES(NULL,NOW());
<!-- 建立一個10分鐘後清空test表資料的事件  -->
CREATE EVENT IF NOT EXISTS e_test_2
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
DO TRUNCATE TABLE test;
<!-- 呼叫儲存過程 -->
1、建立過程
CREATE PROCEDURE pro_test()
    BEGIN
        INSERT INTO test(id,t1,id2) VALUES(NULL,NOW(),'1000000');
    END
2、呼叫過程
CREATE EVENT IF NOT EXISTS e_test_3 ON SCHEDULE EVERY 3 SECOND
ON COMPLETION PRESERVE
DO CALL pro_test();

 

9、關於事件的許可權問題 (Access denied for user 'root'@'%' to database ‘xxxx’)
  使用Naicat Premium遠端連線的mysql上面建立了一個新資料庫和新的使用者後,給該使用者新增這個新資料庫許可權時出現:
  access denied for user 'root'@'%' to database xxxx的提示。
  錯誤的原因是root使用者在遠端連線的MYSQL上面,沒有這個新資料庫的授權。在本地使用mysql應該不存在這個問題。
  解決方法,執行授權:
    UPDATE mysql.user SET Event_priv = 'Y' WHERE HOST='%' AND USER='root';
    FLUSH PRIVILEGES;
    grant all PRIVILEGES on xxxx.* to root@'%' identified by 'password' with grant option;
    grant all on xxxx.* to 'root'@'%' identified by 'password' with grant option; 
    xxxx為建立的資料庫,password為root的密碼。請按實際要求進行更