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 verwaltete Instanz

Gibt VLF-Informationen (Virtual Log File) 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. 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. Bei Verwendung DB_ID ohne Angabe eines Datenbanknamens muss die Kompatibilitätsebene 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 elastischen Pools 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 (Virtual Log File, VLF) in MB, gerundet auf zwei Dezimalstellen.
vlf_sequence_number bigint VLF-Sequenznummer (Virtual Log File) 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) Log sequence number (LSN) of the first log record in the virtual log file (VLF).
vlf_create_lsn nvarchar(48) Log sequence number (LSN) of the log record that created the virtual log file (VLF).
vlf_encryptor_thumbprint varbinary(20) Gilt für: SQL Server 2019 (15.x) und höher

Zeigt den Fingerabdruck des Verschlüsselungsmoduls des VLF an, wenn das VLF mit transparenter Datenverschlüsselung verschlüsselt ist, andernfalls NULL.

Hinweise

Die sys.dm_db_log_info dynamische Verwaltungsfunktion 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 VIEW SERVER STATE Berechtigung in der Datenbank.

Berechtigungen für SQL Server 2022 und höher

Erfordert DIE BERECHTIGUNG "DATENBANKLEISTUNGSSTATUS ANZEIGEN" 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 Transaktionsprotokolls 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 verkleinern 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