Numeri di sequenza di log CLFS
In Common Log File System (CLFS), ogni record di log in un determinato flusso è identificato in modo univoco da un numero di sequenza di log (LSN). Quando si scrive un record in un flusso, viene restituito un LSN che identifica tale record per riferimento futuro.
I LSN creati per un determinato flusso formano una sequenza strettamente crescente. Vale a dire, l'LSN assegnato a un record di log in un determinato flusso è sempre maggiore degli LSN assegnati ai record di log scritti in precedenza nello stesso flusso. Le funzioni seguenti sono disponibili per confrontare le LSN dei record di log in un determinato flusso.
Le costanti CLFS_LSN_NULL e CLFS_LSN_INVALID sono i limiti inferiori e superiori per tutte le reti LSN valide. Qualsiasi LSN valido è maggiore o uguale a CLFS_LSN_NULL. Inoltre, qualsiasi LSN valido è strettamente minore di CLFS_LSN_INVALID. Si noti che CLFS_LSN_NULL è un LSN valido, mentre CLFS_LSN_INVALID non è un LSN valido. È anche possibile confrontare CLFS_LSN_INVALID ad altri LSN usando le funzioni nell'elenco precedente.
Per ogni flusso, CLFS tiene traccia di due LSN speciali: LSN di base e l'ultima LSN. Inoltre, ogni singolo record di log ha due LSN speciali (l'LSN precedente e l'LSN non successivo) che è possibile usare per creare catene di record di log correlati. Le sezioni seguenti descrivono in dettaglio questi LSN speciali.
Base LSN
Quando un client scrive il primo record in un flusso, CLFS imposta l'LSN di base sull'LSN del primo record. LSN di base rimane invariato finché un client non lo modifica. Quando i client del flusso non hanno più bisogno dei record precedenti a un determinato punto del flusso, possono aggiornare l'LSN di base chiamando ClfsAdvanceLogBase o ClfsWriteRestartArea. Ad esempio, se i client non hanno più bisogno dei primi cinque record di log, possono impostare l'LSN di base sull'LSN del sesto record.
Ultimo LSN
Poiché i client scrivono record in un flusso, CLFS regola l'ultimo LSN in modo che sia sempre l'LSN dell'ultimo record scritto. Se i client non hanno più bisogno dei record dopo un determinato punto nel flusso, possono aggiornare l'ultimo LSN chiamando ClfsSetEndOfLog. Ad esempio, se i client non hanno più bisogno di record scritti dopo il decimo record, possono troncare il flusso impostando l'ultimo LSN sull'LSN del decimo record.
Parte attiva di un flusso
La parte attiva di un flusso è la parte di un flusso che inizia con il record a cui fa riferimento l'LSN di base e termina con il record a cui punta l'ultimo LSN. Il diagramma seguente illustra come l'LSN di base e l'ultima LSN delineano la parte attiva di un flusso.
Nota Se un flusso ha una coda di archiviazione, la parte attiva del flusso inizia con il record a cui fa riferimento l'LSN di base o la coda di archiviazione, che tuttavia è più piccola. Per altre informazioni sull'archiviazione, vedere Supporto CLFS per l'archiviazione.
LSN precedente
Si supponga che due transazioni di database attive (transazioni A e transazioni B) scrivono i record nello stesso flusso contemporaneamente. Ogni transazione A scrive un record, imposta l'LSN precedente del record sull'LSN del record di log precedente scritto dalla transazione A. Che forma una catena di record di log, appartenente alla transazione A, che può essere attraversata in ordine inverso. La catena termina con il primo record di log scritto dalla transazione A, con il relativo LSN precedente impostato su CLFS_LSN_INVALID. Analogamente, la transazione B crea la propria catena di record di log impostando l'LSN precedente di ogni record di log che scrive.
Le frecce del diagramma seguente illustrano come l'LSN precedente di un record di log punta al record precedente in una catena che appartiene a una determinata transazione.
Annullare l'LSN successivo
Si supponga che una transazione effettua cinque aggiornamenti a un oggetto dati in memoria volatile, esegue il rollback del quarto e quinto aggiornamento e quindi effettua un sesto aggiornamento. Poiché la transazione effettua gli aggiornamenti, scrive i record di log 1, 2, 3, 4, 5, 5', 4' e 6. I record di log da 1 a 5 descrivono le modifiche apportate dagli aggiornamenti da 1 a 5. Il record 5' descrive le modifiche apportate durante il rollback dell'aggiornamento 5 e il record 4' descrivono le modifiche apportate durante il rollback dell'aggiornamento 4. Infine, il record 6 descrive le modifiche apportate dall'aggiornamento 6. Si noti che i numeri 1, 2, 3, 4, 5, 5', 4'e 6 non sono gli LSN dei record di log; sono solo numeri usati per assegnare un nome ai record di log a scopo di questa discussione.
I record di log 5' e 4', che descrivono il rollback, sono denominati record di log di compensazione (CLR). La transazione imposta l'LSN undo-next di ogni CLR sul predecessore (tra i record scritti dalla transazione) del record di log il cui aggiornamento è stato appena eseguito il rollback (annullato). In questo esempio, l'LSN non successivo del record 5' è l'LSN del record 4 e l'LSN non successivo del record 4' è l'LSN del record 3.
I record di log ordinari (quelli che non sono CLR), hanno le loro LSN non successive impostate sul record di log precedente scritto dalla transazione. Vale a dire, per un record ordinario, l'LSN e l'LSN precedente sono gli stessi.
Si supponga ora che si verifichi un errore di sistema e, durante il ripristino di riavvio, è necessario eseguire il rollback dell'intera transazione. Il codice di ripristino legge il record del log 6. I dati nel record 6 indicano che il record 6 è un record normale (non CLR), quindi il codice di ripristino esegue il rollback dell'aggiornamento 6. Il codice di ripristino controlla quindi l'LSN successivo di annullamento del record 6 e rileva che punta al record 4'. I dati nel record 4' indicano che è un CLR, quindi il codice di ripristino non esegue il rollback dell'aggiornamento 4'. Controlla invece l'LSN successivo di annullamento del record 4' e rileva che punta al record 3. Il record 3 non è un CLR, quindi il codice di ripristino esegue il rollback dell'aggiornamento 3. Aggiornamenti 5 e 4 non vengono eseguito il rollback durante il ripristino perché sono già stati eseguito il rollback durante l'elaborazione in avanti normale. Infine, il codice di ripristino esegue il rollback degli aggiornamenti 2 e 1.
Le frecce del diagramma seguente illustrano come l'LSN annullata fornisce un meccanismo che il codice di ripristino può usare per ignorare i record i cui aggiornamenti sono già stati eseguito il rollback.