Teilen über


sys.dm_db_log_info (Transact-SQL)

Gilt für: SQL Server 2016 (13.x) SP 2 und höher Azure SQL-Datenbank Azure SQL Managed Instance

Gibt Informationen zur virtuellen Protokolldatei (VLF) des Transaktionsprotokolls zurück. Beachten Sie, dass alle Transaktionsprotokolldateien in der Tabellenausgabe kombiniert werden. Jede Zeile in der Ausgabe stellt eine VLF im Transaktionsprotokoll dar und stellt Informationen bereit, die für diese VLF im Protokoll relevant sind.

Syntax

sys.dm_db_log_info ( database_id )  

Argumente

database_id | NULL | DEFAULT

Die ID der Datenbank. database_id ist int. Gültige Eingaben sind die ID einer Datenbank, NULL oder DEFAULT. Der -Standardwert ist NULL. NULL und DEFAULT sind gleichwertige Werte im Kontext der aktuellen Datenbank.

Geben Sie NULL an, um VLF-Informationen der aktuellen Datenbank zurückzugeben.

Die integrierte Funktion DB_ID kann angegeben werden. Wenn DB_ID verwendet wird, ohne dass ein Datenbankname angegeben wird, muss der Kompatibilitätsgrad der aktuellen Datenbank 90 oder höher sein.

Zurückgegebene Tabelle

Spaltenname Datentyp Beschreibung
database_id int Datenbank-ID

In Azure SQL-Datenbank sind die Werte innerhalb einer einzelnen Datenbank oder eines Pools für elastische Datenbanken eindeutig, aber nicht innerhalb eines logischen Servers.
file_id smallint Die Datei-ID des Transaktionsprotokolls.
vlf_begin_offset bigint Offsetspeicherort der virtuellen Protokolldatei (VLF) vom Anfang der Transaktionsprotokolldatei.
vlf_size_mb float Größe der virtuellen Protokolldatei (VLF) in MB, gerundet auf zwei Dezimalstellen.
vlf_sequence_number bigint Sequenznummer der virtuellen Protokolldatei (VLF) in der erstellten Reihenfolge. Wird verwendet, um VLFs in der Protokolldatei eindeutig zu identifizieren.
vlf_active bit Gibt an, ob die virtuelle Protokolldatei (VLF) verwendet wird oder nicht.
0 – VLF wird nicht verwendet.
1 – VLF ist aktiv.
vlf_status int Status der virtuellen Protokolldatei (VLF). Mögliche Werte sind
0 – VLF ist inaktiv
1 – VLF wird initialisiert, aber nicht verwendet
2 – VLF ist aktiv.
vlf_parity tinyint Parität der virtuellen Protokolldatei (VLF). Wird intern verwendet, um das Ende des Protokolls in einem VLF zu bestimmen.
vlf_first_lsn nvarchar(48) Protokollfolgenummer (LSN) des ersten Protokoll-Eintrags in der virtuellen Protokolldatei (VLF).
vlf_create_lsn nvarchar(48) Protokollfolgenummer (LSN) des Protokoll-Eintrags, die die virtuelle Protokolldatei (VLF) erstellt hat.
vlf_encryptor_thumbprint varbinary(20) Gilt für: SQL Server 2019 (15.x) und höher

Zeigt den Fingerabdruck des Verschlüsslers der VLF an, wenn die VLF mit Transparent Data Encryption verschlüsselt ist, andernfalls NULL.

Hinweise

Die dynamische Verwaltungsfunktion sys.dm_db_log_info ersetzt die DBCC LOGINFO-Anweisung.

Die Formel für die Anzahl der VLFs, die auf einem Wachstumsereignis basieren, ist im SQL Server Transaction Log Architecture and Management Guide beschrieben. Diese Formel hat sich leicht geändert, beginnend mit SQL Server 2022 (16.x).

Berechtigungen

Erfordert die Berechtigung VIEW SERVER STATE für die Datenbank.

Berechtigungen für SQL Server 2022 und höher

Erfordert die VIEW DATABASE PERFORMANCE STATE-Berechtigung für die Datenbank.

Beispiele

A. Ermitteln von Datenbanken in einer SQL Server-Instanz mit hoher Anzahl von VLFs

Die folgende Abfrage bestimmt die Datenbanken mit mehr als 100 VLFs in den Protokolldateien, die sich auf den Start, die Wiederherstellung und die Wiederherstellungszeit der Datenbank auswirken können.

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. Ermitteln der Position des letzten VLF im Transaktionsprotokoll vor dem Verkleinern der Protokolldatei

Die folgende Abfrage kann verwendet werden, um die Position des letzten aktiven VLF zu bestimmen, bevor Sie SHRINK FILE im Transaktionsprotokoll ausführen, um festzustellen, ob das Transaktionsprotokoll verkleinert werden kann.

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