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