sys.dm_db_log_info (Transact-SQL)

Gilt für: SQL Server 2016 SP 2 und höher Azure SQL-Datenbank Nicht unterstützt Azure Synapse Analytics Nicht unterstützt Analytics Platform System (PDW)

Gibt die 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 | STANDARD

Ist die ID der Datenbank. database_id ist int. Gültige Eingaben sind die ID-Nummer einer Datenbank, NULL oder DEFAULT. Die Standardeinstellung 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 DB_ID-Funktion kann angegeben werden. Wenn sie ohne Angabe eines Datenbanknamens verwendet DB_ID werden, muss die Kompatibilitätsebene der aktuellen Datenbank 90 oder höher sein.

Zurückgegebene Tabelle

Spaltenname Datentyp BESCHREIBUNG
database_id int Datenbank-ID
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 Die Größe der virtuellen Protokolldatei (VLF) in MB wird an zwei Dezimalstellen gerundet.
vlf_sequence_number bigint Virtuelle Protokolldatei (VLF) Sequenznummer 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 enthalten
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) Protokollsequenznummer (LSN) des ersten Protokolldatensatzs in der virtuellen Protokolldatei (VLF)
vlf_create_lsn nvarchar(48) Protokollsequenznummer (LSN) des Protokolldatensatzs, der die virtuelle Protokolldatei (VLF) erstellt hat.
vlf_encryptor_thumbprint varbinary(20) Gilt für: SQL Server 2019 (15.x)

Zeigt den Fingerabdruck des Verschlüsselungsgebers des VLF an, wenn die VLF mit transparenter Datenverschlüsselung verschlüsselt wird, andernfalls NULL.

Bemerkungen

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

Die Formel, wie viele VLFs basierend auf einem Wachstumsereignis erstellt werden, wird im SQL Server Transaktionsprotokollarchitektur und -verwaltungshandbuch beschrieben. Diese Formel hat sich leicht ab SQL Server 2022 (16.x) Vorschau geändert.

Berechtigungen

Erfordert die VIEW DATABASE STATE Berechtigung in der 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 das Starten, Wiederherstellen und 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 Transaktionsprotokolls vor dem Verkleinern der Protokolldatei

Die folgende Abfrage kann verwendet werden, um die Position des letzten aktiven VLF zu bestimmen, bevor Sie DIE VERKLEINER-DATEI im Transaktionsprotokoll ausführen, um festzustellen, ob das Transaktionsprotokoll verkleinern kann.

USE AdventureWorks2016
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

Nächste Schritte