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