Dela via


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