Capire i journal e come usarli

Accedi per salvare

La registrazione a giornale è una di quelle funzioni che si attivano perché "serve per il commitment control" e poi restano lì senza che nessuno le usi davvero. È un peccato, perché il giornale risponde a una domanda che nelle aziende si sente tutte le settimane: questo record chi l'ha cambiato, quando, e cosa c'era scritto prima?

Come è fatto

Servono due oggetti:

  • Il ricevitore di giornale (*JRNRCV), il file fisico dove le voci vengono scritte.
  • Il giornale (*JRN), che punta al ricevitore attivo e a cui si agganciano i file da sorvegliare.
CRTJRNRCV JRNRCV(MIALIB/JRNRCV0001)
          TEXT('Ricevitore dati applicativi')

CRTJRN JRN(MIALIB/JRNDATI)
       JRNRCV(MIALIB/JRNRCV0001)
       MNGRCV(*SYSTEM)
       DLTRCV(*NO)

MNGRCV(*SYSTEM) è importante: lascia al sistema il compito di staccare il ricevitore pieno e crearne uno nuovo. Senza, il ricevitore cresce finché non riempie il disco, ed è uno degli incidenti più classici.

DLTRCV(*NO) dice di non cancellare i ricevitori vecchi automaticamente. Vale la pena partire così — con la cancellazione automatica si rischia di perdere le voci prima di averle salvate — e passare a *YES solo quando la procedura di salvataggio dei ricevitori è in piedi e verificata.

Attivare la registrazione su un file

STRJRNPF FILE(MIALIB/CLIENTI)
         JRN(MIALIB/JRNDATI)
         IMAGES(*BOTH)
         OMTJRNE(*OPNCLO)

Le due opzioni contano molto:

IMAGES(*BOTH) registra sia il record prima della modifica sia quello dopo. Con *AFTER si vede solo il risultato: si sa cosa c'è adesso, non cosa c'era prima. Occupa di più, ma è ciò che rende il giornale utile per capire cosa è successo.

OMTJRNE(*OPNCLO) esclude dalla registrazione le voci di apertura e chiusura dei file. Sono rumore che gonfia il ricevitore senza aggiungere informazione.

La domanda di tutti i giorni

Un cliente sostiene che il fido era diverso. Il giornale sa rispondere:

DSPJRN JRN(MIALIB/JRNDATI)
       FILE(MIALIB/CLIENTI)
       FROMTIME('27/07/2026' '00:00:00')
       ENTTYP(*RCD)
       OUTPUT(*OUTFILE)
       OUTFILE(QTEMP/VOCI)

I tipi di voce che interessano nel lavoro sui dati sono tre: PT (record inserito), UP (record aggiornato) e DL (record cancellato). Con IMAGES(*BOTH) un aggiornamento produce due voci: l'immagine prima e quella dopo.

Riversando il risultato in un file (OUTPUT(*OUTFILE)), lo si interroga in SQL come qualsiasi altra tabella: si filtra per utente, per intervallo di tempo, per contenuto del record. È molto più pratico dello sfoglio a video, soprattutto quando le voci sono migliaia.

Ogni voce porta con sé l'ora, il job, il programma e il profilo utente che ha eseguito la modifica. È la risposta completa alla domanda iniziale, e non richiede che l'applicazione abbia previsto nessuna tracciatura.

Il ruolo per cui è nato: ripartire dopo un guasto

Il giornale colma la distanza fra l'ultimo salvataggio e il momento del guasto. Si ripristina il backup della sera prima, e poi si riapplicano dal giornale tutte le modifiche successive con APYJRNCHG. Se il salvataggio è delle 22 e il guasto arriva alle 17, si recupera l'intera giornata invece di perderla.

C'è anche l'operazione opposta, RMVJRNCHG, che toglie le modifiche a partire da un certo punto — utile quando un batch sbagliato ha aggiornato migliaia di record e occorre tornare indietro.

Entrambi i comandi vanno provati prima, in una libreria di collaudo. Sono operazioni che riscrivono i dati: non è il caso di conoscerli per la prima volta durante un'emergenza.

Lo spazio, che è il problema pratico

I ricevitori crescono, e su un file molto movimentato crescono in fretta. Le contromisure:

  • MNGRCV(*SYSTEM), così il cambio ricevitore è automatico.
  • Salvare i ricevitori insieme al backup, e solo dopo cancellarli.
  • Registrare i file giusti. Non tutti i file meritano il giornale: le tabelle di lavoro e quelle ricostruibili si possono escludere senza perdere nulla.
  • OMTJRNE(*OPNCLO), che toglie una quantità sorprendente di voci inutili.

Un controllo periodico dello spazio occupato dai ricevitori evita la sorpresa:

DSPOBJD OBJ(MIALIB/JRNRCV*) OBJTYPE(*JRNRCV) DETAIL(*FULL)

Il giornale di audit, che è una cosa diversa

Accanto ai giornali applicativi esiste QAUDJRN, il giornale di sicurezza: registra accessi, modifiche ai profili, tentativi di autorizzazione negati. Non riguarda i dati ma chi fa cosa sul sistema, e si attiva tramite i valori di sistema QAUDCTL e QAUDLVL.

Vale la pena averlo attivo anche se nessuno lo legge tutti i giorni: il momento in cui serve è sempre un momento in cui non lo si può più attivare retroattivamente.


Su quali versioni funziona

CRTJRNRCV, CRTJRN, STRJRNPF, DSPJRN, APYJRNCHG, RMVJRNCHG — comandi storici, presenti su tutte le release in uso e con lo stesso comportamento. La registrazione a giornale è una delle parti più stabili del sistema.

MNGRCV(*SYSTEM) per la gestione automatica dei ricevitori è disponibile da molte release ed è il valore da preferire. Il metodo manuale — staccare il ricevitore con CHGJRN JRNRCV(*GEN) da un programma pianificato — è quello che si usava prima e che si trova ancora su installazioni vecchie: funziona, ma richiede che qualcuno ricordi di farlo.

Il giornale di audit QAUDJRN, con i valori di sistema QAUDCTL e QAUDLVL, esiste da molto tempo. I singoli tipi di evento registrabili sono stati però ampliati nel corso delle release: l'elenco valido è quello della documentazione della propria versione.

La lettura in SQL delle voci di giornale — le release più recenti offrono QSYS2.DISPLAY_JOURNAL, che evita il passaggio per OUTFILE. È una IBM i Service, quindi la disponibilità dipende da release e livello di PTF. Il metodo mostrato nell'articolo (DSPJRN con OUTPUT(*OUTFILE) e poi query sul file) funziona su qualsiasi versione ed è per questo che l'ho usato.

Il commitment control si appoggia al giornale ed è anch'esso presente da molte release.

Fonti

← Torna al blog

Commenti

Nessun commento ancora. Sii il primo a commentare!

Devi avere un account per commentare. Accedi · Registrati