sys.dm_db_log_info (Transact-SQL)

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

Renvoie 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 | DEFAULT

Est l’identificateur de la base de données. database_id is int. Les entrées autorisées sont l'ID d'une base de données ou la valeur 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 renvoyer les informations VLF de la base de données actuelle.

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

Table retournée

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

Dans la base de données Azure SQL, 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 L’identificateur du fichier journal des transactions.
vlf_begin_offset bigint Emplacement de décalage du fichier journal virtuel (VLF) depuis le début du fichier journal des transactions.
vlf_size_mb float Taille du fichier journal virtuel (VLF) en Mo, arrondie à deux décimales.
vlf_sequence_number bigint Numéro de séquence du fichier journal virtuel (VLF) dans l’ordre créé. Utilisé pour identifier de manière unique les 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 en cours d’utilisation.
1 - VLF est actif.
vlf_status int État du fichier journal virtuel (VLF). Les valeurs possibles sont
0 - VLF est inactif
1 - VLF est initialisé mais pas en cours d’utilisation
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 séquentiel dans le journal (LSN) du premier enregistrement de journal dans le fichier journal virtuel (VLF).
vlf_create_lsn nvarchar(48) Numéro de séquence du journal (LSN) de l’enregistrement du 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 digitale du chiffreur du VLF si le VLF est chiffré à l’aide du Transparent Data Encryption, sinon NULL.

Notes

La fonction de gestion dynamique sys.dm_db_log_info 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

Requiert l’autorisation VIEW SERVER STATE sur la base de données.

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

Requiert 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