Compattazione del log delle transazioni

Se si ritiene che un file del log delle transazioni contiene spazio inutilizzato che non è necessario, è possibile recuperare lo spazio in eccesso riducendo le dimensioni del log delle transazioni. Questo processo è noto come compattazione del file di log.

La compattazione può verificarsi solo mentre il database è in linea e quando almeno un file di log virtuale è disponibile. In alcuni casi, la compattazione del log potrebbe non essere possibile finché il log non viene troncato.

Nota

In genere, il troncamento si verifica automaticamente nel modello di recupero con registrazione minima durante il backup del database e nel modello di recupero con registrazione completa durante il backup del log delle transazioni. Tuttavia, il troncamento può essere ritardato per una serie di fattori. Per ulteriori informazioni, vedere Fattori che possono ritardare il troncamento del log..

Per compattare un file di log (senza compattare i file di database)

Per monitorare gli eventi di compattazione dei file di log

To monitor log space

Nota

La compattazione dei file di log e di database può essere impostata in modo da essere eseguita automaticamente. È consigliabile tuttavia evitare di eseguire la compattazione automatica impostando la proprietà del database autoshrink su FALSE per impostazione predefinita. Se autoshrink viene impostato su TRUE, la compattazione automatica riduce le dimensioni di un file solo quando più del 25 percento dello spazio del file risulta inutilizzato. Il file viene compattato fino a quando la percentuale di spazio inutilizzato nel file non risulta pari al 25 percento oppure fino a quando il file non raggiunge le dimensioni originali, a seconda di quale tra questi due sia il valore maggiore. Per informazioni sulla modifica dell'impostazione della proprietà autoshrink, vedere Procedura: Visualizzazione o modifica delle proprietà di un database (SQL Server Management Studio) (utilizzo della proprietà Auto Shrink nella pagina Opzioni) o Opzioni ALTER DATABASE SET (Transact-SQL) (utilizzo dell'opzione AUTO_SHRINK).

Utilizzo della compattazione del file di log

La compattazione del log delle transazioni consente di ridurre le relative dimensioni fisiche tramite la rimozione di uno o più file di log virtuali non attivi. L'unità di riduzione delle dimensioni è sempre il file di log virtuale. Se, ad esempio, un file di log di 600 MB è stato diviso in sei log virtuali di 100 MB, è possibile ridurre le dimensioni del file di log solo con incrementi di 100 MB. Le dimensioni del file possono essere ridotte, ad esempio, a 500 MB o 400 MB, ma non a dimensioni quali 433 MB o 525 MB. Un file di log virtuale che contiene record di log attivi, ovvero un file di log virtuale attivo, fa parte del log logico e non può essere rimosso. Per ulteriori informazioni, vedere Architettura fisica del log delle transazioni.

Nota

Le dimensioni del file di log virtuale vengono scelte in modo dinamico da Motore di database durante la creazione o l'estensione dei file di log. Per ulteriori informazioni, vedere Architettura fisica del log delle transazioni.

Per un file di log, le dimensioni correnti corrispondono alle dimensioni totali delle pagine utilizzate dai file di log virtuali. Si noti, tuttavia, che le pagine non vengono utilizzate dai file di log. Non è possibile liberare file di log virtuali che includono una parte del log logico. Se tutti i file di log virtuali in un file di log contengono parti del log logico, il file non potrà essere compattato. La compattazione non sarà possibile finché uno o più file di log virtuali non verranno contrassegnati come non attivi dopo il troncamento del log.

Con un'operazione di compattazione dei file vengono rimossi solo i file di log virtuali non attivi. Se non si specifica alcuna dimensione di destinazione, un'operazione di compattazione dei file rimuove solo i file di log virtuali non attivi che superano l'ultimo file di log virtuale attivo presente nel file. Se vengono specificate dimensioni di destinazione, una determinata operazione di compattazione dei file rimuove solo la quantità di file di log virtuali non attivi sufficiente per avvicinarsi alle dimensioni di destinazione, senza superarle. Dopo la compattazione, il file di log ha generalmente dimensioni superiori alle dimensioni di destinazione e mai dimensioni inferiori. I file di log virtuali rendono difficile stimare l'entità effettiva della compattazione del file di log.

