Post by Paolo FioreQuesl record del TLOG *deve* essere riusato!!!
...non vorrei apparire insistente ribadendo sempre le stesse cose, ma quello
che sto cercando di dire (senza riuscire a spiegarmi) da diversi post è che
affinchè venga reso riutilizzabile un virtual log (è questa la porzione
minima da considerare e non il "record del t-log") occorre che si
verifichino entrambe le condizioni
1) il virtual log deve contenere TUTTE informazioni relative a transazioni
concluse
2) deve essere avvenuto un checkpoint o un backup del t-log (a seconda del
recovery model)
Quello che forse è stato sottointeso nei post precedenti è che per la
condizione 1) devono essere concluse ANCHE tutte le transazioni relative ai
virtual log precedenti e che, quindi, la "parte attiva" è dopo il virtual
log che deve essere svuotato. Il fatto di non poter fare un disegno
penalizza la mia esposizione, ma ci provo. Considera, nello schema seguente,
la riga vuota come la separazione tra 2 virtual log adiacenti e, nel
proseguo del tempo, il t-log registra le seguenti attività:
======================
BEGIN TRAN T1
ISTRUZIONE_A T1
CHECKPOINT
BEGIN TRAN T2
ISTRUZIONE_A T2
ISTRUZIONE_B T1
CHECKPOINT
ISTRUZIONE_B T2
COMMIT TRAN T1
CHECKPOINT
BEGIN TRAN T3
ISTRUZIONE_A T3
COMMIT TRAN T3
CHECKPOINT
ROLLBACK TRAN T2
CHECKPOINT
======================
Il primo checkpoint riporta su disco le informazioni come modificate da
ISTRUZIONE_A della transazione T1; subito dopo viene avviata un'altra
transazione ed una istruzione modifica dei dati in un diverso contesto; una
seconda istruzione (ISTRUZIONE_B T1) viene eseguita (registrata in un nuovo
virtual log) e successivamente un nuovo checkpoint riversa su disco le
pagine dati modificate dopo il precedente checkpoint. Un nuovo virtual log
contiene quindi le entry relative ad una nuova istruzione (appartenente a
T2) ed il commit della transazione T1. Nuovo virtual log e nuovo checkpoint
che scrive delle pagine dati su disco e solo a questo punto può essere
liberato il primo virtual log (se il recovery model è simple oppure al
successivo backup del t-log con gli altri rm). Solo il primo virtual log,
infatti, riguarda transazioni già concluse e viene marcato come INATTIVO (le
info contenute non sono più indispensabili per un eventuale processo di
recovery). Dopo questo checkpoint viene avviata una transazione, eseguita
un'istruzione e confermata la stessa. In un nuovo virtual log viene quindi
marcato un evento di checkpoint. Questo evento non marcherà come inattiva
alcuna porzione di t-log (sebbene nel precedente virtual log ci siano SOLO
info relative a transazioni concluse) a causa della presenza di una
transazione aperta. In questo momento il Min LSN è posizionato sul punto
BEGIN TRAN T2; fintanto che rimane aperta questa transazione, per quante
transazioni vengano iniziate e concluse e per quanti eventi di checkpoint
incorrano, per quanti backup del t-log vengano eseguiti, NESSUN virtual log
verrà svuotato. Solo la chiusura della transazione T2 (ed il successivo
checkpoint), farà avanzare il MinLSN rendendo liberabili, dopo l'ultimo
checkpoint, tutti i virtual log (fino a quello dove è il COMMIT TRAN 3)
mantenendo attivo solo l'ultimo virtual log (un virtual log attivo ci sarà
sempre).
Ho semplificato la situazione comprendendo un numero limitato di entry per
ciascun virtual log, ma il principio di funzionamento è questo. In sostanza
ad ogni entry viene assegnato un valore LSN (Log Sequence Number) ed in
considerazione del valore LSN relativo alla transazione aperta più vecchia
(Min LSN) vengono marcati come inattivi (quindi svuotabili in occasione del
checkpoint o di un backup del t-log a seconda del rm) SOLO i virtual log
precedenti a tale Min LSN.
E' possibile conoscere lo stato dei virtual log utilizzando l'istruzione
DBCC LOGINFO ('nomedb')
(si tratta di una istruzione non documentata di cui non vi è traccia nel
BOL). I virtual log attivi (pertanto non svuotabili e non riciclabili) sono
quelli con il campo Status = 2.
In presenza di una situazione come quella ipotizzata (una unica vecchia
transazione che impedisce il riutilizzo di tutto o parte del t-log)
l'esecuzione dell'istruzione di cui sopra mostra un numero molto elevato di
virtual log con Status = 2.
Spero di aver contribuito a fare un po più di chiarezza. Se non ci sono
riuscito ora non ci riesco più... ;-)
Bye
--
Luca Bianchi
Microsoft MVP - SQL Server
http://blogs.aspitalia.com/lucabianchi/
http://mvp.support.microsoft.com