sys.dm_db_log_info (Transact-SQL)

適用対象: SQL Server 2016 (13.x) SP 2 以降 Azure SQL Database Azure SQL Managed Instance

トランザクション ログの仮想ログ ファイル (VLF) 情報を返します。 すべてのトランザクション ログ ファイルがテーブル出力に結合されることに注意してください。 出力の各行は、トランザクション ログの VLF を表し、ログ内のその VLF に関連する情報を提供します。

構文

sys.dm_db_log_info ( database_id )  

引数

database_id | NULL | DEFAULT

データベースの ID です。 database_idint です。有効な入力は、データベースの ID 番号、NULL、または DEFAULT です。 の既定値は NULL です。 NULL と DEFAULT は、現在のデータベースのコンテキストで同等の値です。

現在のデータベースの VLF 情報を返すには、NULL を指定します。

組み込み関数 DB_ID を指定できます。 データベース名を指定しないで DB_ID を使用する場合、現在のデータベースの互換性レベルが 90 以上である必要があります。

返されるテーブル

列名 データ型 説明
database_id int データベース ID。

Azure SQL Database では、値は 1 つのデータベースまたは Elastic Pool 内で一意ですが、論理サーバー内では一意ではありません。
file_id smallint トランザクション ログのファイル ID。
vlf_begin_offset bigint トランザクション ログ ファイルの先頭からの仮想ログ ファイル (VLF) のオフセット位置。
vlf_size_mb float 仮想ログ ファイル (VLF) のサイズ (MB 単位)。小数点以下 2 桁に丸められます。
vlf_sequence_number bigint 作成された順序での仮想ログ ファイル (VLF) シーケンス番号。 ログ ファイル内の VTF を一意に識別するために使用されます。
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 が Transparent Data Encryption を使用して暗号化されている場合は、VLF の暗号化子のサムプリントを表示します。それ以外の場合は NULL です。

解説

sys.dm_db_log_info 動的管理機能は DBCC LOGINFO ステートメントを置き換えます。

拡張イベントに基づいて作成される VTF の数の数式については、「SQL Server トランザクション ログのアーキテクチャと管理ガイド」を参照してください。 この数式は、SQL Server 2022 (16.x) から若干変更されました。

アクセス許可

データベースでの VIEW SERVER STATE 権限が必要です。

SQL Server 2022 以降でのアクセス許可

データベースに対する VIEW DATABASE PERFORMANCE STATE アクセス許可が必要です。

A. VTF の数が多い SQL Server インスタンス内のデータベースを特定する

次のクエリでは、ログ ファイルに 100 を超える VTF が含まれるデータベースを特定します。これは、データベースの起動、復元、復旧時間に影響を与える可能性があります。

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