Zusammenfassungen

Universitätsnotizen im Markdown-Format aus Obsidian.

Scheduling

È possibile definire due tipologie di eventi:

  • ad una sola esecuzione;
  • ricorrente.

Nel primo caso si specifica il timestamp di esecuzione, mentre nel secondo caso viene specificato l’intervallo di ripetizione, sotto forma di un numero di minuti, ore, giorni, fino ad anni.

Procediamo con un semplice esempio di schedulazione, atto ad illustrate la sintassi da utilizzare.

Si ha una tabella che servirà da contenitore:

CREATE TABLE 'regeventi' (
    'ID_RIGA' int(11) NOT NULL AUTO_INCREMENT,
    'data' datetime DEFAULT NULL,
    'conteggio' int(11) DEFAULT NULL,
    PRIMARY KEY ('ID_RIGA')
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

La tabella oltre alla chiave primaria ha un campo data che memorizzerà il momento in cui scatta l’evento, e un campo numerico che fungerà da contatore delle sue repliche.

La seguente procedura verrà richiamata periodicamente dall’evento:

delimiter |
CREATE PROCEDURE 'memScatto'() NOT DETERMINISTIC
SQL SECURITY DEFINER COMMENT ''
BEGIN
    DECLARE iConteggio INT;
    SET iConteggio = 0;

    SELECT IFNULL(max(conteggio)+1, 1) INTO iConteggio from regeventi;

    INSERT INTO 'regeventi' ('data', 'conteggio') VALUES (now(), iConteggio);
END |
delimiter;

Si creerà un evento di tipologia ricorrente, con intervallo di un minuto, che si occuperà di richiamare la procedura memScatto:

CREATE EVENT contaMinuti ON SCHEDULE EVERY 1 MINUTE DO call memScatto;

Con questi comandi DDL è stato preparato il sistema, ma occorre attivare il processo di scheduling.

Per far si che un evento venga eseguito dal DBMS, è necessario che venga registrato nell’event scheduler di MySQL. Sarà questo infatti ad occuparsi di eseguire periodicamente (nel tempo definito dall’amministratore) i vari eventi. Prima di creare un evento, bisogna che l’event scheduler venga attivato all’interno del nostro database, perché di default questo è disabilitato.

Questo si ottiene tramite una variabile globale event_scheduler. Si possono controllare i valori di tutte le variabili settate utilizzando il comando:

SHOW GLOBAL VARIABLES [LIKE 'pattern'];

Nel nostro caso:

Show global varables like '%event%';

Se event_scheduler è a OFF, la schedulazione degli eventi è disattivata e si può utilizzare il seguente comando per l’attivazione:

SET GLOBAL event_scheduler = ON;

Una volta in esecuzione il processo che sovrintende agli eventi, ogni minuto scatterà contaMinuti, che richiamerà la procedura memScatto e questa inserirà un record nella tabella regeventi. La query SELECT FROM 'regeventi';* mostrerà i record inseriti con data, che differisce esattamente di un minuto uno dall’altro.

Con il comando:

SHOW PROCESSLIST;

controlliamo tutti i processi attivi in MySQL.

Creazione di un evento

Lo scheletro SQL per la creazione di un evento è il seguente:

CREATE EVENT [IF NOT EXIST] event_name 
ON SCHEDULE periodo_di_esecuzione 
DO corpo_dell_evento

Nella prima parte del codice SQL presentato, vediamo che un evento deve possedere un nome univoco prima di poter essere creato. La clausola ON SCHEDULE, invece, definisce il periodo in cui l’evento deve essere eseguito.

Abbiamo due possibili configurazioni temporali per un evento:

  • ON SCHEDULE AT [...]
  • ON SCHEDULE EVERY number-of-time-units time-unit [STARTS timestamp] [ENDS timestamp]

La sintassi AT permette l’esecuzione dell’evento una singola volta, mentre EVERY permette di definire sia il numero di volte che l’evento deve essere eseguito, sia il suo intervallo temporale di esecuzione.

CREATE EVENT Syntax

CREATE [DEFINER = { user | CURRENT_USER }] 
    EVENT [IF NOT EXISTS] event_name 
    ON SCHEDULE schedule 
    [ON COMPLETION [NOT] PRESERVE] 
    [ENABLE | DISABLE | DISABLE ON SLAVE] 
    [COMMENT 'comment'] 
    DO event_body; 

    schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] 
    [ENDS timestamp [+ INTERVAL interval] ...] 

    interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

Esempio

CREATE EVENT myevent 
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR 
    DO 
        UPDATE myschema.mytable SET mycol = mycol + 1;

Viene creato un evento di nome myevent che esegue, una volta dopo un’ora dalla sua creazione, l’SQL specificato dopo il DO.

Cancellare un evento

SHOW CREATE EVENT <event_name>\G

DROP EVENT [IF EXISTS] event_name

Event_scheduler

Per far sì che un evento venga eseguito dal DBMS, è necessario che venga registrato nell’event scheduler di MySQL. Sarà questo infatti ad occuparsi di eseguire periodicamente (nel tempo definito dall’amministratore) i vari eventi. Prima di creare un evento, bisogna che l’event scheduler venga attivato all’interno del nostro database, perché di default questo è disabilitato. Per far ciò bisogna lanciare il seguente comando SQL nella console di MySQL:

SET GLOBAL event_scheduler = ON;

dopo aver abilitato lo scheduler possiamo verificare quali eventi sono registrati al suo interno. Eseguiamo il comando:

SHOW PROCESSLIST;

Per disabilitare l’event scheduler:

SET GLOBAL event_scheduler = OFF;