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_info
sostituisce 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