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