sys.dm_db_log_info (Transact-SQL)

Si applica a: SQL Server 2016 (13.x) SP 2 e versioni successive Database SQL di Azure Istanza gestita di SQL di Azure

Restituisce informazioni sul file di log virtuale (VLF) del log delle transazioni. Si noti che tutti i file registro transazioni vengono combinati nell'output della tabella. Ogni riga nell'output rappresenta un VLF nel log delle transazioni e fornisce informazioni rilevanti per tale VLF nel log.

Sintassi

sys.dm_db_log_info ( database_id )  

Argomenti

database_id | NULL | DEFAULT

ID del database. database_id is int. Gli input validi sono il numero di ID di un database, NULL, 0 o DEFAULT. Il valore predefinito è NULL. NULL e DEFAULT sono valori equivalenti nel contesto del database corrente.

Specificare NULL per restituire le informazioni VLF del database corrente.

È possibile specificare la funzione predefinita DB_ID. Quando si utilizza DB_ID senza specificare un nome di database, il livello di compatibilità del database corrente deve essere 90 o un valore superiore.

Tabella restituita

Nome colonna Tipo di dati Descrizione
database_id int ID del database.

In database SQL di Azure i valori sono univoci all'interno di un database singolo o di un pool elastico, ma non all'interno di un server logico.
file_id smallint Il file ID del log delle transazioni.
vlf_begin_offset bigint Posizione di scarto del file di log virtuale (VLF) dall'inizio del file registro transazioni.
vlf_size_mb float dimensioni del file di log virtuale (VLF) in MB, arrotondate a due cifre decimali.
vlf_sequence_number bigint numero di sequenza del file di log virtuale (VLF) nell'ordine creato. Usato per identificare in modo univoco le funzioni VLF nel file di resoconto.
vlf_active bit Indica se il file di log virtuale (VLF) è in uso o meno.
0 - VLF non è in uso.
1 - VLF è attivo.
vlf_status int Stato del file di log virtuale (VLF). I valori possibili includono
0 - VLF è inattivo
1 - VLF viene inizializzato ma inutilizzato
2 - VLF è attivo.
vlf_parity tinyint Parità del file di log virtuale (VLF). Usato internamente per determinare la fine del log all'interno di un file VLF.
vlf_first_lsn nvarchar(48) Numero di sequenza del file di log (LSN) del primo record di log nel file di log virtuale (VLF).
vlf_create_lsn nvarchar(48) Numero di sequenza del file di log (LSN) del primo record di log nel file di log virtuale (VLF).
vlf_encryptor_thumbprint varbinary(20) Si applica a: SQL Server 2019 (15.x) e versioni successive

Mostra l'identificazione personale del crittografatore del VLF se il file VLF è crittografato tramite Transparent Data Encryption; in caso contrario NULL.

Osservazioni:

La funzione a gestione dinamica sys.dm_db_log_infosostituisce l'istruzione DBCC LOGINFO.

La formula per il numero di VVLF creati in base a un evento di crescita è descritta in dettaglio nella Guida all'architettura e alla gestione del log delle transazioni di SQL Server. Questa formula è stata leggermente modificata a partire da SQL Server 2022 (16.x).

Autorizzazioni

In VIEW SERVER STATE è richiesta l'autorizzazione per il database.

Autorizzazioni per SQL Server 2022 e versioni successive

È richiesta l'autorizzazione VIEW DATABASE PERFORMANCE STATE per il database.

Esempi

R. Determinare i database in un'istanza di SQL Server con un numero elevato di VVLF

La query seguente determina i database con più di 100 file VVL nei file di log, che possono influire sull'avvio, la ripresa e il tempo di recupero del database.

SELECT [name], COUNT(l.database_id) AS 'vlf_count' 
FROM sys.databases AS s
CROSS APPLY sys.dm_db_log_info(s.database_id) AS l
GROUP BY [name]
HAVING COUNT(l.database_id) > 100;

B. Determinare la posizione dell'ultimo VLF nel log delle transazioni prima di compattare il file di resoconto

La query seguente può essere usata per determinare la posizione dell'ultimo VLF attivo prima di eseguire SHRINK FILE nel log delle transazioni per determinare se il log delle transazioni può ridursi.

USE AdventureWorks2022;
GO

;WITH cte_vlf AS (
SELECT ROW_NUMBER() OVER(ORDER BY vlf_begin_offset) AS vlfid, DB_NAME(database_id) AS [Database Name], vlf_sequence_number, vlf_active, vlf_begin_offset, vlf_size_mb
    FROM sys.dm_db_log_info(DEFAULT)),
cte_vlf_cnt AS (SELECT [Database Name], COUNT(vlf_sequence_number) AS vlf_count,
    (SELECT COUNT(vlf_sequence_number) FROM cte_vlf WHERE vlf_active = 0) AS vlf_count_inactive,
    (SELECT COUNT(vlf_sequence_number) FROM cte_vlf WHERE vlf_active = 1) AS vlf_count_active,
    (SELECT MIN(vlfid) FROM cte_vlf WHERE vlf_active = 1) AS ordinal_min_vlf_active,
    (SELECT MIN(vlf_sequence_number) FROM cte_vlf WHERE vlf_active = 1) AS min_vlf_active,
    (SELECT MAX(vlfid) FROM cte_vlf WHERE vlf_active = 1) AS ordinal_max_vlf_active,
    (SELECT MAX(vlf_sequence_number) FROM cte_vlf WHERE vlf_active = 1) AS max_vlf_active
    FROM cte_vlf
    GROUP BY [Database Name])
SELECT [Database Name], vlf_count, min_vlf_active, ordinal_min_vlf_active, max_vlf_active, ordinal_max_vlf_active,
((ordinal_min_vlf_active-1)*100.00/vlf_count) AS free_log_pct_before_active_log,
((ordinal_max_vlf_active-(ordinal_min_vlf_active-1))*100.00/vlf_count) AS active_log_pct,
((vlf_count-ordinal_max_vlf_active)*100.00/vlf_count) AS free_log_pct_after_active_log
FROM cte_vlf_cnt;
GO