一、說明
- 后台周期定時任務可以有多種解決方案,我所知道的大概有以下幾種:
- 后台框架自帶定時任務。比如php中的Laravel框架里有提供定時任務操作接口,其他的框架大家可以單獨針對了解。
- 服務器操作系統層面的定時。通常我們的服務器主要基於兩大平台,一個windows server,它的定時任務系統有提供的。Linux下也有,通常流行的是crontab工具實現的(想了解這里有個視頻教程),但是crontab的定時任務通常定時操作腳本這樣的文件,而直接定時操作數據庫的就比較麻煩了。但是也有解決辦法,就是在服務器端寫一個get請求url,在后台里完成要定時完成的數據庫操作,這樣我們只要實現定時訪問該接口就行了,Linux下的curl命令可以很方便發出get請求,我們只要寫個包含訪問該接口的腳本,再結合crontab就可以完成后台數據的定時更新操作了。
- 但是畢竟寫個接口安全性不是太高,而大家用的如果是mysql數據庫,那就正好可以利用其自帶的定時操作了,下面簡單介紹mysql定時操作的使用。
二、mysql定時操作
1、查看定時策略是否開啟
- 查看命令
1 |
show variables like '%event_sche%'; |
- 顯示的event_scheduler為OFF時用以下命令開啟
1 |
set global event_scheduler=1; |
- 注意:以上的改法在數據庫重啟后將會恢復為原來狀態,要想數據庫重啟后也可以讓event_scheduler開啟,則需要在配置文件my.ini的設置。修改如下,然后重啟mysql服務即可。
1 |
[mysqld] |
2、創建procedure(存儲過程)
什么是procedure(存儲過程)?
- 存儲過程?當我聽到這個詞的時候,以為它是mysql存儲數據的一個流程而不是一個名詞,但是當我網上了解時,才知道這個詞是翻譯過來的,原生詞為Procedure,實際上它的含義就是相當於我們面向對象里的方法或者說是函數,在它里面可以完成多個sql語句的操作,並且可以定義參數傳值等,與一般的單條sql語句的區別主要在這里。
- 詳細了解: 點我
創建存儲過程
1 |
use test; |
-
上面的代碼說明:
- use test; 這個誰都知道,使用某個數據庫,這里要強調的是存儲過程一定是對於某個數據庫而言的,所以必須要選中一個數據庫才能創建成功。
- delimiter // 這個是將mysql中以;(分號)結尾的規定修改為以//(雙斜杠)為語句結束符,因為存儲過程里可以有多條sql 語句,里面的sql語句都以;號結尾,如果回車了那么系統會當做sql語句直接執行了,我們希望的是先定義這一系列sql語句而先不執行,所以要改下操作結束符。當然你在改后一定要改回來,大家可以看到最后一行有對應的修改回來的語句。
-
下面的是一起輸入的,可以知道分別是創建存儲過程test_proce(),名稱可以隨便起的,然后是在begin –end之間是定義一系列sql語句的就可以了,記住最后end結尾要以之前修改后的結尾符結束。
1
2
3
4create procedure test_proce()
begin
insert into weuse(name,created_at,updated_at) values('hello',now(),now());
end//
3、創建定時任務
上面創建存儲過程實際上是為定時任務做鋪墊的,因為上面只說明了怎么創建存儲過程,但是未說明怎么調用,那這里就用到了調用存儲過程了。
創建定時任務event(事件)
1 |
create event second_event |
- 代碼說明:
- 上面為整體代碼,敲完再寫分號
- 第一行create event day_event是創建名為second_event的事件,注意此處沒有括號
- 第二行是創建周期定時的規則,本處的意思是每秒鍾執行一次
- 第三行on completion preserve disable是表示創建后並不開始生效。
- 第四行do call test_proce()是該event(事件)的操作內容,表示調用我們剛剛創建的test_proce()存儲過程。
查看定時任務event(事件),可以查看本機所有的事件
1 |
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; |
4、開啟已經創建好的event(事件)
1 |
alter event second_event on completion preserve enable;//開啟定時任務 |
- 當我們用第一句命令開啟定時任務時,可以就可以查看數據庫情況,已經實現了每秒鍾執行一次了,如圖。
- 要想關閉定時任務只要執行上面的第二句命令,關閉需要關閉的定時任務就可以了。
5、常見周期定時規則
-
周期執行–關鍵字 EVERY
- 單位有:second,minute,hour,day,week(周),quarter(季度),month,year
-
如:
1
2
3on schedule every 1 second //每秒執行1次
on schedule every 2 minute //每兩分鍾執行1次
on schedule every 3 day //每3天執行1次
-
在具體某個時間執行–關鍵字 AT
-
如:
1
2
3on 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
2on 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天
-
6、效率工具
MysqlWorkBench
是官方推薦的免費可視化mysql操作工具,方便建模,ER圖操作,經我發現好像只能可視化操作存儲過程(也可能是自己沒找到)
- 存儲過程:
- Event事件,可以查看,用sql命令
1 |
SELECT * FROM information_schema.EVENTS;//查看所有事件屬性 |
Navicat
這個是收費的軟件,但是可視化操作比較輕量級,功能也很多,它可以可視化操作存儲過程和Event事件,詳細操作大家可以自己摸索啊!!
來源於:http://jiyiren.github.io/2016/03/27/Mysql_schedule/







