sys.dm_db_log_info (Transact-SQL)
gäller för: SQL Server 2016 (13.x) SP 2 och senare Azure SQL Database Azure SQL Managed Instance
Returnerar information om den virtuella loggfilen (VLF) i transaktionsloggen. Observera att alla transaktionsloggfiler kombineras i tabellutdata. Varje rad i utdata representerar en VLF i transaktionsloggen och innehåller information som är relevant för den VLF:en i loggen.
Syntax
sys.dm_db_log_info ( database_id )
Argument
database_id | NULL | DEFAULT
Är databasens ID. database_id är int. Giltiga indata är ID-numret för en databas, NULL eller DEFAULT. Standardvärdet är NULL. NULL och DEFAULT är motsvarande värden i kontexten för den aktuella databasen.
Ange NULL för att returnera VLF-information för den aktuella databasen.
Den inbyggda funktionen DB_ID kan anges. När du använder DB_ID
utan att ange ett databasnamn måste kompatibilitetsnivån för den aktuella databasen vara 90 eller högre.
Tabell returnerad
Kolumnnamn | Datatyp | Beskrivning |
---|---|---|
database_id | int | Databas-ID. I Azure SQL Database är värdena unika i en enskild databas eller en elastisk pool, men inte inom en logisk server. |
file_id | smallint | Fil-ID för transaktionsloggen. |
vlf_begin_offset | bigint | Förskjutning av den virtuella loggfilen (VLF) från början av transaktionsloggfilen. |
vlf_size_mb | flyttal | virtuell loggfil (VLF) storlek i MB, avrundad till två decimaler. |
vlf_sekvensnummer | bigint | virtuell loggfil (VLF) sekvensnummer i den skapade ordningen. Används för att unikt identifiera VLF:er i loggfilen. |
vlf_aktiv | bit | Anger om virtuella loggfilen (VLF) används eller inte. 0 – VLF används inte. 1 – VLF är aktivt. |
vlf_status | int | Status för den virtuella loggfilen (VLF). Möjliga värden är 0 – VLF är inaktivt 1 – VLF initieras men används inte 2 – VLF är aktivt. |
vlf_parity | tinyint | Paritet för virtuell loggfil (VLF). Används internt för att fastställa slutet av loggen i en VLF. |
vlf_first_lsn | nvarchar(48) | loggsekvensnummer (LSN) för den första loggposten i virtuella loggfilen (VLF). |
vlf_create_lsn | nvarchar(48) | loggsekvensnummer (LSN) för loggposten som skapade virtuella loggfilen (VLF). |
vlf_encryptor_thumbprint | varbinary(20) |
gäller för: SQL Server 2019 (15.x) och senare Visar tumavtrycket för krypteraren för VLF om VLF krypteras med transparent datakryptering, annars NULL . |
Anmärkningar
Funktionen sys.dm_db_log_info
dynamisk hantering ersätter DBCC LOGINFO
-instruktionen.
Formeln för hur många VLF:er som skapas baserat på en tillväxthändelse beskrivs i SQL Server Transaction Log Architecture and Management Guide. Den här formeln ändrades något med början i SQL Server 2022 (16.x).
Behörigheter
Kräver VIEW SERVER STATE
behörighet i databasen.
Behörigheter för SQL Server 2022 och senare
Kräver behörigheten VISA DATABASPRESTANDATILLSTÅND för databasen.
Exempel
A. Fastställa databaser i en SQL Server-instans med ett stort antal VLF:er
Följande fråga avgör databaserna med fler än 100 VLFs i loggfilerna, vilket kan påverka databasens start-, återställnings- och återställningstid.
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. Bestämma positionen för den sista VLF
i transaktionsloggen innan du krymper loggfilen
Följande fråga kan användas för att fastställa positionen för den senaste aktiva VLF:en innan du kör SHRINK FILE i transaktionsloggen för att avgöra om transaktionsloggen kan krympa.
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