MySQL定期タスクの実行

8748 ワード

MySQLは定期的にタスクを実行する方法
実際のプロジェクトでは、会員が期限切れかどうかをチェックするなど、定期的に業務を処理する必要があります.mysqlは定期的なタスクを実行できます.次に、私が書いたプロジェクトを例に、mysqlが定期的なタスクを実行する方法を記録します.
プロジェクトの背景
この項目はユーザを記録した会員であり,ユーザ登録以来,会員期間は30日であり,ユーザが30日以内に注文をしなければ会員等級は低下する.定期的に会員の状態をチェックする機能です.期限切れかどうかを判断する.私はmysqlのイベント機能を採用し、処理しています.イベントを処理するには、まずストレージ・プロシージャ、または関数が必要です.ここでは、ストレージ・プロシージャを例に挙げます.この機能の実現には3つのステップがあります:(ここではイベントに関する操作はコマンド操作を使用することを提案しますが、ツールを使用すると、エラーを報告して解決策を検討していません)
  • mysqlがイベント機能を開始するかどうかを確認し、次のコマンドを使用してイベントを開始するかどうかを確認します.OFFであれば
  • がオープンしていないことを示します.
    show variables like 'event_scheduler';
    

    イベントが開いていない場合は、イベントを開くコマンドを実行します.
    set global event_scheduler = on;
    

    上記の手順でイベントを開始できますが、データベース・サービスが再起動すると自動的にイベントが閉じます.データベースのインストールディレクトリを見つける必要がありますmy.ini、event_を追加scheduler=ONでいいです.2.ストレージ・プロシージャの作成(ツール作成、コマンド作成、ここではNavicatツールを使用して作成)
    CREATE DEFINER=`root`@`localhost` PROCEDURE `member_check`()
    BEGIN
    	/**
    			        ,          。
    			    :
    				1.            ,         ,              30 。
    				2.         。      ,                30 。
    			  :     5 ,1     ,5     
    	*/
    	#           ID
    	DECLARE member_id int;
    	#             ID
    	DECLARE grade_id int;
    	#               
    	DECLARE stop_time datetime;
    	#             
    	DECLARE now_time datetime;
    	#          
    	DECLARE done INT DEFAULT 0;
    	#     
    	DECLARE curr_row CURSOR FOR SELECT m_id,g_id,m_stop_time,NOW() now from t_member;
    	#    ,          ,         
    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    	#    
    	OPEN curr_row;
    	#    
    	flag_loop:loop
    		#        
    		FETCH curr_row INTO member_id,grade_id,stop_time,now_time;
    			#    ,    ,       ,       
    			IF done = 1
    				THEN LEAVE flag_loop;
    			ElSE
    				#  ,    ,          
    				IF ((stop_time-now_time)<0) THEN
    					#            ,       1 
    					IF(grade_id<5) THEN
    						SET grade_id = grade_id+1;
    					END IF;
    					UPDATE t_member SET g_id=grade_id,m_start_time=NOW(),m_stop_time=adddate(now(),30) WHERE m_id=member_id;
    				END IF;
    			END IF;
    	#    
    	end loop;
    	#    
    	CLOSE curr_row;
    END
    
  • 時間を作成し、イベント機能
  • をオンにします.
    #     ,check_member_over   ,schedule        ,    , , , , , ...
    create event if not exists check_member_over
    on schedule every 1 DAY
    STARTS '2020-04-25 10:00:00'
    on completion preserve
    do call member_check();
    #       
    alter event check_member_over on completion preserve enable;
    # ===========================             =============================
    alter event check_member_over on completion preserve disable;