Delen via


sys.dm_db_log_info (Transact-SQL)

van toepassing op: SQL Server 2016 (13.x) SP 2 en hoger Azure SQL Database Azure SQL Managed Instance

Retourneert virtuele logboekbestand (VLF) informatie over het transactielogboek. Houd er rekening mee dat alle transactielogboekbestanden worden gecombineerd in de tabeluitvoer. Elke rij in de uitvoer vertegenwoordigt een VLF in het transactielogboek en biedt informatie die relevant is voor die VLF in het logboek.

Syntaxis

sys.dm_db_log_info ( database_id )

Argumenten

database_id | NULL | VERSTEK

Is de id van de database. database_id is int. Geldige invoeren zijn het ID-nummer van een database, NULL of DEFAULT. De standaardwaarde is NULL. NULL en DEFAULT zijn equivalente waarden in de context van de huidige database.

Geef NULL op om VLF-gegevens van de huidige database te retourneren.

De ingebouwde functie DB_ID kan worden opgegeven. Wanneer u DB_ID gebruikt zonder een databasenaam op te geven, moet het compatibiliteitsniveau van de huidige database 90 of hoger zijn.

Tabel geretourneerd

Kolomnaam Gegevenstype Beschrijving
database-id Database-ID.

In Azure SQL Database zijn de waarden uniek binnen één database of een elastische pool, maar niet binnen een logische server.
file_id smallint De bestands-id van het transactielogboek.
vlf_begin_offset grote Offsetlocatie van het VLF-bestand (virtual log file) vanaf het begin van het transactielogboekbestand.
vlf_size_mb float Virtuele logbestand-grootte (VLF) in MB, afgerond op twee decimalen.
vlf_volgnummer grote VLF (Virtual Log File) volgnummer in de volgorde waarin ze zijn aangemaakt. Wordt gebruikt om VLFs in het logboekbestand uniek te identificeren.
vlf_active bit Geeft aan of virtueel logbestand VLF- in gebruik is of niet.
0 - VLF is niet in gebruik.
1 - VLF is actief.
vlf_status int Status van het virtuele logboekbestand (VLF). Mogelijke waarden zijn
0 - VLF is inactief
1 - VLF wordt geïnitialiseerd, maar niet gebruikt
2 - VLF is actief.
vlf_parity tinyint Pariteit van virtueel logbestand (VLF). Intern gebruikt om het einde van het logboek binnen een VLF te bepalen.
vlf_first_lsn nvarchar(48) Logvolgnummer (LSN) van de eerste logboekrecord in de virtuele logbestand (VLF).
vlf_create_lsn nvarchar(48) LSN (Log Sequence Number) van de logboekrecord waarmee het VLF-(virtual log file) is gemaakt.
vlf_encryptor_thumbprint varbinary(20) van toepassing op: SQL Server 2019 (15.x) en hoger

Toont de vingerafdruk van de versleuteler van de VLF als de VLF is versleuteld met Transparent Data Encryption, anders NULL.

Opmerkingen

De sys.dm_db_log_info dynamische managementfunctie vervangt de DBCC LOGINFO-instructie.

De formule voor het aantal VLF's dat wordt gemaakt op basis van een groei gebeurtenis, wordt beschreven in de SQL Server Transaction Log Architecture and Management Guide. Deze formule is enigszins gewijzigd in SQL Server 2022 (16.x).

Machtigingen

Hiervoor is de machtiging VIEW SERVER STATE in de database vereist.

Machtigingen voor SQL Server 2022 en hoger

Hiervoor is de machtiging VIEW DATABASE PERFORMANCE STATE vereist voor de database.

Voorbeelden

Een. Databases in een SQL Server-exemplaar bepalen met een groot aantal VLF's

De volgende query bepaalt de databases met meer dan 100 VLF's in de logboekbestanden, die van invloed kunnen zijn op de opstart-, herstel- en hersteltijd van de database.

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. Bepaal de positie van de laatste VLF in het transactielogboek voordat u het logboekbestand verkleint

De volgende query kan worden gebruikt om de positie van de laatste actieve VLF te bepalen voordat u SHRINK FILE uitvoert in het transactielogboek om te bepalen of het transactielogboek kan worden verkleind.

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