sys.dm_db_log_info (T-SQL)

Berlaku untuk: SQL Server 2016 (13.x) SP 2 dan yang lebih baru Azure SQL Database Azure SQL Managed Instance

Mengembalikan informasi file log virtual (VLF) dari log transaksi. Perhatikan bahwa semua file log transaksi digabungkan dalam output tabel. Setiap baris dalam output mewakili VLF dalam log transaksi dan memberikan informasi yang relevan dengan VLF tersebut dalam log.

Sintaks

sys.dm_db_log_info ( database_id )  

Argumen

database_id | NULL | DEFAULT

Adalah ID database. database_id int. Input yang valid adalah nomor ID database, NULL, atau DEFAULT. Defaultnya adalah NULL. NULL dan DEFAULT adalah nilai yang setara dalam konteks database saat ini.

Tentukan NULL untuk mengembalikan informasi VLF dari database saat ini.

Fungsi bawaan DB_ID dapat ditentukan. Saat menggunakan DB_ID tanpa menentukan nama database, tingkat kompatibilitas database saat ini harus 90 atau lebih besar.

Tabel Dikembalikan

Nama kolom Jenis data Deskripsi
database_id int ID Database.

Di Azure SQL Database, nilainya unik dalam satu database atau kumpulan elastis, tetapi tidak dalam server logis.
file_id smallint ID file log transaksi.
vlf_begin_offset bigint Lokasi offset file log virtual (VLF) dari awal file log transaksi.
vlf_size_mb float ukuran file log virtual (VLF) dalam MB, dibulatkan ke dua tempat desimal.
vlf_sequence_number bigint nomor urutan file log virtual (VLF) dalam urutan yang dibuat. Digunakan untuk mengidentifikasi VLF secara unik dalam file log.
vlf_active bit Menunjukkan apakah file log virtual (VLF) sedang digunakan atau tidak.
0 - VLF tidak digunakan.
1 - VLF aktif.
vlf_status int Status file log virtual (VLF). Nilai yang mungkin termasuk
0 - VLF tidak aktif
1 - VLF diinisialisasi tetapi tidak digunakan
2 - VLF aktif.
vlf_parity kecil Paritas file log virtual (VLF). Digunakan secara internal untuk menentukan akhir log dalam VLF.
vlf_first_lsn nvarchar(48) Nomor urutan log (LSN) dari rekaman log pertama dalam file log virtual (VLF).
vlf_create_lsn nvarchar(48) Nomor urutan log (LSN) dari rekaman log yang membuat file log virtual (VLF).
vlf_encryptor_thumbprint varbinary(20) Berlaku untuk: SQL Server 2019 (15.x) dan yang lebih baru

Memperlihatkan thumbprint enkripsi VLF jika VLF dienkripsi menggunakan Enkripsi Data Transparan, jika tidak NULL.

Keterangan

Fungsi sys.dm_db_log_info manajemen dinamis menggantikan DBCC LOGINFO pernyataan.

Rumus untuk berapa banyak VLF yang dibuat berdasarkan peristiwa pertumbuhan dirinci dalam Panduan Arsitektur dan Manajemen Log Transaksi SQL Server. Rumus ini sedikit berubah mulai SQL Server 2022 (16.x).

Izin

VIEW SERVER STATE Memerlukan izin dalam database.

Izin untuk SQL Server 2022 dan yang lebih baru

Memerlukan izin TAMPILKAN STATUS PERFORMA DATABASE pada database.

Contoh

J. Menentukan database dalam instans SQL Server dengan jumlah VLF yang tinggi

Kueri berikut menentukan database dengan lebih dari 100 VLF dalam file log, yang dapat memengaruhi waktu mulai, pemulihan, dan pemulihan 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. Tentukan posisi log transaksi terakhir VLF dalam sebelum menyusutkan file log

Kueri berikut dapat digunakan untuk menentukan posisi VLF aktif terakhir sebelum menjalankan FILE SHRINK pada log transaksi untuk menentukan apakah log transaksi dapat menyusut.

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