SQL Server VSS 기록기 로깅
적용 대상: SQL Server
SQL Server는 전용 SQL 기록기 서비스를 통해 VSS(볼륨 섀도 복사본 서비스) 백업 및 복원 작업에 참여할 수 있습니다. 자세한 내용은 SQL Server 백업 애플리케이션 - VSS(볼륨 섀도 복사본 서비스) 및 SQL 기록기를 참조하세요.
이 서비스는 이 문서의 뒷부분에 있는 예제에서 볼 수 있듯이 값 SQLWRITER
의 이벤트 Source
(또는 PowerShell의 ProviderName
또는 XML 컨텍스트)를 사용하여 Windows 애플리케이션 이벤트 로그에 실행 오류를 보고합니다. SQL Server 2019(15.x) 이전에는 전용 활동 로그가 없었기 때문에 VSS 작업의 참가자로서 SQL Server에 대한 조사를 어렵게 만들었습니다.
이 문서에서는 SQLWriter 작업에 대한 가시성을 높이기 위해 SQL Server 2019(15.x)에서 도입된 새 로그에 대해 설명합니다. 이 기능은 SQL Server 2016(13.x) 서비스 팩 3 및 SQL Server 2017(14.x) CU(누적 업데이트) 27에서도 사용할 수 있었습니다.
개요
SQL Server 2019(15.x) SQLWriter 로깅의 주요 특징은 다음과 같습니다.
- 기본적으로 설정되어 있습니다.
- 시스템 전체입니다(서버에서 실행되는 모든 SQL Server 인스턴스에 대해 SQL 기록기 작업을 추적합니다).
- 텍스트 기반
- 작업 디렉터리는
C:\Program Files\Microsoft SQL Server\90\Shared
입니다 - 해당 디렉터리 내에서:
- 로깅은 파일
SqlWriterLogger.txt
에서 수행됩니다 - 이 파일은 최대 크기(기본값 1MB)에 도달하면 이름이
SqlWriterLogger1.txt
으로 변경되고 로깅은 기본SqlWriterLogger.txt
에서 계속됩니다. - 롤오버 파일이 하나뿐이므로 두 번째 롤오버는 기존
SqlWriterLogger1.txt
을 덮어씁 수 있습니다. - 매개 변수는
SqlWriterConfig.ini
파일로 관리됩니다.
- 로깅은 파일
SQL 기록기는 SQL Server 공유 구성 요소이므로 시스템에 단일 인스턴스가 있으며 주 버전은 설치된 모든 SQL Server 인스턴스의 가장 높은 주 버전과 동일합니다. 예를 들어 SQL Server 2016(13.x) SP2 및 SQL Server 2019(15.x)가 동일한 시스템에 설치된 경우 SQL 기록기 이진 파일은 SQL Server 2019(15.x)에서 제공하는 이진 파일로, \90
아래에서 홈 디렉터리가 유지되더라도 모든 주 버전에서 실행 중인 모든 인스턴스를 서비스합니다. 로컬 인스턴스 및 버전은 여기에서 설명하는 새로운 SQL Server 2019(15.x) 추적을 활용합니다. 또한 SQL Server 2019(15.x) 누적 업데이트만 이 상황에서 SQL 기록기 이진 파일을 업그레이드함을 의미합니다.
참고 항목
다음 단락에서는 SQL Server 2019(15.x) CU 4부터 시작하는 상황을 설명합니다. 이전 SQL Server 2019(15.x) 버전에는 기본 설정 아래의 로그 파일에 동일한 양의 정보가 없습니다.
기본 작업
수동으로 변경하지 않고 새 로깅을 활용할 수 있습니다. C:\Program Files\Microsoft SQL Server\90\Shared\
에서 기본 SqlWriterLogger.txt
로그 파일을 열거나 복사본을 가져올 수 있습니다. 이 파일은 SQL 기록기에 도달하는 모든 VSS 이벤트를 반영하며, 주로 다음과 같습니다.
- 명령
vssadmin list writers
에 의해 트리거되는OnIdentify
이벤트 - 백업 이벤트
- 이벤트 복원
즉, 이러한 작업이 성공적으로 수행되는 경우에도 로그 파일에 자세한 항목을 여전히 기록합니다. VSS 작업이 발생하고 SQL 기록기와 성공적으로 상호 작용하고 있는지 확인할 수 있습니다. SQL Server 인스턴스 수준에서 이러한 세부 정보를 설정하는 간편한 기본 제공 방법을 제공하는 향상된 기능입니다.
또한 SQLWriter 서비스 시작 이벤트도 기록되며 활성 로깅 매개 변수를 보고합니다.
VSS 작업 실패에 SQL Server가 포함된 경우 SqlWriterLogger는 정보를 확인하는 중요한 위치가 됩니다.
참고 항목
이 새 로깅 인프라는 SQL Server에 대한 기존 오류 보고를 보완하며, 대체하지 않습니다. 따라서 오류의 경우 Windows 애플리케이션 이벤트 로그가 검사할 첫 번째 위치로 유지됩니다("SQLWRITER" 및 "VSS"와 같은 원본에서 필터링). SqlWriterLogger.txt
는 이 초기 집합에 추가 정보를 제공합니다.
일반적인 로깅 항목 검토
다음 내보내기는 기본 설정에서 수행되었습니다.
서비스 시작
[01/11/2021 02:54:59, TID 61f8] ****************************************************************
[01/11/2021 02:54:59, TID 61f8] ** SQLWRITER TRACING STARTED - ProcessId: 0x4124
[01/11/2021 02:54:59, TID 61f8] ** Service is not running as WIDWriter.
[01/11/2021 02:54:59, TID 61f8] ** SQL Writer version is 15.0.4073.23
[01/11/2021 02:54:59, TID 61f8] ** MODERN LOGGER V2 ENABLED ON C:\Program Files\Microsoft SQL Server\90\Shared\SqlWriterLogger.txt
[01/11/2021 02:54:59, TID 61f8] ** With TraceLevel = DEFAULT, TraceFileSizeMb = 1, ForceFlush = False
[01/11/2021 02:54:59, TID 61f8] ** Recording events in Server Local Time. UTC OFFSET: -8:00
[01/11/2021 02:54:59, TID 61f8] ****************************************************************
위의 항목은 SQL 기록기 서비스 시작할 때마다 관찰됩니다(서비스 시작당 두 번 기록될 수도 있음).
모양 순서대로 다음 정보를 볼 수 있습니다.
- 로컬 서버 시간의 타임스탬프(날짜+시간)와 각 줄의 항목을 만든 ThreadId입니다.
- 시작 중인 SQLWriter 프로세스의 ProcessId입니다.
- 서비스가 '정상' 모드('WIDWriter로 실행되지 않음') 또는 Windows 내부 데이터베이스 모드에서 시작되었다는 사실입니다.
- SQL 기록기 이진의 버전
SqlWriterConfig.ini
파일에 의해 설정된 모든 매개 변수:- 활성 로그 파일의 대상 경로
- 추적의 세부 정보 수준입니다. 이 예제에서는 DEFAULT입니다.
- 롤오버가 발생하기 전에 파일의 최대 크기(이 예제에서는 1MB)입니다.
- 로그 파일에 대한 매 번 업데이트마다 ForceFlush를 적용하는 옵션과 좀 더 완화된/버퍼링된 방식(기본적으로 False)입니다.
- 로깅이 현지 시간의 UTC 오프셋과 함께 현지 시간임을 상기시켜 줍니다.
VSS 'OnIdentify' 이벤트
[01/12/2021 08:23:40, TID 464c] Entering SQL Writer OnIdentify.
[01/12/2021 08:23:40, TID 464c] Service: MSSQLSERVER Server: GF19. Version=15
[01/12/2021 08:23:40, TID 464c] Instance MSSQL15.MSSQLSERVER Edition: Developer Edition
[01/12/2021 08:23:40, TID 464c] Instance MSSQL15.NAMED1 Edition: Enterprise Edition: Core-based Licensing
[01/12/2021 08:23:40, TID 464c] Skip User Instances Enumeration
OnIdentify
은 일반적인 VSS 작업입니다. 이것은 vssadmin list writers
명령으로 트리거됩니다. 대부분의 VSS 요청자는 OnIdentify
이벤트에 의해 모든 VSS 백업 또는 복원 작업을 시작합니다.
이전에는 활성 프로파일러 추적으로만 DBA가 이러한 이벤트를 검색할 수 있었습니다. 새 로깅 기능을 사용하면 각 이벤트가 위의 항목으로 이어집니다.
모양 순서대로 다음 정보가 기록되는 것을 볼 수 있습니다.
OnIdentify
VSS 이벤트의 명시적 언급- 인스턴스 이름, 주 버전 및 Edition과 함께 모든 활성(실행 중인) SQL Server 인스턴스 목록입니다.
- ‘사용자 인스턴스’ 나열을 시도하지 않았다는 표시 - LocalDB라고도 하며, 일반적으로 엔터프라이즈 데이터베이스 서버에 없는 특정 SQL Server 기능입니다.
성공적인 구성 요소 모드 VSS 백업
[01/11/2021 02:30:19, TID 32c8] Entering SQL Writer Initialize.
[01/11/2021 02:33:33, TID 232c] Entering SQL Writer OnIdentify.
[01/11/2021 02:33:33, TID 232c] Service: MSSQLSERVER Server: GF19. Version=15
[01/11/2021 02:33:33, TID 232c] Instance MSSQL15.MSSQLSERVER Edition: Developer Edition
[01/11/2021 02:33:33, TID 232c] Instance MSSQL15.NAMED1 Edition: Enterprise Edition: Core-based Licensing
[01/11/2021 02:33:33, TID 232c] Skip User Instances Enumeration
[01/11/2021 02:33:37, TID 232c] Entering SQL Writer OnPrepareBackup.
[01/11/2021 02:33:37, TID 232c] ****************************************************************
[01/11/2021 02:33:37, TID 232c] ** VSS SQL BACKUP BEGIN - ID: 232c
[01/11/2021 02:33:37, TID 232c] ****************************************************************
[01/11/2021 02:33:37, TID 232c] Component based backup selected.
[01/11/2021 02:33:37, TID 232c] Database count from metadata is 1
[01/11/2021 02:33:37, TID 232c] Database db_on_G on instance GF19 found in metadata
[01/11/2021 02:33:37, TID 232c] Backup type is VSS_BT_COPY
[01/11/2021 02:33:38, TID 232c] Entering SQL Writer OnPrepareSnapshot.
[01/11/2021 02:33:38, TID 232c] Service: MSSQLSERVER Server: GF19. Version=15
[01/11/2021 02:33:38, TID 232c] Instance MSSQL15.MSSQLSERVER Edition: Developer Edition
[01/11/2021 02:33:38, TID 232c] Instance MSSQL15.NAMED1 Edition: Enterprise Edition: Core-based Licensing
[01/11/2021 02:33:38, TID 232c] Skip User Instances Enumeration
[01/11/2021 02:33:38, TID 232c] Entering SQL Writer OnFreeze.
[01/11/2021 02:33:38, TID 232c] Entering SQL Writer OnThaw.
[01/11/2021 02:33:38, TID 232c] Entering SQL Writer OnPostSnapshot.
[01/11/2021 02:33:38, TID 232c] Entering SQL Writer OnIdentify.
[01/11/2021 02:33:38, TID 232c] Service: MSSQLSERVER Server: GF19. Version=15
[01/11/2021 02:33:38, TID 232c] Instance MSSQL15.MSSQLSERVER Edition: Developer Edition
[01/11/2021 02:33:38, TID 232c] Instance MSSQL15.NAMED1 Edition: Enterprise Edition: Core-based Licensing
[01/11/2021 02:33:38, TID 232c] Skip User Instances Enumeration
[01/11/2021 02:33:40, TID 232c] Entering SQL Writer OnBackupComplete.
이 이벤트는 더 크기가 큰 항목 집합으로 이어집니다. 모양 순서대로 다음 정보를 볼 수 있습니다.
- 이미 표시한 것처럼 종종 백업으로 이어지는 전체
OnIdentify
섹션 - "SQL 기록기 xxxx 입력" 패턴이 있는 백업의 모든 주요 VSS 단계에 대해 설명합니다.
- 여기에서 첫 번째는
Entering SQL Writer OnPrepareBackup
입니다.
- 여기에서 첫 번째는
- VSS SQL Backup의 시작을 나타내는 눈에 띄는 항목
- (ID는 SQLWriter에서 해당 백업 시도에 대해 로깅을 수행하는 ThreadId임)
- VSS 요청자, "구성 요소" 또는 "비 구성 요소/볼륨"에서 선택한 VSS 백업 API
- VSS 요청자가 보낸 구성 요소 목록에 포함된 데이터베이스의 수입니다. 여기서는 단일 DB(1)입니다.
- 각 요청자가 제공한 데이터베이스 이름(여기서는 ‘db_on_G’)이 VSS 요청자가 함께 연결한 SQL Server 인스턴스(여기서는 기본 인스턴스 ‘GF19’)에 있다는(또는 없다는) 확인입니다.
- 요청된 VSS 백업의 버전 일반적으로
VSS_BT_FULL
또는VSS_BT_COPY
VSS_BACKUP_TYPE 열거형을 참조하세요. - 다른
OnIdentify
섹션 - VSS Backup의 기본 단계를 식별하는 추가 항목(
OnFreeze
,OnThaw
,OnPostSnapshot
) - 마지막
OnIdentify
섹션입니다. - 유용한 ‘닫기 이벤트’를 만드는 이름을 가진 최종 VSS 단계 보고서:
OnBackupComplete
.
이러한 항목은 이전에 신속하게 설정하기 어려웠던 VSS 작업에 대한 세부 정보를 제공하며 이를 위해 고급 추적이 필요했습니다. 대표적인 예로 VSS 백업 요청의 "구성 요소" 또는 "비 구성 요소" 모드가 있습니다. SQL Server 2019(15.x) SQL 기록기를 사용하면 기본적으로 모든 단일 VSS 요청에 대해 로그되며 쉽게 액세스할 수 있습니다.
실패 상황: 조각난 데이터베이스
SQL 기록기 로깅이 이벤트 로그 아키텍처를 보완하는 이전 문을 설명하기 위해 잘 알려진 오류 상황인 조각난 데이터베이스와 관련된 항목을 살펴보겠습니다. 이 시나리오는 VSS 백업이 지정된 데이터베이스의 일부 파일 집합만 포함하는 볼륨의 스냅샷 집합을 만들려고 할 때 발생할 수 있습니다. SQL 기록기는 VSS 규칙에 따라 차단합니다.
이 추출은 작업의 내용 SqlWriterLogger.txt
입니다.
[01/11/2021 02:57:00, TID 5a88] Entering SQL Writer OnIdentify.
[01/11/2021 02:57:00, TID 5a88] Service: MSSQLSERVER Server: GF19. Version=15
[01/11/2021 02:57:00, TID 5a88] Instance MSSQL15.MSSQLSERVER Edition: Developer Edition
[01/11/2021 02:57:00, TID 5a88] Instance MSSQL15.NAMED1 Edition: Enterprise Edition: Core-based Licensing
[01/11/2021 02:57:00, TID 5a88] Skip User Instances Enumeration
[01/11/2021 02:57:02, TID 5a88] Entering SQL Writer OnPrepareBackup.
[01/11/2021 02:57:02, TID 5a88] ****************************************************************
[01/11/2021 02:57:02, TID 5a88] ** VSS SQL BACKUP BEGIN - ID: 5a88
[01/11/2021 02:57:02, TID 5a88] ****************************************************************
[01/11/2021 02:57:02, TID 5a88] Volume based (= NonComponent) backup selected.
[01/11/2021 02:57:02, TID 5a88] Backup type is VSS_BT_FULL
[01/11/2021 02:57:03, TID 5a88] Entering SQL Writer OnPrepareSnapshot.
[01/11/2021 02:57:03, TID 5a88] Service: MSSQLSERVER Server: GF19. Version=15
[01/11/2021 02:57:03, TID 5a88] Instance MSSQL15.MSSQLSERVER Edition: Developer Edition
[01/11/2021 02:57:03, TID 5a88] Instance MSSQL15.NAMED1 Edition: Enterprise Edition: Core-based Licensing
[01/11/2021 02:57:03, TID 5a88] Skip User Instances Enumeration
[01/11/2021 02:57:03, TID 5a88] HRESULT EXCEPTION CAUGHT: hr: 0x80780002
[01/11/2021 02:57:03, TID 5a88] Entering SQL Writer OnAbort.
SqlWriterLogger.txt
에서 오류가 발생한 것을 볼 수 있지만 실패에 대한 세부 정보는 0x80780002 HResult
뿐입니다. 이 값은 오류 코드 참조 없이 해석하기 어렵습니다. 하지만 조각난 데이터베이스 상황을 잘 식별합니다.
이벤트 로그 보기
이제 Windows 애플리케이션 이벤트 로그의 내용을 확인해 보겠습니다.
Log Name: Application
Source: SQLWRITER
Date: 1/11/2021 02:57:03 AM
Event ID: 24579
Task Category: None
Level: Error
Keywords: Classic
User: N/A
Computer: GF19
Description:
Sqllib error: Database db_on_G_and_H of SQL Server instance GF19 is stored on multiple volumes, only some of which are being shadowed.
이 이벤트는 상황을 설명하는 전체 사용자 친화적인 형식의 메시지를 제공합니다.
OS VSS 프레임워크는 또한 이벤트 로그에서 해당 명명법을 사용하여 문제를 보고합니다(VSS는 SQL Server의 컨텍스트에서 '데이터베이스'인 '구성 요소'를 관리).
Log Name: Application
Source: VSS
Date: 1/11/2021 02:57:03 AM
Event ID: 8229
Task Category: None
Level: Warning
Keywords: Classic
User: N/A
Computer: GF19
Description:
A VSS writer has rejected an event with error 0x800423f0, The shadow-copy set only
contains only a subset of the volumes needed to correctly backup the selected
components of the writer.
Changes that the writer made to the writer components while handling the event will
not be available to the requester.
Check the event log for related events from the application hosting the VSS writer.
Operation:
PrepareForSnapshot Event
Context:
Execution Context: Writer
Writer Class Id: {a65faa63-5ea8-4ebc-9dbd-a0c4db26912a}
Writer Name: SqlServerWriter
Writer Instance Name: Microsoft SQL Server 2019:SQLWriter
Writer Instance ID: {a16fed29-e555-4cc5-8938-c89201f31f7e}
Command Line: "C:\Program Files\Microsoft SQL Server\90\Shared\sqlwriter.exe"
Process ID: 22628
이벤트 로그는 여기에서 오류 자체에 대한 더 나은 정보 소스입니다. 그러나 SqlWriterLogger 콘텐츠는 백업 요청(SQL 기록기 OnPrepareSnapshot
단계에서 실패한 구성 요소가 아닌 VSS 백업 요청 VSS_BT_FULL
)에 대한 세부 정보를 제공합니다. 따라서 SQL Server 관련된 VSS 오류를 조사하면 두 소스를 모두 수집하고 검토해야 합니다.
SQL 기록기 로깅 매개 변수 수정
SqlWriterConfig.ini
텍스트 파일을 편집하여 SQL 기록기 로깅을 구성할 수 있습니다. 파일 자체에는 사용 가능한 매개 변수에 대한 빠른 인라인 설명이 포함되어 있으며, 아래에서 검토할 것입니다.
참고 항목
.ini 파일은 Windows 보호 폴더(프로그램 파일) 아래에 있습니다. 따라서 관리자 권한으로 편집해야 합니다. 탐색기에서 두 번 클릭하면 상승 없이 메모장이 열립니다. 사용자가 내용을 읽을 수 있지만 변경 내용을 저장하려고 하면 실패합니다. 메모장을 관리자로 시작한 다음 SqlWriterConfig.ini
을 열거나 파일을 저장할 때 필요에 따라 상승하라는 메시지를 표시할 수 있는 텍스트 편집기를 사용합니다.
여기에 SqlWriterConfig.ini
파일 주석 복제:
매개 변수 | 옵션 | 설명 |
---|---|---|
EnableLogging | - TRUE(기본값) - FALSE |
사용자가 필요한 경우 완전히 새로운 로깅 기능을 사용하지 않도록 설정할 수 있습니다. |
TraceFile | C:\Program Files\Microsoft SQL Server\90\Shared\SqlWriterLog.txt |
사용자가 추적 파일의 경로 및 파일 이름을 변경할 수 있습니다. 기본적이고 잘 알려진 위치를 사용하면 모든 SQL Server에서 바로 올바른 위치로 쉽게 이동할 수 있으므로 변경하지 않는 것이 좋습니다. |
TraceLevel | - DEFAULT(기본값) - MINIMAL - VERBOSE |
로깅의 자세한 정도입니다. 자세한 내용은 TraceLevel 세부 정보에 있습니다. |
TraceFileSizeMb | 1MB(기본값) | 롤오버 전의 최대 파일 크기입니다. .txt 파일은 UTF-8 인코딩을 사용하며 문자 당 2바이트를 사용합니다. 예를 들어, VSS 작업이 많거나, 로그 항목의 긴 기간을 유지하거나, 기본값이 아닌 TraceLevel 값이 장기간 사용하도록 설정된 경우와 같이 이 값을 늘리는 것이 유효합니다. 기본 1MB 값은 대부분의 상황에서 충분한 기록을 제공해야 합니다. |
ForceFlush | - TRUE - FALSE(기본값) |
이 옵션을 TRUE 으로 설정하면 마지막 로그 항목을 플러시하기 전에 SQL 기록기 서비스가 충돌하는 드문 경우에만 유용하며, 그렇지 않으면 기본값을 유지합니다. |
변경 내용 적용
설정을 변경하려면 활성화하려면 SQL 기록기 서비스를 다시 시작해야 합니다.
팁
SQL 기록기 다시 시작은 매우 빠르며 SQL 기록기가 상태 저장 정보를 유지하지 않으며 VSS 호출 간의 활동이 없으므로 언제든지 수행할 수 있습니다. 유일한 예방 조치는 VSS 작업(백업, 복원)이 수행되는 동안 다시 시작하지 않도록 하는 것입니다.
SQL 기록기는 서비스 시작 샘플 추출에서 볼 수 있듯이 (다시) 시작 시 로그 파일에 활성 매개 변수를 보고합니다.
TraceLevel 세부 정보
SqlWriterConfig.ini
파일에는 다음 수준이 나열됩니다.
수준 | 세부 정보 |
---|---|
DEFAULT |
기본 세부 정보 표시 매개 변수는 대부분의 요구 사항에 적합해야 합니다. 일반적인 로깅 항목 검토 섹션을 참조하여 기본적으로 이미 생성된 항목을 관찰합니다. 오류 외에도 VSS 메타데이터와 함께 성공한 VSS 호출은 기본적으로 기록됩니다. |
MINIMAL |
이 수준은 DEFAULT 모드 및 해당 이벤트의 서식을 유지합니다. 또한 코드의 여러 주요 위치에서 출력을 생성합니다. 특히 SQLWriter 논리에서 일반적으로 발생하는 모든 파일 및 데이터베이스 반복을 기록합니다. 특히 많은 수의 데이터베이스를 호스팅하는 인스턴스에서 각 VSS 작업(평범한 OnIdentify 이벤트 포함)에 대해 기록된 항목 수를 크게 늘릴 수 있습니다. 각 데이터베이스의 모든 물리적 파일은 VSS 백업 과정에서 두 번 이상 보고될 수 있습니다. 이 수준은 실패 시 SQL 기록기 논리의 논리적 위치를 보다 정확하게 파악하는 데만 도움이 됩니다. 탐색 용도로도 편리합니다. 세부 정보 수준이 기본 1MB 파일 크기의 기록 깊이를 크게 줄일 수 있으므로 잠시 조사 외에 활성 상태로 유지하는 것은 유용하지 않습니다. TraceFileSizeMb 값을 늘리는 것은 관련이 있을 수 있습니다. |
VERBOSE |
현재 이 수준은 MINIMAL 로 동일한 이벤트를 보고하지만 소스 코드 개체 및 메서드 설명자를 사용하여 각 항목의 접두사를 지정합니다. 출력을 더 넓고(최소값보다 크기가 크면) 읽을 수 없게 만듭니다. 추가된 정보는 Microsoft 지원 서비스와의 상호 작용 밖에서는 유용하지 않습니다. MINIMAL 로 동일한 주석이 적용됩니다. 이 수준을 장기간 활성 상태로 유지하면 기본 1MB 파일 크기의 기록 깊이가 크게 줄어들고 TraceFileSizeMb 값이 증가할 수 있습니다. |
MINIMAL
및 VERBOSE
수준은 실패 시 추가 오류 세부 정보를 제공하지 않으며 SQL 기록기 활동과 관련된 각 하위 수준 작업에 대한 추가 진행 세부 정보만 제공합니다.