1. 程式人生 > >Mysql資料庫——每天的9點到11點,每隔1分鐘執行一次儲存過程

Mysql資料庫——每天的9點到11點,每隔1分鐘執行一次儲存過程

思路分析:

1、看到這個需求,最先想到的是使用Mysql的Event事件做一個定時任務

2、但是寫定時任務時發現,某一天9點到11點每隔一分鐘執行一次儲存過程很容易,但是再加上每天的9點到11點,僅僅用Mysql的事件就做不到了。可能有很多小夥伴會說,我寫個巢狀事件就可以了,寫法為每隔一天的1點作為大事件,大事件執行的是當天的9點到11點的小事件,思路是對的,但是mysql不支援事件中建立事件,所以這個思路的大門被關閉了

3、最終想了一個辦法是:先寫一個建立事件的sql:當天的9點到11點每隔一分鐘執行一次儲存過程。然後再使用linux的crontab 每天的8:30定時執行sheel指令碼來執行這個sql,這樣就可以實現以上功能了

sql及sheel指令碼:

1、首先,在資料庫所在的伺服器上建立一個Sheel指令碼,我是在使用者目錄下建立了一個sh的目錄(mkdir sh)。然後在sh目錄下建立db_fx_life_sql.sh(touch db_fx_life_sql.sh,注意:建立檔案後要授權執行許可權:chmod 744 shu.sh,否則指令碼將無法執行),指令碼內容如下:

#!/bin/sh
user=fx_life
[email protected]
db=db_fx_life_dev
mysql -u$user -p$pass -D $db < /home/fx_life/sh/signEvent.sql

2、其次,在同目錄下建立要執行的sql檔案(touch signEvent.sql),sql中是建立事件的指令碼,內容如下:

DROP EVENT if exists stage_sign_in_event1;
            CREATE EVENT stage_sign_in_event1
            on schedule every 60 second STARTS DATE_ADD(CURDATE(), INTERVAL 9 HOUR) ENDS DATE_ADD(CURDATE(),              INTERVAL 11 HOUR)
            on completion preserve 
            do call insert_stage_sign_in_dynamic(FLOOR(1 + (RAND() * 101)));

3、最後,使用crontab -e命令編輯linux 定時任務:

30 8 * * * /home/fx_life/sh/db_fx_life_sql.sh

規則是:每天的8:30執行一次sheel指令碼,這個時間設定有點類似於quartz的時間設定,但又不完全相同:  

依次為:分鐘,小時,日,月,星期。

編輯好了之後以:wq方式儲存,跟vim編輯器儲存方式相同。

番外:

實現這個功能還有一個思路是寫一個事件,事件規則為從現在開始每隔一分鐘執行一次儲存過程,而儲存過程要改一下,在儲存過程中加一個判斷,判斷被呼叫的時間是不是在9點到11點之間,如果是就執行原來儲存過程的內容,如果不是就不執行。但是這麼寫有個弊端就是事件會一直在執行,這會在無形中給資料庫帶來壓力。

實現這個功能參考的資料為:

1、linux crontab定時及sheel指令碼部落格:https://www.linuxidc.com/Linux/2017-09/146893.htm

2、mysql定時事件部落格:https://www.cnblogs.com/itfenqing/p/6884650.html