sys.dm_db_log_info (Transact-SQL)

S’applique à : SQL Server 2016 (13.x) SP 2 et versions ultérieures Azure SQL Database Azure SQL Managed Instance

Retourne les informations du fichier journal virtuel (VLF) du journal des transactions. Notez que tous les fichiers journaux des transactions sont combinés dans la sortie de la table. Chaque ligne de la sortie représente un VLF dans le journal des transactions et fournit des informations pertinentes pour ce VLF dans le journal.

Syntaxe

sys.dm_db_log_info ( database_id )  

Arguments

database_id | NULL | PAR DÉFAUT

ID de la base de données. database_id est int. Les entrées valides sont le numéro d’ID d’une base de données, NULL ou DEFAULT. Le par défaut est NULL. NULL et DEFAULT sont des valeurs équivalentes dans le contexte de la base de données active.

Spécifiez NULL pour retourner les informations VLF de la base de données active.

La fonction intégrée DB_ID peut être spécifiée. Lorsque vous utilisez DB_ID sans spécifier de nom de base de données, le niveau de compatibilité de la base de données actuelle doit être supérieur ou égal à 90.

Table retournée

Nom de la colonne Type de données Description
database_id int ID de la base de données.

Dans Azure SQL Database, les valeurs sont uniques au sein d’une base de données unique ou d’un pool élastique, mais pas dans un serveur logique.
file_id smallint ID de fichier du journal des transactions.
vlf_begin_offset bigint Décalage de l’emplacement du fichier journal virtuel (VLF) à partir du début du fichier journal des transactions.
vlf_size_mb float Taille du fichier journal virtuel (VLF) dans Mo, arrondie à deux décimales.
vlf_sequence_number bigint numéro de séquence du fichier journal virtuel (VLF) dans l’ordre créé. Permet d’identifier de manière unique les fonctions VLF dans le fichier journal.
vlf_active bit Indique si le fichier journal virtuel (VLF) est en cours d’utilisation ou non.
0 - VLF n’est pas utilisé.
1 - VLF est actif.
vlf_status int État du fichier journal virtuel (VLF). Les valeurs possibles sont les suivantes :
0 - VLF est inactif
1 - VLF est initialisé mais inutilisé
2 - VLF est actif.
vlf_parity tinyint Parité du fichier journal virtuel (VLF). Utilisé en interne pour déterminer la fin du journal dans un VLF.
vlf_first_lsn nvarchar(48) Numéro de séquence de journal (LSN) du premier enregistrement de journal dans le fichier journal virtuel (VLF).
vlf_create_lsn nvarchar(48) Numéro de séquence de journal (LSN) de l’enregistrement journal qui a créé le fichier journal virtuel (VLF) .
vlf_encryptor_thumbprint varbinary(20) S’applique à : SQL Server 2019 (15.x) et versions ultérieures

Affiche l’empreinte numérique du chiffreur du VLF si le VLF est chiffré à l’aide de Transparent Data Encryption, sinon NULL.

Notes

La sys.dm_db_log_info fonction de gestion dynamique remplace l’instruction DBCC LOGINFO .

La formule du nombre de VLF créées en fonction d’un événement de croissance est détaillée dans le Guide de gestion et d’architecture du journal des transactions SQL Server. Cette formule a changé légèrement à partir de SQL Server 2022 (16.x).

Autorisations

Nécessite l’autorisation VIEW SERVER STATE dans la base de données.

Autorisations pour SQL Server 2022 (et versions plus récentes)

Nécessite l’autorisation VIEW DATABASE PERFORMANCE STATE sur la base de données.

Exemples

R. Déterminer les bases de données dans une instance SQL Server avec un nombre élevé de fonctions VLF

La requête suivante détermine les bases de données avec plus de 100 VLF dans les fichiers journaux, ce qui peut affecter le temps de démarrage, de restauration et de récupération de la base de données.

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. Déterminer la position du dernier VLF dans le journal des transactions avant de réduire le fichier journal

La requête suivante peut être utilisée pour déterminer la position du dernier VLF actif avant d’exécuter SHRINK FILE dans le journal des transactions pour déterminer si le journal des transactions peut être réduit.

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