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 | 기본

데이터베이스의 ID입니다. database_id int입니다. 유효한 입력은 데이터베이스, NULL 또는 DEFAULT의 ID 번호입니다. 기본값은 NULL입니다. NULL 및 DEFAULT는 현재 데이터베이스의 컨텍스트에서 동일한 값입니다.

현재 데이터베이스의 VLF 정보를 반환하려면 NULL을 지정합니다.

기본 제공 함수 DB_ID 지정할 수 있습니다. 데이터베이스 이름을 지정하지 않고 사용하는 DB_ID 경우 현재 데이터베이스의 호환성 수준은 90 이상이어야 합니다.

반환된 테이블

열 이름 데이터 형식 설명
database_id int 데이터베이스 ID입니다.

Azure SQL Database에서 값은 단일 데이터베이스 또는 탄력적 풀 내에서 고유하지만 논리 서버 내에는 없습니다.
file_id smallint 트랜잭션 로그의 파일 ID입니다.
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_상태 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의 암호화기의 지문을 표시하고, 그렇지 않으면 NULLVLF의 지문을 표시합니다.

설명

동적 관리 함수는 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. VLF 수가 많은 SQL Server 인스턴스의 데이터베이스 확인

다음 쿼리는 로그 파일에 VLF가 100개 이상 있는 데이터베이스를 결정하며, 이는 데이터베이스 시작, 복원 및 복구 시간에 영향을 줄 수 있습니다.

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