Compattazione del log delle transazioni

La riduzione delle dimensioni fisiche del log delle transazioni implica la 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. 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 sui file di log virtuali, vedere Architettura fisica del log delle transazioni.

[!NOTA] Se il log delle transazioni non è stato troncato recentemente, la compattazione potrebbe non essere possibile finché il log non viene troncato. Per ulteriori informazioni, vedere Fattori che possono ritardare il troncamento del log.

Utilizzo della compattazione del file di log

L'unità di riduzione delle dimensioni è 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.

[!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 pagine utilizzate dai file di log virtuali. 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 vengono specificate dimensioni di destinazione, un'operazione di compattazione dei file rimuove tutti i file di log virtuali non attivi. 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:

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.

Quando si verifica la compattazione del log?

La compattazione del log può verificarsi mentre il database è in linea. Le dimensioni dei file di log vengono ridotte fisicamente nei casi seguenti:

  • Viene eseguita un'operazione di compattazione automatica.
  • Viene eseguita un'istruzione DBCC SHRINKFILE che fa riferimento a un file di log.
  • Viene eseguita un'istruzione DBCC SHRINKDATABASE.

Per compattare un file di log

Per monitorare gli eventi di compattazione dei file di log

Per monitorare l'utilizzo dello spazio del log

Vedere anche

Concetti

Risoluzione dei problemi relativi a un log delle transazioni pieno (Errore 9002)
Impostazione delle opzioni di database
Utilizzo dei backup del log delle transazioni
Troncamento del log delle transazioni

Altre risorse

BACKUP (Transact-SQL)
DBCC SHRINKDATABASE (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
Allocazione e riutilizzo dello spazio

Guida in linea e informazioni

Assistenza su SQL Server 2005