Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum funktioniert der MySQL-Ereigniszeitplan nicht in der Datenbank localhost?

Sehen Sie sich Folgendes an.

Geben Sie select CURRENT_TIMESTAMP; aus oder

select count(*) as theCount
from customer_group
where is_status=1 and CURRENT_TIMESTAMP >= end_date;

Mit anderen Worten, machen Sie eine Aufklärung. Ereignisse werden stillschweigend erfolgreich ausgeführt oder schlagen fehl, da sie keine Benutzeroberfläche haben.

Führen Sie einige Befehle aus wie:

show variables where variable_name='event_scheduler';

-- derzeit AUS (oder es könnte EIN sein)

Geben Sie die Startzeit für Ihr Ereignis während der Erstellung an und geben Sie ON COMPLETION PRESERVE an wie

drop event if exists `Every_5_Minutes_QuestionUpdateImport`;
DELIMITER $$
CREATE EVENT `Every_5_Minutes_QuestionUpdateImport`
  ON SCHEDULE EVERY 5 MINUTE STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
    --
    -- all your statements go here
    -- 
END$$
DELIMITER ;

Aktivieren Sie den Ereignishandler:

SET GLOBAL event_scheduler = ON;  -- turn her on and confirm below

Bestätigen Sie es:

show variables where variable_name='event_scheduler';

Untersuchen Sie den Status aller Ereignisse in einer bestimmten Datenbank anhand des Datenbanknamens:

show events from stackoverflow; -- note stackoverflow is my database name 

Deaktivieren oder aktivieren Sie ein bestimmtes Ereignis nach Namen in der aktuell ausgewählten Datenbank:

ALTER EVENT Every_2_Minutes_QuestionUpdateImport disable;
ALTER EVENT Every_2_Minutes_QuestionUpdateImport enable;

Und last but not least, wenn ich ein neues Event schreibe, füge ich immer initial in den Event-Anweisungen hinzu, um sie in eine Protokolltabelle zu protokollieren (mit einer Insert-Anweisung und einer Datumszeit von now()). ). Auf diese Weise weiß ich, dass es ausgelöst wurde, und dass Daten in einer where-Klausel wie Ihrer mir vielleicht keine falsche Interpretation der ganzen Sache geben.

Und ich meine, ich werde überall verrückt. Anfangs, dann remiere ich es später aus:

    set filename:=concat('c:\\datavault\\stackoverflow\\app01\\batches\\processMe_',LPAD(@idToPerform, 8, '0'),'.txt');
    set logMsg:=concat("It would appear I am to process this thing: ",filename);

    insert EvtsLog(incarnationId,evtName,step,debugMsg,dtWhenLogged)
    select incarnationId,evtAlias,10,logMsg,now(); -- 10: some step somewhere in the middle

Denken Sie für alle praktischen Zwecke (außer vielleicht Ihrer Tabelle, die Sie wirklich interessieren) ... an dieses EvtsLog von mir ist deine einzige Benutzeroberfläche als Ereignisprogrammierer und dein bester Freund.

Schauen Sie auf der Handbuchseite nach, was ON COMPLETION PRESERVE bedeutet sowie andere Dinge.