sys.dm_db_log_info(Transact-SQL)
적용 대상: SQL Server 2016 (13.x) SP 2 이상 Azure SQL 데이터베이스 Azure SQL Managed Instance
트랜잭션 로그의 VLF(가상 로그 파일) 정보를 반환합니다. 모든 트랜잭션 로그 파일이 테이블 출력에 결합됩니다. 출력의 각 행은 트랜잭션 로그의 VLF를 나타내며 로그의 해당 VLF와 관련된 정보를 제공합니다.
구문
sys.dm_db_log_info ( database_id )
인수
database_id | NULL | DEFAULT
데이터베이스의 ID입니다. database_id는 int입니다. 유효한 입력은 데이터베이스의 ID 번호인 NULL 또는 DEFAULT입니다. 기본값은 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_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. 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