Quando viene compattato un file, viene liberato lo spazio alla fine del file. Quando viene compattato un file di log delle transazioni, viene liberato alla fine del file un numero di log virtuali sufficiente a ridurre il log fino alle dimensioni richieste dall'utente. Il valore target_size specificato dall'utente viene arrotondato in eccesso al valore limite più prossimo consentito dalle dimensioni assegnate ai file di log virtuali. Se, ad esempio, un utente specifica un valore target_size di 325 MB per il file di esempio di 600 MB contenente sei file di log virtuali di 100 MB, verranno rimossi gli ultimi due file di log virtuali e le dimensioni del nuovo file saranno pari a 400 MB.

Un'operazione DBCC SHRINKDATABASE o DBCC SHRINKFILE tenta di compattare immediatamente il file di log fisico alle dimensioni necessarie:

  • Se i file log virtuali oltre il valore limite target_size non includono parti del log logico, tali log virtuali oltre il valore limite target_size vengono liberati e l'istruzione DBCC viene eseguita correttamente senza generare messaggi.

Se parte del log logico inclusa nei log virtuali supera il valore limite target_size, tramite Motore di database di SQL Server viene liberata la maggiore quantità di spazio possibile e viene visualizzato un messaggio informativo. Nel messaggio sono indicate le operazioni che è necessario eseguire per rimuovere il log logico dai log virtuali alla fine del file. Al termine di questa operazione, è possibile eseguire nuovamente l'istruzione DBCC per liberare lo spazio rimanente.

Si supponga, ad esempio, che un file di log di 600 MB contenente sei file di log virtuali includa un log logico che inizia nel log virtuale 3 e termina nel log virtuale 4. Si supponga inoltre di eseguire un'istruzione DBCC SHRINKFILE con un valore target_size di 275 MB, corrispondente ai tre quarti della dimensione fino a parte del log virtuale 3:

File di log con 6 file di log virtuali prima della compattazione

I file di log virtuali 5 e 6 vengono liberati immediatamente, in quanto non includono parti del log logico. Per ottenere il valore target_size specificato, tuttavia, è necessario liberare anche il file di log virtuale 4, operazione che non può essere eseguita in quanto tale file include la parte finale del log logico. Dopo avere liberato i file di log virtuali 5 e 6, tramite Motore di database viene riempita la parte rimanente del file di log virtuale 4 con record fittizi. In questo modo, la parte finale del file di log viene trasferita nel file di log virtuale 1. Nella maggior parte dei sistemi, il commit di tutte le transazioni che iniziano nel file di log virtuale 4 verrà eseguito in pochi secondi. Ciò significa che l'intera parte attiva del log viene spostata nel file di log virtuale 1. Il file di log avrà ora un aspetto simile al seguente:

Il file di log viene ridotto a 4 file virtuali

L'istruzione DBCC SHRINKFILE genera anche un messaggio informativo che segnala l'impossibilità di liberare tutto lo spazio richiesto e indica che è possibile eseguire un'istruzione BACKUP LOG per liberare lo spazio rimanente. Al termine del trasferimento della parte attiva del log nel file di log virtuale 1, l'istruzione BACKUP LOG troncherà l'intero log logico incluso nel file di log virtuale 4:

Risultati per il file di log dopo il troncamento del log

Poiché il file di log virtuale 4 non include più alcuna parte del log logico, è ora possibile eseguire la stessa istruzione DBCC SHRINKFILE con un valore target_size di 275 MB. Il file di log virtuale 4 verrà quindi liberato e le dimensioni del file di log fisico verranno ridotte in base al valore richiesto.

Nota

In alcuni casi, se ad esempio si esegue una transazione molto lunga, è possibile che i file di log virtuali vengano tenuti attivi per lungo tempo. Tale condizione può limitare o talvolta impedire la compattazione del log. Per ulteriori informazioni, vedere Fattori che possono ritardare il troncamento del log..