SQL Server VSS 기록기 로깅

적용 대상:SQL Server

SQL Server는 전용 SQL 기록기 서비스를 통해 VSS(볼륨 섀도 복사본 서비스) 백업 및 복원 작업에 참여할 수 있습니다. 자세한 내용은 SQL Server 백업 애플리케이션 - VSS(볼륨 섀도 복사본 서비스) 및 SQL 기록기(SQL 기록기)를 참조하세요.

이 서비스는 이 문서의 뒷부분에 있는 예제에서 볼 수 있듯이 값SQLWRITER의 이벤트 Source (또는 ProviderName PowerShell 또는 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)에 도달하면 기본으로 로깅이 계속되도록 SqlWriterLogger.txt바뀝 SqlWriterLogger1.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) 버전에는 기본 설정 아래의 로그 파일에 동일한 양의 정보가 없습니다.

기본 작업

수동으로 변경하지 않고 새 로깅을 활용할 수 있습니다. 에서 기본 SqlWriterLogger.txt 로그 파일을 열거나 복사본을 가져올 수 있습니다 C:\Program Files\Microsoft SQL Server\90\Shared\. 이 파일은 SQL 기록기에 도달하는 모든 VSS 이벤트를 반영하며, 주로 다음과 같습니다.

  • OnIdentify 명령에 의해 트리거되는 이벤트 vssadmin list writers
  • 백업 이벤트
  • 이벤트 복원

즉, 이러한 작업이 성공적으로 수행되더라도 로그 파일은 여전히 자세한 항목을 기록합니다. 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 요청자는 이벤트에 의해 모든 VSS 백업 또는 복원 작업을 시작합니다 OnIdentify .

이전에는 활성 프로파일러 추적으로만 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)입니다.
  • VSS 요청자가 연결한 SQL Server 인스턴스(여기서는 기본 인스턴스 'GF19')에서 각 요청자가 제공한 데이터베이스 이름(여기 'db_on_G')을 찾거나 찾을 수 없음을 확인합니다.
  • 요청된 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 콘텐츠는 백업 요청( VSS_BT_FULLSQL 기록기 단계에서 실패한 OnPrepareSnapshot 구성 요소가 아닌 VSS 백업 요청)에 대한 세부 정보를 제공합니다. 따라서 SQL Server와 관련된 VSS 오류에 대한 모든 조사는 두 원본을 모두 수집하고 검토해야 합니다.

SQL 기록기 로깅 매개 변수 수정

텍스트 파일을 편집하여 SQL 기록기 로깅을 SqlWriterConfig.ini 구성할 수 있습니다. 파일 자체에는 사용 가능한 매개 변수에 대한 빠른 인라인 설명이 포함되어 있으며, 아래에서 검토할 것입니다.

참고 항목

.ini 파일은 Windows 보호 폴더(프로그램 파일) 아래에 있습니다. 따라서 관리자 권한으로 편집해야 합니다. 탐색기에서 두 번 클릭하면 상승 없이 메모장이 열립니다. 사용자가 내용을 읽을 수 있지만 변경 내용을 저장하려고 하면 실패합니다. 메모장을 관리자로 시작한 다음 열 SqlWriterConfig.ini거나 파일을 저장할 때 필요에 따라 상승하라는 메시지를 표시할 수 있는 텍스트 편집기를 사용합니다.

여기에 파일 주석 복제 SqlWriterConfig.ini :

매개 변수 옵션 설명
EnableLogging - TRUE(기본값)
-False
사용자가 필요한 경우 완전히 새로운 로깅 기능을 사용하지 않도록 설정할 수 있습니다.
TraceFile C:\Program Files\Microsoft SQL Server\90\Shared\SqlWriterLog.txt 사용자가 추적 파일의 경로 및 파일 이름을 변경할 수 있습니다. 잘 알려진 기본 위치로 변경하지 않는 것이 좋습니다. 따라서 SQL Server에서 올바른 위치로 바로 바로 이동할 수 있습니다.
Tracelevel - DEFAULT(기본값)
-최소
-자세한
로깅의 세부 정보입니다. 자세한 내용은 TraceLevel 세부 정보입니다.
TraceFileSizeMb 1MB(기본값) 롤오버 전의 최대 파일 크기입니다. .txt 파일은 UTF-8 인코딩을 사용하며 문자 당 2바이트를 사용합니다. 예를 들어, VSS 작업이 많거나, 로그 항목의 긴 기간을 유지하거나, 기본값 TraceLevel 이 아닌 값이 장기간 사용하도록 설정된 경우와 같이 이 값을 늘리는 것이 유효합니다. 기본 1MB 값은 대부분의 상황에서 충분한 기록을 제공해야 합니다.
ForceFlush -사실
- 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 증가할 수 있습니다.

MINIMALVERBOSE 수준은 실패 시 추가 오류 세부 정보를 제공하지 않으며 SQL 기록기 활동과 관련된 각 하위 수준 작업에 대한 추가 진행 률 세부 정보만 제공합니다.

다음 단계