sys.dm_db_log_info (Transact-SQL)

Se aplica a: SQL Server 2016 (13.x) SP 2 y versiones posteriores Azure SQL Database Azure SQL Managed Instance

Devuelve información del archivo de registro virtual (VLF) del registro de transacciones. Tenga en cuenta que todos los archivos de registro de transacciones se combinan en la salida de la tabla. Cada fila de la salida representa un VLF en el registro de transacciones y proporciona información relevante para ese VLF en el registro.

Sintaxis

sys.dm_db_log_info ( database_id )  

Argumentos

database_id | NULL | DEFAULT

Es el Id. de la base de datos. database_id is int. Las entradas válidas son el número de identificador de una base de datos, NULL o DEFAULT. El valor predeterminado de es NULL. NULL y DEFAULT son valores equivalentes en el contexto de la base de datos actual.

Especifique NULL para devolver información de VLF de la base de datos actual.

Se puede especificar la función integrada DB_ID. Al usar DB_ID sin especificar ningún nombre de base de datos, el nivel de compatibilidad de la base de datos actual debe ser 90 o superior.

Tabla devuelta

Nombre de la columna Tipo de datos Descripción
database_id int Id. de la base de datos.

En Azure SQL Database, los valores son únicos dentro de una base de datos única o un grupo elástico, pero no dentro de un servidor lógico.
file_id smallint El Id. de archivo del registro de transacciones.
vlf_begin_offset bigint Ubicación de desplazamiento del archivo de registro virtual (VLF) desde el principio del archivo de registro de transacciones.
vlf_size_mb float Tamaño del archivo de registro virtual (VLF) en MB, redondeado a dos posiciones decimales.
vlf_sequence_number bigint Número de secuencia del archivo de registro virtual (VLF) en el orden creado. Se usa para identificar VLF de forma única en el archivo de registro.
vlf_active bit Indica si el archivo de registro virtual (VLF) está en uso o no.
0 - VLF no está en uso.
1 - VLF está activo.
vlf_status int Estado del archivo de registro virtual (VLF). Los valores posibles son
0 - VLF está inactivo
1 - VLF se inicializa pero no se usa
2 - VLF está activo.
vlf_parity tinyint Paridad del archivo de registro virtual (VLF). Se usa internamente para determinar el final del registro dentro de un VLF.
vlf_first_lsn nvarchar(48) Número de secuencia de registro (LSN) del primer registro del archivo de registro virtual (VLF).
vlf_create_lsn nvarchar(48) Número de secuencia de registro (LSN) del primer registro que creó el archivo de registro virtual (VLF).
vlf_encryptor_thumbprint varbinary(20) Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

Muestra la huella digital del cifrador del VLF si el VLF se cifra mediante cifrado de datos transparente; de lo contrario, NULL.

Comentarios

La función de administración dinámica sys.dm_db_log_info reemplaza la instrucción DBCC LOGINFO.

La fórmula para el número de VLF que se crean en función de un evento de crecimiento se detalla en la Guía de administración y arquitectura del registro de transacciones de SQL Server. Esta fórmula cambió ligeramente a partir de SQL Server 2022 (16.x).

Permisos

Se necesita el permiso VIEW SERVER STATE en la base de datos.

Permisos para SQL Server 2022 y versiones posteriores

Requiere el permiso VIEW DATABASE PERFORMANCE STATE en la base de datos.

Ejemplos

A Determinación de bases de datos en una instancia de SQL Server con un gran número de VLF

La consulta siguiente determina las bases de datos con más de 100 VLF en los archivos de registro, lo que puede afectar al inicio, la restauración y el tiempo de recuperación de la base de datos.

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. Determinación de la posición del último VLF del registro de transacciones antes de reducir el archivo de registro

La consulta siguiente se puede usar para determinar la posición del último VLF activo antes de ejecutar SHRINK FILE en el registro de transacciones para determinar si el registro de transacciones se puede reducir.

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