【轉載】MySQL 利用 event 來定期執行 stored procedure–20130428

事情是這樣子的,有一個 log_min 的資料表,為每分鐘記錄一筆。但若是要跑月表(以小時為基本單位)、年表(以天為基本單位),從 log_min 開始計算會耗掉很多時間,所以就需要先將 log_min 轉換到每小時記錄一筆的 log_min_hr 資料表及轉換到每天記錄一筆的 log_min_day 資料表。

這個換算,就以利用 stored procedure 來幫忙囉!Frank 寫了一個 stp_min 的 SP,需要輸入(年,月)兩個參數值來確認要轉換何年何月的資料?

再來就是要定期去執行這個 SP 了,原本是由 Frank 寫支 WinForm 來做這件事情。原則是這個月跑的一定是上個月的資料,因為是月表嘛!但若有需要先看這個月的月表,嘿!就要修改 WinForm 程式囉!而且會有要執行這個月或是上個月的問題!所以,就來試試 MySQL 的 event 囉!

MySQL 版本:mysql55-5.5.27-log、mysql55-5.5.29-1

參考:藍色小舖、stackoverflow 123

第一步是需要知道該如何用指令執行這支 SP,stp_min。在 Navicat 先查 log_min_hr 最新記錄的時間為何?

查出來是 2013-02-28 23:00:00。接下來就是執行 SP 囉!利用 YEAR(NOW()) 及 MONTH(NOW()) 來取得執行的年與月。執行完後再去查 log_min_hr 的最新記錄的時間,果然已經變了。

接下來就是來建 event 了,因為指令不太熟,同樣利用 Navicat 來建建看。

點選「事件」按右鍵「新增事件」,在「定義」先輸入要執行的指令。

再到「排程」設定要執行的時間。

完成後按儲存,會出現輸入該事件的名稱。

按確定後,居然出現了下列的訊息。怪!

再回去「定義」檢視,狀態是「Enable」的。

先改成最近的時間來測測是否會生效?結果,是沒有執行的。所以,上網查了一下,先去執行 SELECT @@event_scheduler;,結果是 OFF,原來剛剛的訊息是指這個呀!

執行 SET @@global.event_scheduler = ON; 來啟動「事件排程」的功能。

再改成最近的時間來測試,果然就成功啦!

又多會了一個 MySQL 的功能,真是不錯!!

2013/04/28,發現好像排程沒有定期執行。再次去確認 event_scheduler 的狀態,是 OFF。原來 MySQL 服務重啟後就回復原狀啦!

上網找了相關資訊後,就在 my.ini 的 [mysqld] 區間加了筆 event_scheduler=ON,讓之後 MySQL 服務重啟後,event_scheduler 仍是 ON 的狀態。

原文出處:MySQL 利用 event 來定期執行 stored procedure–20130428

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>