Mysql中的定時任務

1、說明

  • 後臺週期定時任務能夠有多種解決方案,我所知道的大概有如下幾種:
    1. 後臺框架自帶定時任務。好比php中的Laravel框架裏有提供定時任務操做接口,其餘的框架你們能夠單獨針對瞭解。
    2. 服務器操做系統層面的定時。一般咱們的服務器主要基於兩大平臺,一個windows server,它的定時任務系統有提供的。Linux下也有,一般流行的是crontab工具實現的(想了解這裏有個視頻教程),可是crontab的定時任務一般定時操做腳本這樣的文件,而直接定時操做數據庫的就比較麻煩了。可是也有解決辦法,就是在服務器端寫一個get請求url,在後臺裏完成要定時完成的數據庫操做,這樣咱們只要實現定時訪問該接口就好了,Linux下的curl命令能夠很方便發出get請求,咱們只要寫個包含訪問該接口的腳本,再結合crontab就能夠完成後臺數據的定時更新操做了。
    3. 可是畢竟寫個接口安全性不是過高,而你們用的若是是mysql數據庫,那就正好能夠利用其自帶的定時操做了,下面簡單介紹mysql定時操做的使用。

2、mysql定時操做


一、查看定時策略是否開啓

  • 查看命令
1
show variables like '%event_sche%';
  • 顯示的event_scheduler爲OFF時用如下命令開啓
1
set global event_scheduler=1;
  • 注意:以上的改法在數據庫重啓後將會恢復爲原來狀態,要想數據庫重啓後也可讓event_scheduler開啓,則須要在配置文件my.ini的設置。修改以下,而後重啓mysql服務便可。
1
2
[mysqld]
event_scheduler=ON //這一行加入mysqld標籤下

二、建立procedure(存儲過程)


什麼是procedure(存儲過程)?

  • 存儲過程?當我聽到這個詞的時候,覺得它是mysql存儲數據的一個流程而不是一個名詞,可是當我網上了解時,才知道這個詞是翻譯過來的,原生詞爲Procedure,實際上它的含義就是至關於咱們面向對象裏的方法或者說是函數,在它裏面能夠完成多個sql語句的操做,而且能夠定義參數傳值等,與通常的單條sql語句的區別主要在這裏。
  • 詳細瞭解: 點我

建立存儲過程

1
2
3
4
5
6
7
use test;
delimiter //
create procedure test_proce()
begin
insert into weuse(name,created_at,updated_at) values('hello',now(),now());
end//
delimiter ;

enter image description hereenter image description herephp

  • 上面的代碼說明:mysql

    1. use test; 這個誰都知道,使用某個數據庫,這裏要強調的是存儲過程必定是對於某個數據庫而言的,因此必需要選中一個數據庫才能建立成功。
    2. delimiter // 這個是將mysql中以;(分號)結尾的規定修改成以//(雙斜槓)爲語句結束符,由於存儲過程裏能夠有多條sql 語句,裏面的sql語句都以;號結尾,若是回車了那麼系統會當作sql語句直接執行了,咱們但願的是先定義這一系列sql語句而先不執行,因此要改下操做結束符。固然你在改後必定要改回來,你們能夠看到最後一行有對應的修改回來的語句。
    3. 下面的是一塊兒輸入的,能夠知道分別是建立存儲過程test_proce(),名稱能夠隨便起的,而後是在begin –end之間是定義一系列sql語句的就能夠了,記住最後end結尾要以以前修改後的結尾符結束。git

      1
      2
      3
      4
      create procedure test_proce()
      begin
      insert into weuse(name,created_at,updated_at) values('hello',now(),now());
      end//

三、建立定時任務


上面建立存儲過程其實是爲定時任務作鋪墊的,由於上面只說明瞭怎麼建立存儲過程,可是未說明怎麼調用,那這裏就用到了調用存儲過程了。github

建立定時任務event(事件)

1
2
3
4
create event second_event
on schedule every 1 second
on completion preserve disable
do call test_proce();

enter image description hereenter image description heresql

  • 代碼說明:
    1. 上面爲總體代碼,敲完再寫分號
    2. 第一行create event day_event是建立名爲second_event的事件,注意此處沒有括號
    3. 第二行是建立週期定時的規則,本處的意思是每秒鐘執行一次
    4. 第三行on completion preserve disable是表示建立後並不開始生效。
    5. 第四行do call test_proce()是該event(事件)的操做內容,表示調用咱們剛剛建立的test_proce()存儲過程。

查看定時任務event(事件),能夠查看本機全部的事件

1
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;

enter image description hereenter image description here數據庫

四、開啓已經建立好的event(事件)


1
2
alter event second_event on completion preserve enable;//開啓定時任務
alter event second_event on completion preserve disable;//關閉定時任務
  • 當咱們用第一句命令開啓定時任務時,能夠就能夠查看數據庫狀況,已經實現了每秒鐘執行一次了,如圖。

enter image description hereenter image description herewindows

  • 要想關閉定時任務只要執行上面的第二句命令,關閉須要關閉的定時任務就能夠了。

五、常見週期定時規則


  • 週期執行–關鍵字 EVERY安全

    1. 單位有:second,minute,hour,day,week(周),quarter(季度),month,year
    2. 如:服務器

      1
      2
      3
      on schedule every 1 second //每秒執行1次
      on schedule every 2 minute //每兩分鐘執行1次
      on schedule every 3 day //每3天執行1次
  • 在具體某個時間執行–關鍵字 AT框架

    1. 如:

      1
      2
      3
      on schedule at current_timestamp()+interval 5 day //5天后執行
      on schedule at current_timestamp()+interval 10 minute //10分鐘後執行
      on schedule at '2016-10-01 21:50:00' //在2016年10月1日,晚上9點50執行
  • 在某個時間段執行–關鍵字STARTS ENDS

    1. 如:

      1
      2
      on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month //5天后開始天天都執行執行到下個月底
      on schedule every 1 day ends current_timestamp()+interval 5 day //從如今起天天執行,執行5天

六、效率工具


MysqlWorkBench

是官方推薦的免費可視化mysql操做工具,方便建模,ER圖操做,經我發現好像只能可視化操做存儲過程(也多是本身沒找到)

  • 存儲過程:

enter image description hereenter image description here

  • Event事件,能夠查看,用sql命令
1
2
SELECT * FROM information_schema.EVENTS;//查看全部事件屬性
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS;//查看主要幾個屬性

enter image description hereenter image description here

這個是收費的軟件,可是可視化操做比較輕量級,功能也不少,它能夠可視化操做存儲過程和Event事件,詳細操做你們能夠本身摸索啊!!

enter image description here

 

來源於:http://jiyiren.github.io/2016/03/27/Mysql_schedule/

相關文章
相關標籤/搜索