sys.dm_db_log_info (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP2 ve sonraki sürümler Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiSQL database in Microsoft Fabric

İşlem günlüğünün sanal günlük dosyası (VLF) bilgilerini döndürür. Tüm işlem günlüğü dosyalarının tablo çıkışında birleştirildiğine dikkat edin. Çıktıdaki her satır, işlem günlüğündeki bir VLF'yi temsil eder ve günlükteki bu VLF ile ilgili bilgiler sağlar.

Syntax

sys.dm_db_log_info ( database_id )

Argümanlar

database_id | NULL | DEFAULT

Veritabanının kimliğidir. database_idiçsel. Geçerli girdiler, bir veritabanının ID numarası, NULL veya DEFAULT. Varsayılan değer NULL'tır. NULL ve DEFAULT mevcut veritabanı bağlamında eşdeğer değerlerdir.

Geçerli veritabanının VLF bilgilerini döndürmek için NULL değerini belirtin.

Yerleşik işlev DB_ID belirtilebilir. Veritabanı adı belirtmeden DB_ID kullanırken, geçerli veritabanının uyumluluk düzeyi 90 veya daha yüksek olmalıdır.

Döndürülen Tablo

Sütun adı Veri türü Description
database_id int Veritabanı Kimliği.

Azure SQL Veritabanı'nda değerler tek bir veritabanı veya elastik havuz içinde benzersizdir, ancak mantıksal sunucu içinde değildir.
dosya_kimlik smallint İşlem günlüğünün dosya kimliği.
vlf_begin_offset bigint sanal günlük dosyasının (VLF) işlem günlüğü dosyasının başından kadar olan ofset konumu.
vlf_boyutu_mb float sanal günlük dosyasının (VLF) boyutu MB olarak, iki ondalık basameğe yuvarlanır.
vlf_sıra_numarası bigint Oluşturulan sırayla sanal günlük dosyası (VLF) sıra numarası. Günlük dosyasındaki VLF'leri benzersiz olarak tanımlamak için kullanılır.
vlf_active bit sanal günlük dosyası (VLF) kullanımda olup olmadığını gösterir.
0 - VLF kullanımda değil.
1 - VLF etkindir.
vlf_status int sanal günlük dosyası (VLF)'in durumu. Olası değerler şunlardır:
0 - VLF etkin değil
1 - VLF başlatıldı ancak kullanılmadı
2 - VLF etkindir.
vlf_parity tinyint numaralı sanal günlük dosyasının (VLF) eşliği. Bir VLF içindeki günlüğün sonunu belirlemek için dahili olarak kullanılır.
vlf_first_lsn nvarchar(48) İlk günlük kaydının bulunduğu sanal günlük dosyasındaki (VLF) günlük sırası numarası (LSN).
vlf_create_lsn nvarchar(48) sanal günlük dosyasını (VLF)oluşturan günlük kaydının Günlük sırası numarası (LSN).
vlf_şifreleyici_parmakizi varbinary(20) Şunlar için geçerlidir: SQL Server 2019 (15.x) ve üzeri

VLF Saydam Veri Şifrelemesikullanılarak şifrelenirse VLF şifreleyicisinin parmak izini gösterir, aksi takdirde NULL.

Açıklamalar

sys.dm_db_log_info dinamik yönetim işlevi DBCC LOGINFO deyiminin yerini alır.

Büyüme olayı temelinde kaç VLIF oluşturulduğuna ilişkin formül, SQL Server İşlem Günlüğü Mimarisi ve Yönetim Kılavuzubölümünde ayrıntılı olarak açıklanmaktadır. Bu formül SQL Server 2022'den (16.x) başlayarak biraz değişti.

Permissions

VIEW SERVER STATE Veritabanında izin gerektirir.

SQL Server 2022 ve üzeri için izinler

Veritabanında PERFORMANCE STATE izni gerektirir VIEWDATABASE .

Examples

A. Yüksek sayıda VLIF içeren bir SQL Server örneğindeki veritabanlarını belirleme

Aşağıdaki sorgu, veritabanı başlatma, geri yükleme ve kurtarma süresini etkileyebilecek günlük dosyalarında 100'den fazla VLF'ye sahip veritabanlarını belirler.

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. Günlük dosyasını küçültmeden önce işlem günlüğündeki son VLF konumunu belirleme

İşlem günlüğünün küçülip küçülemediğini belirlemek için işlem günlüğünde SHRINK FILE çalıştırmadan önce son etkin VLF'nin konumunu belirlemek için aşağıdaki sorgu kullanılabilir.

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