sys.dm_db_log_info (Transact-SQL)

Aplicável a: SQL Server 2016 (13.x) SP 2 e posterior Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Retorna informações do arquivo de log virtual (VLF) do log de transações. Observe que todos os arquivos de log de transações são combinados na saída da tabela. Cada linha da saída representa um VLF no registro de transações e fornece informações relevantes para esse VLF no registro.

Sintaxe

sys.dm_db_log_info ( database_id )  

Argumentos

database_id | NULL | DEFAULT

É a ID do banco de dados. database_id é int. As entradas válidas são o número de ID de um banco de dados, NULL ou DEFAULT. O padrão é NULL. NULL e DEFAULT são valores equivalentes no contexto do banco de dados atual.

Especifique NULL para retornar as informações de VLF do banco de dados atual.

A função interna DB_ID pode ser especificada. Ao usar DB_ID sem especificar um nome de banco de dados, o nível de compatibilidade do banco de dados atual deve ser 90 ou superior.

Tabela retornada

Nome da coluna Tipo de dados Descrição
database_id int ID do banco de dados.

No Banco de Dados SQL do Azure, os valores são exclusivos em um único banco de dados ou em um pool elástico, mas não em um servidor lógico.
file_id smallint O ID do arquivo do log de transações.
vlf_begin_offset bigint Local de deslocamento do arquivo de log virtual (VLF) a partir do início do arquivo de log de transações.
vlf_size_mb float tamanho do arquivo delog virtual (VLF) em MB, arredondado para duas casas decimais.
vlf_sequence_number bigint número de sequência do arquivo de log virtual (VLF) na ordem criada. Usado para identificar exclusivamente os VLFs no arquivo de log.
vlf_active bit Indica se o arquivo de log virtual (VLF) está em uso ou não.
0 - O VLF não está em uso.
1 - O VLF está ativo.
vlf_status int Status do arquivo de log virtual (VLF). Os valores possíveis incluem
0 - O VLF está inativo
1 - O VLF é inicializado, mas não é usado
2 - O VLF está ativo.
vlf_parity tinyint Paridade do arquivo de log virtual (VLF). Usado internamente para determinar o fim do log em um VLF.
vlf_first_lsn nvarchar(48) Número de sequência de log (LSN) do primeiro registro de log no arquivo de log virtual (VLF).
vlf_create_lsn nvarchar(48) Número de sequência de log (LSN) do registro de log que criou o arquivo de log virtual (VLF).
vlf_encryptor_thumbprint varbinary(20) Aplica-se a: SQL Server 2019 (15.x) e versões posteriores

Mostra a impressão digital do criptografador do VLF se o VLF for criptografado usando TDE (Transparent Data Encryption); caso contrário, NULL.

Comentários

A função de gerenciamento dinâmico sys.dm_db_log_info substitui a declaração DBCC LOGINFO.

A fórmula de quantos VLFs são criados com base em um evento de crescimento está detalhada no Guia de Arquitetura e Gerenciamento de Logs de Transações do SQL Server. Essa fórmula foi ligeiramente alterada a partir do SQL Server 2022 (16.x).

Permissões

Requer a permissão VIEW SERVER STATE no banco de dados.

Permissões do SQL Server 2022 e posteriores

Requer a permissão VIEW DATABASE PERFORMANCE STATE no banco de dados.

Exemplos

R. Determinar bancos de dados em uma instância do SQL Server com alto número de VLFs

A consulta a seguir determina os bancos de dados com mais de 100 VLFs nos arquivos de log, o que pode afetar o tempo de inicialização, restauração e recuperação do banco de dados.

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. Determine a posição do último VLF no log de transações antes de reduzir o arquivo de log

A consulta a seguir pode ser usada para determinar a posição do último VLF ativo antes de executar SHRINK FILE no log de transações para determinar se este pode ser reduzido.

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