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.
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) | |
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
İlgili içerik
- Dinamik Yönetim Görünümleri ve İşlevleri (Transact-SQL)
- veritabanıyla ilgili dinamik yönetim görünümlerini (Transact-SQL)
- sys.dm_db_log_space_usage (Transact-SQL)
- sys.dm_db_log_stats (Transact-SQL)