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