sys.dm_db_log_info (Transact-SQL)

Область применения: SQL Server 2016 (13.x) с пакетом обновления 2 (SP 2) и более поздних версий База данных SQL Azure Управляемый экземпляр SQL Azure

Возвращает сведения о виртуальном файле журнала транзакций (VLF ). Обратите внимание, что все файлы журнала транзакций объединяются в выходные данные таблицы. Каждая строка в выходных данных представляет VLF в журнале транзакций и предоставляет сведения, относящиеся к этому VLF в журнале.

Синтаксис

sys.dm_db_log_info ( database_id )  

Аргументы

database_id | NULL | ПО УМОЛЧАНИЮ

Идентификатор базы данных. database_id имеет значение int. Допустимые входные данные — это идентификатор базы данных, NULL или DEFAULT. По умолчанию имеет значение NULL. NULL и DEFAULT — это эквивалентные значения в контексте текущей базы данных.

Укажите ЗНАЧЕНИЕ NULL для возврата сведений О VLF текущей базы данных.

Можно указать встроенную функцию DB_ID . При использовании DB_ID без указания имени базы данных уровень совместимости текущей базы данных должен иметь значение 90 или больше.

Возвращаемая таблица

Имя столбца Тип данных Description
database_id int Идентификатор базы данных.

В База данных SQL Azure значения уникальны в одной базе данных или эластичном пуле, но не в логическом сервере.
file_id smallint Идентификатор файла журнала транзакций.
vlf_begin_offset bigint Расположение смещения файла виртуального журнала (VLF) с начала файла журнала транзакций.
vlf_size_mb float Размер файла виртуального журнала (VLF) в МБ округляется до двух десятичных разрядов.
vlf_sequence_number bigint Номер последовательности виртуального журнала (VLF) в созданном порядке. Используется для уникальной идентификации VLFs в файле журнала.
vlf_active bit Указывает, используется ли виртуальный файл журнала (VLF).
0 — VLF не используется.
1 — VLF активен.
vlf_status int Состояние файла виртуального журнала (VLF). Возможные значения:
0 — VLF неактивен
1 . VLF инициализирован, но неиспользуется
2 — VLF активен.
vlf_parity tinyint Четность файла виртуального журнала (VLF). Используется внутренне для определения конца журнала в VLF.
vlf_first_lsn nvarchar(48) Номер последовательности журнала (LSN) первой записи журнала в файле виртуального журнала (VLF).
vlf_create_lsn nvarchar(48) Номер последовательности журнала (LSN) записи журнала, создавшей файл виртуального журнала (VLF).
vlf_encryptor_thumbprint varbinary(20) Область применения: SQL Server 2019 (15.x) и более поздних версий

Отображает отпечаток шифратора VLF, если VLF шифруется с помощью прозрачное шифрование данных, в противном случае NULL.

Замечания

Функция sys.dm_db_log_info динамического управления заменяет инструкцию DBCC LOGINFO .

Формула создания VLF на основе события роста подробно описана в руководстве по архитектуре журнала транзакций и управлению SQL Server. Эта формула немного изменилась, начиная с SQL Server 2022 (16.x).

Разрешения

Требуется VIEW SERVER STATE разрешение в базе данных.

Разрешения для SQL Server 2022 и более поздних версий

Требуется разрешение VIEW DATABASE PERFORMANCE STATE для базы данных.

Примеры

А. Определение баз данных в экземпляре SQL Server с большим количеством VLFs

Следующий запрос определяет базы данных с более чем 100 VLFS в файлах журнала, которые могут повлиять на время запуска, восстановления и восстановления базы данных.

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. Определите позицию последнего VLF в журнале транзакций перед сжатием файла журнала

Следующий запрос можно использовать для определения позиции последнего активного VLF перед запуском SHRINK FILE в журнале транзакций, чтобы определить, может ли сжаться журнал транзакций.

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