MySQL 中的定時任務
轉自:jiyiren 的《MySQL 中的定時任務》
原址:http://jiyiren.github.io/2016/03/27/Mysql_schedule/
MySQL 中的定時任務
發表於 2016-03-27 | 分類於 MySQL | 評論數: 4 | 閱讀次數: 3644
MySQL 5 開啟定時任務
最近專案裡面的後臺需要用到定時任務,而 MySQL 從 5.0 開始自帶了定時事件操作,所以學習下並做下記錄。
後臺週期定時任務可以有多種解決方案,我所知道的大概有以下幾種:
(1). 後臺框架自帶定時任務。比如 Php 中的 Laravel
(2). 伺服器作業系統層面的定時。通常我們的伺服器主要基於兩大平臺,一個 Windows Server, 它的定時任務系統有提供的。Linux 下也有,通常流行的是 crontab
工具實現的 ( 想了解這裡有個 視訊教程 ), 但是 crontab
的定時任務通常定時操作指令碼這樣的檔案,而直接定時操作資料庫的就比較麻煩了。但是也有解決辦法,就是在伺服器端寫一個 get
請求 url
,在後臺裡完成要定時完成的資料庫操作,這樣我們只要實現定時訪問該介面就行了,Linux 下的 curl
命令可以很方便發出 get
請求,我們只要寫個包含訪問該介面的指令碼,再結合 crontab
(3). 但是畢竟寫個介面安全性不是太高,而大家用的如果是 MySQL 資料庫,那就正好可以利用其自帶的定時操作了,下面簡單介紹 MySQL 定時操作的使用。
MySQL 配置
檢視定時策略是否開啟,檢視命令:
show variables like '%event_sche%'; |
顯示的 event_scheduler 為 OFF 時用以下命令開啟:
set global event_scheduler=1; |
以上的改法在資料庫重啟後將會恢復為原來狀態,要想資料庫重啟後也可以讓 event_scheduler 開啟,則需要在配置檔案 my.ini
的設定。修改如下,然後重啟 MySQL 服務即可:
[mysqld] event_scheduler=ON // 這一行加入 mysqld 標籤下 |
建立 procedure ( 儲存過程 )
什麼是 procedure ( 儲存過程 ) ?
儲存過程?當我聽到這個詞的時候,以為它是 MySQL 儲存資料的一個流程而不是一個名詞,但是當我網上了解時,才知道這個詞是翻譯過來的,原生詞為 Procedure, 實際上它的含義就是相當於我們面向物件裡的方法或者說是 函式,在它裡面可以完成多個 sql
語句的操作,並且可以定義引數傳值等,與一般的單條 sql
語句的區別主要在這裡,詳細瞭解 點我。
建立儲存過程
先上一段建立儲存過程程式碼:
use test; delimiter // create procedure test_proce() begin insert into weuse(name,created_at,updated_at) values('hello',now(),now()); end// delimiter ; |
上面的程式碼說明:
(1). use test;
: 這個誰都知道,使用某個資料庫,這裡要強調的是儲存過程一定是對於某個資料庫而言的,所以必須要選中一個數據庫才能建立成功。
(2). delimiter //
: 這個是將 MySQL 中以 ;(分號) 結尾的規定修改為以 //(雙斜槓) 為語句結束符,因為儲存過程裡可以有多條 sql
語句,裡面的 sql
語句都以 ; 號結尾,如果回車了那麼系統會當做 sql
語句直接執行了,我們希望的是先定義這一系列 sql
語句而先不執行,所以要改下操作結束符。當然你在改後一定要改回來,大家可以看到最後一行有對應的修改回來的語句。
(3). 下面所示的語句則是一起輸入的,可以知道分別是建立儲存過程 test_proce(), 名稱可以隨便起的,然後是在 begin --end
之間是定義一系列 sql
語句的就可以了,記住最後 end
結尾要以之前修改後的結尾符 //
結束。
create procedure test_proce() begin insert into weuse(name,created_at,updated_at) values('hello',now(),now()); end// |
建立定時任務
上面建立儲存過程實際上是為 定時任務 做鋪墊的,因為上面只說明瞭怎麼建立儲存過程,但是未說明怎麼呼叫,那這裡就用到了呼叫儲存過程了。
建立定時任務 event ( 事件 )
依舊先上建立定時任務事件程式碼:
create event second_event on schedule every 1 second on completion preserve disable do call test_proce(); |
程式碼說明:
- 上面為整體程式碼,敲完再寫分號;
- 第一行 create event day_event 是建立名為 second_event 的事件,注意此處沒有括號;
- 第二行是建立週期定時的規則,本處的意思是每秒鐘執行一次;
- 第三行 on completion preserve disable 是表示建立後並不開始生效;
- 第四行 do call test_proce() 是該 event(事件) 的操作內容,表示呼叫我們剛剛建立的 test_proce() 儲存過程。
檢視定時任務 event ( 事件 )
檢視本機所有的事件:
SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; |
開啟已經建立好的 event ( 事件 )
alter event second_event on completion preserve enable;//開啟定時任務 alter event second_event on completion preserve disable;//關閉定時任務 |
當我們用第一句命令開啟定時任務時,可以就可以檢視資料庫情況,已經實現了 每秒鐘執行一次 了,如圖:
要想關閉定時任務只要執行上面的第二句命令,關閉需要關閉的定時任務就可以了。
常見週期定時規則
① 週期執行 – 關鍵字 EVERY
單位有:second, minute, hour, day, week(周), quarter(季度), month, year,如:
on schedule every 1 second //每秒執行1次 on schedule every 2 minute //每兩分鐘執行1次 on schedule every 3 day //每3天執行1次 |
② 在具體某個時間執行 – 關鍵字 AT, 如:
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, 如:
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 圖操作,經我發現好像只能視覺化操作儲存過程,沒看到有定時任務的 ( 也可能是自己沒找到 )。
儲存過程示例如下:
對於 Event 事件,可以檢視,用 sql
命令
SELECT * FROM information_schema.EVENTS; // 檢視所有事件屬性 SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; // 檢視主要幾個屬性 |
Navicat
這個是收費的軟體,但是視覺化操作比較輕量級,功能也很多,它可以視覺化操作儲存過程和Event 事件,詳細操作大家可以自己摸索啊!!
- 本文作者: jiyiren
- 本文連結: http://yoursite.com/2016/03/27/Mysql_schedule/
- 版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明出處!