Udostępnij za pośrednictwem


sys.dm_db_log_info (Transact-SQL)

Dotyczy: SQL Server 2016 (13.x) SP 2 lub nowszym Azure SQL Database Azure SQL Managed Instance

Zwraca informacje o wirtualnym pliku dziennika (VLF) w dzienniku transakcji. Zwróć uwagę, że wszystkie pliki dziennika transakcji są łączone w danych wyjściowych tabeli. Każdy wiersz w danych wyjściowych reprezentuje VLF w dzienniku transakcji i zawiera informacje istotne dla tego VLF w dzienniku.

Składnia

sys.dm_db_log_info ( database_id )

Argumenty

database_id | NULL | DOMYŚLNY

Jest identyfikatorem bazy danych. database_id jest typu int. Prawidłowe dane wejściowe to numer identyfikacyjny bazy danych, NULL lub DEFAULT. Wartość domyślna to NULL. Wartości NULL i DEFAULT są równoważne wartościom w kontekście bieżącej bazy danych.

Określ wartość NULL, aby zwrócić informacje o VLF bieżącej bazy danych.

Można określić wbudowaną funkcję DB_ID. W przypadku używania DB_ID bez określania nazwy bazy danych poziom zgodności bieżącej bazy danych musi mieć wartość 90 lub większą.

Zwracana tabela

Nazwa kolumny Typ danych Opis
identyfikator_bazy_danych int Identyfikator bazy danych.

W usłudze Azure SQL Database wartości są unikatowe w ramach pojedynczej bazy danych lub elastycznej puli, ale nie w obrębie serwera logicznego.
identyfikator_pliku smallint Identyfikator pliku dziennika transakcji.
vlf_begin_offset bigint Położenie przesunięcia pliku dziennika wirtualnego (VLF) od początku pliku dziennika transakcji.
vlf_size_mb zmiennoprzecinkowa rozmiar pliku dziennika wirtualnego (VLF) w MB, zaokrąglony do dwóch miejsc dziesiętnych.
vlf_sequence_number bigint pliku dziennika wirtualnego (VLF) numer sekwencji w utworzonej kolejności. Służy do unikatowego identyfikowania plików VLF w pliku dziennika.
vlf_active bitów Wskazuje, czy plik dziennika wirtualnego (VLF) jest używany, czy nie.
0 — VLF nie jest używany.
1 — VLF jest aktywny.
vlf_status typ całkowity Stan pliku dziennika wirtualnego (VLF). Możliwe wartości obejmują
0 — VLF jest nieaktywny
1 — VLF jest inicjowany, ale nieużywany
2 — VLF jest aktywny.
vlf_parity tinyint Parzystość pliku dziennika wirtualnego (VLF). Używany wewnętrznie do określania końca wpisu dziennika wewnątrz Virtual Log File (VLF).
vlf_first_lsn nvarchar(48) numer sekwencji logu (LSN) pierwszego rekordu logu w pliku logu wirtualnego (VLF).
vlf_create_lsn nvarchar(48) numer sekwencji dziennika (LSN) rekordu dziennikowego, który utworzył wirtualny plik dziennika (VLF).
vlf_encryptor_thumbprint varbinary(20) Dotyczy: SQL Server 2019 (15.x) i nowszych wersji

Pokazuje odcisk palca szyfratora VLF, jeśli VLF jest zaszyfrowany przy użyciu Transparent Data Encryption, w przeciwnym razie NULL.

Uwagi

Funkcja dynamicznego zarządzania sys.dm_db_log_info zastępuje instrukcję DBCC LOGINFO.

Formuła liczby plików VLF tworzonych na podstawie zdarzenia wzrostu jest szczegółowo opisana w Architektura dziennika transakcji programu SQL Server i przewodnik zarządzania. Ta formuła nieco zmieniła się w programie SQL Server 2022 (16.x).

Uprawnienia

Wymaga uprawnienia VIEW SERVER STATE w bazie danych.

Uprawnienia dla programu SQL Server 2022 i nowszych

Wymaga uprawnienia WYŚWIETL STAN WYDAJNOŚCI BAZY DANYCH dla bazy danych.

Przykłady

A. Określanie baz danych w wystąpieniu programu SQL Server z dużą liczbą plików VLF

Poniższe zapytanie określa bazy danych z ponad 100 VLF w plikach dziennika, co może mieć wpływ na czas uruchamiania, przywracania oraz odzyskiwania bazy danych.

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. Określ położenie ostatniego VLF w dzienniku transakcji przed zmniejszeniem pliku dziennika

Poniższe zapytanie może służyć do określenia położenia ostatniego aktywnego wirtualnego dziennika transakcji przed uruchomieniem polecenia SHRINK FILE w dzienniku transakcji w celu określenia, czy można zmniejszyć dziennik transakcji.

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