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