sys.dm_db_log_info (Transact-SQL)

適用於:SQL Server 2016 (13.x) SP 2 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體

傳回交易記錄的虛擬記錄檔 (VLF) 資訊。 請注意,所有交易記錄檔都會在資料表輸出中合併。 輸出中的每個資料列都代表交易記錄中的一個 VLF,並提供與記錄檔中該 VLF 相關的資訊。

語法

sys.dm_db_log_info ( database_id )  

引數

database_id | NULL | DEFAULT

資料庫的識別碼。 database_idint。有效輸入是資料庫識別碼號碼、NULL 或 DEFAULT。 預設值是 NULL。 NULL 和 DEFAULT 是目前資料庫內容中的對等值。

指定 NULL 可傳回目前資料庫中的 VLF 資訊。

可以指定內建函數 DB_ID。 在不指定資料庫名稱的情況下使用 DB_ID 時,目前資料庫的相容性層級必須是 90 或更高層級。

傳回的資料表

資料行名稱 資料類型 描述
database_id int 資料庫識別碼。

在 Azure SQL 資料庫中,這些值在單一資料庫或彈性集區內是唯一的,但在邏輯伺服器內則不是唯一的。
file_id smallint 交易記錄的檔案識別碼。
vlf_begin_offset bigint 虛擬記錄檔 (VLF) 距離交易記錄檔開頭的位移位置。
vlf_size_mb float 虛擬記錄檔 (VLF) 大小 (以 MB 為單位),四捨五入至兩個小數位數。
vlf_sequence_number bigint 虛擬記錄檔 (VLF) 序號 (依建立順序)。 用來唯一識別記錄檔中的 VLF。
vlf_active bit 指出虛擬記錄檔 (VLF) 是否正在使用中。
0 - VLF 為未使用。
1 - VLF 為使用中。
vlf_status int 虛擬記錄檔 (VLF) 的狀態。 可能的值包括
0 - VLF 為非使用中
1 - VLF 已初始化,但未使用
2 - VLF 為使用中。
vlf_parity tinyint 虛擬記錄檔 (VLF) 的同位。 在內部用來判斷 VLF 中的記錄結尾。
vlf_first_lsn nvarchar(48) 虛擬記錄檔 (VLF) 中第一筆記錄的記錄序號 (LSN)
vlf_create_lsn nvarchar(48) 建立虛擬記錄檔 (VLF) 的記錄之記錄序號 (LSN)
vlf_encryptor_thumbprint varbinary(20) 適用於:SQL Server 2019 (15.x) 和更新版本

如果使用透明資料加密來加密 VLF,則顯示 VLF 加密程式的指紋,否則會顯示 NULL

備註

sys.dm_db_log_info 動態管理函數會取代 DBCC LOGINFO 陳述式。

如需深入了解依據成長事件建立多少 VLF 的公式,請參閱 SQL Server 交易記錄結構和管理指南。 從 SQL Server 2022 (16.x) 開始,此公式略有變更。

權限

需要資料庫中的 VIEW SERVER STATE 權限。

SQL Server 2022 和更新版本的權限

需要資料庫上的 VIEW DATABASE PERFORMANCE STATE 權限。

範例

A. 確認 SQL Server 執行個體中有大量 VLF 的資料庫

下列查詢會確認記錄檔中具有 100 個以上 VLF 的資料庫,這會影響資料庫啟動、還原和復原時間。

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. 壓縮記錄檔之前,先確認交易記錄中最後 VLF 的位置

下列查詢可用來判斷交易記錄中執行 SHRINK FILE 前的最後一個使用中 VLF 的位置,以確認是否可以壓縮交易記錄。

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