sys.dm_db_log_info (T-SQL)

Berlaku untuk: SQL Server 2016 SP 2 dan 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_idint. 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.
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 tinyint 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)

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 DATABASE STATE Memerlukan izin dalam database.

Contoh

A. 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 VLF terakhir dalam log transaksi 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 AdventureWorks2016
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

Langkah berikutnya