적용 대상: SQL Server 2016 (13.x) SP2 및 이후 버전
Azure SQL 데이터베이스
Azure SQL Managed Instance
SQL 데이터베이스 in Microsoft Fabric
트랜잭션 로그의 VLF(가상 로그 파일) 정보를 반환합니다. 모든 트랜잭션 로그 파일이 테이블 출력에 결합됩니다. 출력의 각 행은 트랜잭션 로그의 VLF를 나타내며 로그의 해당 VLF와 관련된 정보를 제공합니다.
구문
sys.dm_db_log_info ( database_id )
인수
database_id | NULL | DEFAULT
데이터베이스의 ID입니다. database_id지능입니다. 유효한 입력은 데이터베이스의 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 이상에 대한 사용 권한
데이터베이스에서 PERFORMANCE STATE 권한이 필요합니다 VIEWDATABASE .
예제
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