sys.dm_db_log_info (Transact-SQL)
Aplica-se a: SQL Server 2016 (13.x) SP 2 e posterior Banco de Dados SQL do Azure Instância Gerenciada do SQL do Azure
Devolve informações sobre o 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 log de transações e fornece informações relevantes para esse VLF.
Sintaxe
sys.dm_db_log_info ( database_id )
Argumentos
database_id | NULO | INADIMPLÊNCIA
É 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 informações 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 da base de dados. No Banco de Dados SQL do Azure, os valores são exclusivos em um único banco de dados ou pool elástico, mas não em um servidor lógico. |
identificação_de_ficheiro | smallint | O ID do arquivo do log de transações. |
vlf_begin_offset | bigint | Local de deslocamento do arquivo de log virtual (VLF) desde o início do arquivo de log de transações. |
vlf_size_mb | flutuar | arquivo de log virtual (VLF) tamanho em MB, arredondado para duas casas decimais. |
número_sequencial_vlf | bigint | número de sequência do arquivo de log virtual (VLF) na ordem em que foi criado. Usado para identificar exclusivamente VLFs no arquivo de log. |
vlf_active | bit | Indica se arquivo de log virtual (VLF) está em uso ou não. 0 - 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 - VLF está inativo 1 - VLF é inicializado, mas não utilizado 2 - VLF está ativo. |
vlf_parity | tinyint | Paridade de arquivo de log virtual (VLF). Utilizado internamente para determinar o final do registo dentro de um VLF. |
vlf_first_lsn | nvarchar(48) | O número de sequência de log (LSN) do primeiro registro de log no arquivo de log virtual (VLF) . |
vlf_create_lsn | nvarchar(48) | LSN (número de sequência de log) 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 posterior Mostra a impressão digital do encriptador do VLF se o VLF estiver encriptado utilizando Transparent Data Encryption, caso contrário NULL . |
Comentários
A função de gerenciamento dinâmico sys.dm_db_log_info
substitui a instrução DBCC LOGINFO
.
A fórmula para quantos VLFs são criados com base em um evento de crescimento é detalhada no Guia de Gerenciamento e Arquitetura de Log de Transações do SQL Server. Esta fórmula mudou ligeiramente a partir do SQL Server 2022 (16.x).
Permissões
Requer a permissão VIEW SERVER STATE
no banco de dados.
Permissões para SQL Server 2022 e posterior
É necessária a permissão VIEW DATABASE PERFORMANCE STATE no banco de dados.
Exemplos
Um. 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 a inicialização, a restauração e o tempo de 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 o log de transações pode diminuir.
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