Aracılığıyla paylaş


sys.dm_db_log_info (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP 2 ve üzeri Azure SQL Veritabanı Azure SQL Yönetilen Örneği

İş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.

Sözdizimi

sys.dm_db_log_info ( database_id )

Tartışmalar

database_id | NULL | TEMERRÜT

Veritabanının kimliğidir. database_id tamsayı'dır. Geçerli girişler bir veritabanının kimlik numarası veya NULL ya da DEFAULT değerlerinden biridir. Varsayılan değer NULL'tır. NULL ve DEFAULT, geçerli veritabanı bağlamındaki 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 tipi Açıklama
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 büyük_tamsayı sanal günlük dosyasının (VLF) işlem günlüğü dosyasının başından kadar olan ofset konumu.
vlf_boyutu_mb yüzdür 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.

İzinler

Veritabanında VIEW SERVER STATE izni gerektirir.

SQL Server 2022 ve üzeri için izinler

Veritabanında veritabanı performans durumunu görüntüleme izni gerektirir.

Örnekler

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