MySQL 中的定时任务
轉(zhuǎn)自:jiyiren 的《MySQL 中的定時任務(wù)》
原址:http://jiyiren.github.io/2016/03/27/Mysql_schedule/
?
?
MySQL 中的定時任務(wù)
發(fā)表于 2016-03-27 | 分類于 MySQL | 評論數(shù): 4 | 閱讀次數(shù): 3644
MySQL 5 開啟定時任務(wù)
最近項(xiàng)目里面的后臺需要用到定時任務(wù),而 MySQL 從 5.0 開始自帶了定時事件操作,所以學(xué)習(xí)下并做下記錄。
后臺周期定時任務(wù)可以有多種解決方案,我所知道的大概有以下幾種:
(1). 后臺框架自帶定時任務(wù)。比如 Php 中的 Laravel 框架里有提供定時任務(wù)操作接口,其他的框架大家可以單獨(dú)針對了解。
(2). 服務(wù)器操作系統(tǒng)層面的定時。通常我們的服務(wù)器主要基于兩大平臺,一個 Windows Server, 它的定時任務(wù)系統(tǒng)有提供的。Linux 下也有,通常流行的是 crontab 工具實(shí)現(xiàn)的 ( 想了解這里有個 視頻教程 ), 但是 crontab 的定時任務(wù)通常定時操作腳本這樣的文件,而直接定時操作數(shù)據(jù)庫的就比較麻煩了。但是也有解決辦法,就是在服務(wù)器端寫一個 get 請求 url,在后臺里完成要定時完成的數(shù)據(jù)庫操作,這樣我們只要實(shí)現(xiàn)定時訪問該接口就行了,Linux 下的 curl 命令可以很方便發(fā)出 get 請求,我們只要寫個包含訪問該接口的腳本,再結(jié)合 crontab 就可以完成后臺數(shù)據(jù)的定時更新操作了。
(3). 但是畢竟寫個接口安全性不是太高,而大家用的如果是 MySQL 數(shù)據(jù)庫,那就正好可以利用其自帶的定時操作了,下面簡單介紹 MySQL 定時操作的使用。
MySQL 配置
查看定時策略是否開啟,查看命令:
| show variables like '%event_sche%'; |
顯示的 event_scheduler 為 OFF 時用以下命令開啟:
| set global event_scheduler=1; |
以上的改法在數(shù)據(jù)庫重啟后將會恢復(fù)為原來狀態(tài),要想數(shù)據(jù)庫重啟后也可以讓 event_scheduler 開啟,則需要在配置文件 my.ini 的設(shè)置。修改如下,然后重啟 MySQL 服務(wù)即可:
| [mysqld] event_scheduler=ON // 這一行加入 mysqld 標(biāo)簽下 |
創(chuàng)建 procedure ( 存儲過程 )
什么是 procedure ( 存儲過程 ) ?
存儲過程?當(dāng)我聽到這個詞的時候,以為它是 MySQL 存儲數(shù)據(jù)的一個流程而不是一個名詞,但是當(dāng)我網(wǎng)上了解時,才知道這個詞是翻譯過來的,原生詞為 Procedure, 實(shí)際上它的含義就是相當(dāng)于我們面向?qū)ο罄锏姆椒ɑ蛘哒f是 函數(shù),在它里面可以完成多個 sql 語句的操作,并且可以定義參數(shù)傳值等,與一般的單條 sql 語句的區(qū)別主要在這里,詳細(xì)了解 點(diǎn)我。
創(chuàng)建存儲過程
先上一段創(chuàng)建存儲過程代碼:
| 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; : 這個誰都知道,使用某個數(shù)據(jù)庫,這里要強(qiáng)調(diào)的是存儲過程一定是對于某個數(shù)據(jù)庫而言的,所以必須要選中一個數(shù)據(jù)庫才能創(chuàng)建成功。
(2). delimiter // : 這個是將 MySQL 中以 ;(分號) 結(jié)尾的規(guī)定修改為以 //(雙斜杠) 為語句結(jié)束符,因?yàn)榇鎯^程里可以有多條 sql 語句,里面的 sql 語句都以 ; 號結(jié)尾,如果回車了那么系統(tǒng)會當(dāng)做 sql 語句直接執(zhí)行了,我們希望的是先定義這一系列 sql 語句而先不執(zhí)行,所以要改下操作結(jié)束符。當(dāng)然你在改后一定要改回來,大家可以看到最后一行有對應(yīng)的修改回來的語句。
(3). 下面所示的語句則是一起輸入的,可以知道分別是創(chuàng)建存儲過程 test_proce(), 名稱可以隨便起的,然后是在 begin --end 之間是定義一系列 sql 語句的就可以了,記住最后 end 結(jié)尾要以之前修改后的結(jié)尾符 // 結(jié)束。
| create procedure test_proce() begin insert into weuse(name,created_at,updated_at) values('hello',now(),now()); end// |
創(chuàng)建定時任務(wù)
上面創(chuàng)建存儲過程實(shí)際上是為 定時任務(wù) 做鋪墊的,因?yàn)樯厦嬷徽f明了怎么創(chuàng)建存儲過程,但是未說明怎么調(diào)用,那這里就用到了調(diào)用存儲過程了。
創(chuàng)建定時任務(wù) event ( 事件 )
依舊先上創(chuàng)建定時任務(wù)事件代碼:
| create event second_event on schedule every 1 second on completion preserve disable do call test_proce(); |
代碼說明:
查看定時任務(wù) event ( 事件 )
查看本機(jī)所有的事件:
| SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; |
開啟已經(jīng)創(chuàng)建好的 event ( 事件 )
| alter event second_event on completion preserve enable;//開啟定時任務(wù) alter event second_event on completion preserve disable;//關(guān)閉定時任務(wù) |
當(dāng)我們用第一句命令開啟定時任務(wù)時,可以就可以查看數(shù)據(jù)庫情況,已經(jīng)實(shí)現(xiàn)了 每秒鐘執(zhí)行一次 了,如圖:
要想關(guān)閉定時任務(wù)只要執(zhí)行上面的第二句命令,關(guān)閉需要關(guān)閉的定時任務(wù)就可以了。
常見周期定時規(guī)則
① 周期執(zhí)行 – 關(guān)鍵字 EVERY
單位有:second, minute, hour, day, week(周), quarter(季度), month, year,如:
| on schedule every 1 second //每秒執(zhí)行1次 on schedule every 2 minute //每兩分鐘執(zhí)行1次 on schedule every 3 day //每3天執(zhí)行1次 |
② 在具體某個時間執(zhí)行 – 關(guān)鍵字 AT, 如:
| on schedule at current_timestamp()+interval 5 day // 5天后執(zhí)行 on schedule at current_timestamp()+interval 10 minute // 10分鐘后執(zhí)行 on schedule at '2016-10-01 21:50:00' // 在2016年10月1日,晚上9點(diǎn)50執(zhí)行 |
③ 在某個時間段執(zhí)行 – 關(guān)鍵字 STARTS ENDS, 如:
| on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month // 5天后開始每天都執(zhí)行執(zhí)行到下個月底 on schedule every 1 day ends current_timestamp()+interval 5 day //從現(xiàn)在起每天執(zhí)行,執(zhí)行5天 |
效率工具
MysqlWorkBench
是官方推薦的免費(fèi)可視化 MySQL 操作工具,方便建模,ER 圖操作,經(jīng)我發(fā)現(xiàn)好像只能可視化操作存儲過程,沒看到有定時任務(wù)的 ( 也可能是自己沒找到 )。
存儲過程示例如下:
對于 Event 事件,可以查看,用 sql 命令
| SELECT * FROM information_schema.EVENTS; // 查看所有事件屬性 SELECT event_name,event_definition,interval_value,interval_field,status FROM information_schema.EVENTS; // 查看主要幾個屬性 |
Navicat
這個是收費(fèi)的軟件,但是可視化操作比較輕量級,功能也很多,它可以可視化操作存儲過程和Event 事件,詳細(xì)操作大家可以自己摸索啊!!
- 本文作者: jiyiren
- 本文鏈接: http://yoursite.com/2016/03/27/Mysql_schedule/
- 版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協(xié)議。轉(zhuǎn)載請注明出處!
總結(jié)
以上是生活随笔為你收集整理的MySQL 中的定时任务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql批量插入on duplicat
- 下一篇: 和领导相处的10条法则,越早知道越好