Sqldumper.exe 도구를 사용하여 SQL Server 덤프 파일 생성

이 문서에서는 SQL Server 포함된 Sqldumper.exe 도구에 대한 일반적인 지침을 제공합니다. 이 도구는 다양한 종류의 덤프 파일을 생성하는 데 사용됩니다.

원래 제품 버전: SQL Server 2019, SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012, SQL Server 2008, SQL Server 2005
원래 KB 번호: 917825

요약

Sqldumper.exe 도구는 Microsoft SQL Server 포함되어 있습니다. 디버깅을 위해 SQL Server 및 관련 프로세스의 메모리 덤프 파일을 생성합니다. 이 문서에서는 Sqldumper.exe 사용하여 Watson 오류 보고 또는 디버깅 작업에 대한 덤프 파일을 생성하는 방법을 설명합니다.

이 문서에서는 덤프 파일을 생성하는 두 가지 다른 방법도 설명합니다.

  • 연결된 PowerShell 스크립트 는 SQLDumper.exe 명령줄 옵션을 자동화합니다.
  • DBCC STACKDUMP T-SQL(Transact-SQL) 명령을 사용하여 SQL Server 덤프 파일을 생성할 수 있습니다.

수동으로 Sqldumper.exe 실행하는 방법

SQL Server 원래 도구를 설치한 폴더의 컨텍스트에서 Sqldumper.exe 도구를 실행합니다.

기본적으로 Sqldumper.exe 설치 경로는 SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe입니다<. <SQLServerInstall 드라이브>는 SQL Server 설치한 드라이브의 자리 표시자입니다.

Sqldumper.exe 도구를 사용하여 덤프 파일을 생성하려면 다음 단계를 수행합니다.

  1. SQLServerInstall 드라이브>:\Program Files\Microsoft SQL Server\number>\<Shared 폴더를 엽니다<.

    이 폴더 경로 <에서 number> 는 다음 중 하나의 자리 표시자입니다.

    • 2019년 SQL Server 150명
    • 2017년 SQL Server 140
    • 2016년 SQL Server 130
    • 2014년 SQL Server 120
    • 2012년 SQL Server 110
    • 2008년 SQL Server 100
    • 2005년 SQL Server 90
  2. Dbghelp.dll 파일이 이 폴더에 있는지 확인합니다.

  3. 실행 시작을> 선택하고 cmd를 입력한 다음 확인을 선택합니다.

  4. 명령 프롬프트에서 다음 명령을 입력한 다음 Enter 키를 누릅니 .

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    

    참고: 이 폴더 경로<에서 number>는 앞에서 설명한 대로 SQL Server 버전으로 변경되는 자리 표시자와 동일합니다.

  5. 특정 종류의 덤프 파일을 생성하려면 명령 프롬프트에 해당 명령을 입력한 다음 Enter 키를 누릅니 .

    • 전체 덤프 파일:

      Sqldumper.exe <ProcessID> 0 0x01100
      
    • 미니 덤프 파일:

      Sqldumper.exe <ProcessID> 0 0x0120
      
    • 간접 참조 메모리를 포함하는 미니 덤프 파일(권장 옵션이며 메모리 덤프 파일을 자동으로 생성할 때 기본적으로 SQL Server 사용됨).

      Sqldumper.exe <ProcessID> 0 0x0128
      
    • 필터링된 덤프 파일:

      Sqldumper.exe <ProcessID> 0 0x8100
      

    참고:<ProcessID> 는 덤프 파일을 생성하려는 Windows 애플리케이션의 프로세스 식별자에 대한 자리 표시자입니다.

Sqldumper.exe 성공적으로 실행되면 도구는 도구가 설치된 폴더에 덤프 파일을 생성합니다.

Sqldumper.exe 생성하는 덤프 파일에는 SQLDmpr<xxxx.mdmp>와 유사한 파일 이름 패턴이 있습니다.

이 패턴 <에서 xxxx> 는 동일한 폴더에 비슷한 파일 이름이 있는 다른 파일에 따라 결정되는 증가된 수입니다. 폴더에 지정된 패턴의 파일 이름이 있는 파일이 이미 있는 경우 원하는 파일을 식별하기 위해 파일이 만들어진 날짜와 시간을 비교해야 할 수 있습니다.

Microsoft Windows 애플리케이션 프로세스 식별자를 가져오는 방법

Sqldumper.exe 도구를 사용하여 덤프 파일을 생성하려면 덤프 파일을 생성하려는 Windows 애플리케이션의 프로세스 식별자가 있어야 합니다. 프로세스 식별자를 가져오는 방법은 다음과 같습니다.

  1. Ctrl+Alt+Delete를 누르고 작업 관리자를 선택합니다.
  2. Windows 작업 관리자 대화 상자에서 프로세스 탭을 선택합니다.
  3. 보기 메뉴에서 열 선택을 선택합니다.
  4. 열 선택 대화 상자에서 PID(프로세스 식별자) 확인란을 선택한 다음 확인을 선택합니다.
  5. 덤프 파일을 생성하려는 Windows 애플리케이션의 프로세스 식별자를 확인합니다. SQL Server 애플리케이션의 경우 Sqlservr.exe 프로세스의 프로세스 식별자를 확인합니다.
  6. 작업 관리자를 닫습니다.

또는 SQL Server 오류 로그 파일을 사용하여 컴퓨터에서 실행되는 SQL Server 애플리케이션의 프로세스 식별자를 가져옵니다. SQL Server 오류 로그 파일의 일부는 다음 예제와 유사합니다.

2021-09-15 11:50:32.690 Server       Microsoft SQL Server 2019 (RTM-CU12) (KB5004524) - 15.0.4153.1 (X64)
    Jul 19 2021 15:37:34
    Copyright (C) 2019 Microsoft Corporation
    Enterprise Edition (64-bit) on Windows 10 Pro 10.0 <X64> (Build 19043: ) (Hypervisor)
2021-09-15 11:50:32.690 Server       UTC adjustment: -5:00
2021-09-15 11:50:32.690 Server       (c) Microsoft Corporation.
2021-09-15 11:50:32.690 Server       All rights reserved.
2021-09-15 11:50:32.690 Server       Server process ID is 7028.

다음에 Server process ID 표시되는 숫자는 Sqlservr.exe 프로세스의 프로세스 식별자입니다.

메모리 덤프 파일의 출력 경로

SQLDumper.exe 특정 문제(예: 예외, 어설션, 비수익 스케줄러)를 resolve 위해 메모리 덤프가 필요한 시나리오에서 SQL Server 프로세스에 대한 메모리 덤프 파일을 생성하기 위해 주로 존재합니다. 이러한 경우 SQL Server SQLDumper.exe 호출하여 프로세스의 메모리 덤프 파일을 생성합니다. 기본적으로 메모리 덤프 파일은 SQL instance MSSQL\LOG\ 디렉터리에 저장됩니다.

기본 경로를 변경하는 방법

예를 들어 덤프 파일 크기가 너무 큰 경우 다음을 수행하여 경로를 수정할 수 있습니다.

  1. SQL Server 구성 관리자 엽니다.
  2. SQL Server 서비스에서 조사 중인 SQL Server instance 찾습니다.
  3. 해당 항목을 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 고급 탭으로 이동합니다.
  4. 덤프 디렉터리를 원하는 경로로 변경한 다음 확인을 선택합니다.
  5. 새 설정이 적용되려면 SQL Server(가능한 경우)를 다시 시작합니다.

Sqldumper.exe 도구를 사용하여 모든 Windows 애플리케이션에 대한 덤프 파일을 생성하는 경우 덤프 파일은 Windows 애플리케이션이 현재 사용 중인 메모리만큼 클 수 있습니다. Sqldumper.exe 덤프 파일을 작성하는 드라이브에서 충분한 디스크 공간을 사용할 수 있는지 확인합니다.

명령에서 사용자 지정 출력 폴더 지정

Sqldumper.exe 도구에서 덤프 파일을 작성할 디렉터리를 지정할 수 있습니다. Sqldumper.exe 실행하기 전에 디렉터리가 이미 있어야 합니다. 그렇지 않으면 Sqldumper.exe 실패합니다. UNC 경로를 덤프 파일의 위치로 사용하지 마세요. 다음은 미니 덤프 파일의 덤프 파일 위치를 지정하는 방법의 예입니다.

  1. 실행 시작을> 선택하고 cmd를 입력한 다음 확인을 선택합니다.

  2. 명령 프롬프트에서 다음 명령을 입력한 다음 Enter 키를 누릅니 .

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    
  3. 명령 프롬프트에서 다음 명령을 입력한 다음 Enter 키를 누릅니 .

    Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
    

    참고:<MdumpPath> 는 Sqldumper.exe 도구에서 덤프 파일을 작성할 디렉터리의 자리 표시자입니다. 기본적으로 파일은 현재 폴더에 기록됩니다.

생성할 전체 덤프 파일 또는 필터링된 덤프 파일을 지정하는 경우 Sqldumper.exe 덤프 파일을 생성하는 데 몇 분 정도 걸릴 수 있습니다. 소요되는 시간은 다음 변수에 따라 달라집니다.

  • Sqlservr.exe 현재 사용 중인 메모리 양입니다.
  • 도구가 덤프 파일을 작성하는 드라이브의 속도입니다.

이 시간 동안 Sqldumper.exe 도구는 명령을 처리하지 않습니다. 서버의 응답이 중지된 것을 알 수 있습니다. 또한 클러스터 장애 조치(failover)가 발생할 수 있습니다.

사용 권한 요구 사항

Sqldumper.exe 실행하려면 다음 방법 중 하나를 사용하여 Windows에 로그인해야 합니다.

  • 컴퓨터에서 관리자 그룹의 구성원인 계정을 사용합니다.
  • SQL Server 서비스가 실행 중인 동일한 사용자 계정을 사용합니다.

Sqldumper.exe 도구가 원격 데스크톱 또는 터미널 서비스를 통해 성공적으로 작동하려면 콘솔 모드에서 원격 데스크톱 또는 터미널 서비스를 시작해야 합니다. 예를 들어 콘솔 모드에서 원격 데스크톱을 시작하려면실행을선택하고>mstsc /console을 입력한 다음 확인을 선택합니다. 대상 서버가 Windows 2000을 실행하는 경우 /console 옵션은 자동으로 무시됩니다. 원격 데스크톱을 통해 서버에 연결할 수 있지만 콘솔 세션을 사용하지는 않습니다.

Sqldumper.exe 실행한 후 현재 폴더에 덤프 파일이 생성되지 않은 경우 명령줄에서 도구가 생성한 정보를 검토하여 오류의 가능한 원인을 확인합니다. 이 정보는 현재 디렉터리의 Sqldumper_errorlog.log 파일에도 기록됩니다. 다음은 가능한 두 가지 오류 메시지와 그 원인입니다.

메시지 원인
"OpenProcess가 0x57 실패했습니다. 매개 변수가 잘못되었습니다." 잘못된 프로세스 ID가 Sqldumper.exe 유틸리티에 전달되었습니다.
"스레드 ID에 대한 잘못된 값 - <잘못된 매개 변수 매개 변수> 오류" 잘못된 매개 변수가 Sqldumper.exe 유틸리티에 전달되었습니다.

다음 중 하나와 유사한 오류 메시지가 생성되면 이 메시지를 무시해도 됩니다.

  • "미니덤프 6 동안 알 수 없는 콜백 유형"
  • "minidump 7 중에 알 수 없는 콜백 유형"

덤프 생성의 영향

사용자 모드 프로세스의 덤프 파일이 요청되면(이 문서에서 설명한 대로 scope 외부에 있는 운영 체제 커널 덤프와 달리) 덤프 콘텐츠를 파일 대상으로 직렬화하는 데 걸리는 기간 동안 대상 프로세스(여기 SQLServer.exe)가 고정됩니다.

Frozen은 프로세스에서 Windows 클러스터링의 IsAlive 구현과 같은 리소스 폴링 메커니즘을 포함하여 사용자 요청 또는 내부 작업을 실행할 수 없음을 의미합니다(해당 상황을 처리하는 방법에 대한 자세한 내용은 클러스터 장애 조치(failover)의 메모리 덤프 섹션 참조). 벽시계 시간에 의존하는 시간 제한은 동결로 인해 위반될 수도 있습니다.

이전 문에서 파생될 수 있듯이 동결 기간은 여기서 중요한 요소이며 다음을 기준으로 합니다.

  • 선택한 덤프의 유형 입니다.
  • 메모리에서 SQL Server 프로세스의 크기로, 기본 매개 변수를 실행하는 단일 활성 instance 경우 서버의 총 실제 RAM에 가까운 경우가 많습니다.
  • 덤프의 대상으로 사용되는 디스크의 성능입니다.

또한 디스크 의 덤프 파일 크기 는 특히 여러 덤프가 가능하고 기본이 아닌 대규모 덤프 형식이 선택된 경우 계획해야 합니다. 덤프 유형을 검토하여 예상할 사항을 알고 있는지 확인합니다. 기본적으로 일부 덤프 메서드는 SQL Server 인스턴스의 \Log 폴더에 덤프를 만듭니다. 기본 단순 구성에서는 SQL Server 시스템 디스크 및 데이터+로그 디스크도 됩니다. 디스크를 포화 상태가 되면 SQL Server 및/또는 시스템 가용성에 심각한 영향을 미칩니다.

클러스터형 시스템에 미치는 영향 관리

프로세스는 덤프 생성 중에 일시적으로 일시 중단됩니다. 이는 Always On 컨텍스트에서 SQL Server 서비스 가용성 및 트리거 리소스 장애 조치(failover) 클러스터 instance 및 가용성 그룹에 영향을 줄 수 있습니다. 다양한 프로세스의 덤프 생성은 리소스에 다르게 영향을 줍니다. 덤프 생성 및 덤프 형식의 영향 섹션을 주의 깊게 읽어보세요.

클러스터형 SQL Server 또는 Always On AG(가용성 그룹) instance 호스트하는 SQL Server SQL Server 프로세스 덤프 파일(특히 필터링된 덤프 파일 또는 전체 덤프 파일)을 캡처하는 경우 클러스터형 SQL Server 또는 덤프 파일을 완료하는 데 너무 오래 걸리는 경우 AG가 다른 노드로 장애 조치(failover)될 수 있습니다. 장애 조치(failover)를 방지하려면 덤프 파일을 캡처하기 전에 다음 설정을 사용합니다. 덤프 파일을 가져온 후 변경 사항을 되돌릴 수 있습니다.

  • FCI(장애 조치(failover) 클러스터형 instance:
    • 클러스터 관리자에서 SQL Server 리소스를 마우스 오른쪽 단추로 클릭하고 리소스가 실패하면 정책 탭에서 다시 시작하지 않음을 선택합니다.
    • 속성 탭에서 HealthCheck 시간 제한을 늘립니다. 예를 들어 속성 값을 180 초 이상으로 설정합니다. 이 시간 제한에 도달하면 리소스가 실패하면 다시 시작하지 않음 정책이 무시되고 리소스가 다시 시작됩니다.
    • 속성 탭에서 FailureConditionLevel 값을 0으로 변경합니다.
  • AG의 경우 다음 설정을 모두 적용합니다.
    • 세션 시간 제한(예: 모든 복제본에 대해 120초)을 늘입니다. SSMS(SQL Server Management Studio)에서 구성할 복제본(replica) 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다. 세션 시간 제한(초) 필드를 120초로 변경합니다. 자세한 내용은 가용성 복제본에 대한 Session-Timeout 기간 변경(SQL Server)을 참조하세요.
    • 모든 복제본의 자동 장애 조치(failover)를 수동 장애 조치(failover)로 변경합니다. SSMS에서 복제본(replica) 마우스 오른쪽 단추로 클릭하고 속성을 선택하고 속성 탭에서 모든 복제본의 자동 장애 조치(failover)를 수동 장애 조치(failover) 변경합니다. 자세한 내용은 가용성 복제본의 장애 조치(failover) 모드 변경(SQL Server)을 참조하세요.
    • LeaseTimeout60,000ms(60초)로 늘리고 HealthCheckTimeout90,000ms(90초)로 변경합니다. 클러스터 관리자에서 AG 리소스를 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 속성 탭으로 전환하여 두 설정을 모두 수정합니다. 자세한 내용은 HealthCheckTimeout 속성 설정 구성을 참조하세요.

SQL Server 미치는 영향을 줄이기 위한 제품 개선

덤프 파일의 크기 및/또는 메모리 덤프 생성 시간을 줄이기 위해 최신 버전의 SQL Server 네 가지 주요 개선 사항이 추가되었습니다.

비트맵 필터링 메커니즘

SQL Server 필터링된 덤프에서 제외할 메모리 페이지를 추적하는 비트맵을 할당합니다. Sqldumper.exe 비트맵을 읽고 다른 메모리 관리자 메타데이터를 읽을 필요 없이 페이지를 필터링합니다. 비트맵을 각각 사용하거나 사용하지 않도록 설정하면 SQL Server 오류 로그에 다음 메시지가 표시됩니다.

Page exclusion bitmap is enabled.Page exclusion bitmap is disabled.

  • SQL Server 2016

    SQL Server 2016 SP2 CU13부터 비트맵 필터링은 기본적으로 사용하도록 설정됩니다.

  • SQL Server 2017

    • 이는 RTM에서 CU15를 통해 사용할 수 없습니다.
    • SQL Server 2017 CU16에서는 T8089를 통해 비트맵 필터링을 사용하도록 설정하고 T8089를 해제하여 사용하지 않도록 설정할 수 있습니다.
    • SQL Server 2017 CU20부터 비트맵 필터링은 기본적으로 사용하도록 설정됩니다. 추적 플래그 T8089는 더 이상 적용되지 않으며 켜져 있으면 무시됩니다. 비트맵 필터링은 T8095를 통해 사용하지 않도록 설정할 수 있습니다.
  • SQL Server 2019

    이 기능은 기본적으로 SQL Server 2019 RTM에서 사용하도록 설정됩니다. T8095를 통해 사용하지 않도록 설정할 수 있습니다.

동일한 문제에 대해 반복되는 덤프 제거

동일한 문제에 대해 반복되는 메모리 덤프가 제거됩니다. 스택 서명을 사용하여 SQL 엔진은 예외가 이미 발생했는지 추적하며 이미 있는 경우 새 메모리 덤프를 생성하지 않습니다. 이는 액세스 위반, 스택 오버플로, 어설션 및 인덱스 손상 예외에 적용됩니다. 이렇게 하면 메모리 덤프에 사용되는 디스크 공간이 크게 줄어들고 덤프를 생성하기 위해 프로세스가 일시적으로 중지되지 않습니다. 이는 2019년 SQL Server 추가되었습니다.

오류 로그의 단축된 출력

단일 메모리 덤프에서 SQL Server 오류 로그에서 생성된 콘텐츠는 압도적일 뿐만 아니라 이 모든 정보를 오류 로그의 텍스트 형식으로 직렬화해야 하는 시간으로 인해 메모리 덤프를 생성하는 프로세스도 느려졌습니다. 2019년 SQL Server 덤프 생성 시 오류 로그에 저장된 콘텐츠가 크게 감소했으며 다음과 같이 표시될 수 있습니다.

DateTimespidS pid    **Dump thread - spid = 0, EC = 0x0000015C7169BF40
DateTimespidS pid    *
DateTimespidS pid    *User initiated stack dump. This is not a server exception dump.
DateTimespidS pid    *
DateTimespidS pid    Stack Signature for the dump is 0x00000000788399E5
DateTimespidS pid    External dump process return code 0x20000001.
External dump process returned no errors.

예를 들어 사용자가 수동 덤프를 트리거한 경우 이전에 SQL Server 각 세션/스레드에 대한 정보를 인쇄했습니다.

메모리 덤프의 병렬 압축

덤프를 더 빠르게 생성하고 크기가 작게 만들기 위해 2022 CU8 및 SQL Server 2019 CU23SQL Server 압축된 메모리 덤프 기능이 도입되었습니다. 활성화되면 Sqldumper.exe 여러 스레드를 만들어 프로세스의 메모리를 동시에 읽고 압축한 다음 덤프 파일에 저장합니다. 이 다중 스레드 병렬 압축은 파일 크기를 줄이고 전체 및 필터링된 덤프와 함께 사용할 때 덤핑 프로세스를 가속화합니다.

추적 플래그 2610을 켜서 압축된 메모리 덤프를 사용하도록 설정할 수 있습니다.

DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)

또는 항상 압축된 메모리 덤프를 만들 수 있도록 SQL Server instance 시작 매개 변수로 추가할 -T2610 수 있습니다.

Sqldumper.exe 수동으로 실행하는 경우 매개 변수를 -zdmp 사용하여 압축된 메모리 덤프를 캡처할 수 있습니다. 예를 들면

Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp

또한 매개 변수를 사용하여 -cpu:X 압축된 덤프를 만드는 데 사용할 수 있는 코어 수를 Sqldumper.exe 제한할 수도 있습니다. 여기서 X 는 CPU 수입니다. 이 매개 변수는 명령줄에서 Sqldumper.exe 수동으로 실행하는 경우에만 사용할 수 있습니다.

Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8

메모리 덤프 만들기를 방지하거나 지연하는 요소

다음 요인은 지연을 발생하거나 메모리 덤프 생성을 방지하는 것으로 알려져 있습니다.

  • 메모리 덤프가 기록되는 IO 경로가 제대로 수행되지 않습니다. 이러한 경우 디스크 I/O 성능을 조사하고 resolve 다음 논리적 단계입니다.
  • 바이러스 백신 또는 기타 모니터링 소프트웨어가 SQLDumper.exe 방해하고 있습니다. 경우에 따라 타사 소프트웨어가 ReadProcessMemory 함수를 우회합니다 . 이렇게 하면 덤프 기간이 크게 증가할 수 있습니다. 이러한 문제의 대부분을 resolve 방해 소프트웨어를 사용하지 않도록 설정하거나 제외 목록에 SQLDumper.exe 추가합니다.

덤프 형식

설명된 메서드는 미니 덤프, 전체 덤프 및 필터링된 덤프의 세 가지 유형의 덤프를 생성할 수 있습니다.

참조된 메모리가 있는 미니 덤프

이 유형의 메모리 덤프는 프로세스의 모든 활성 스레드("스레드 스택")의 스냅샷 스레드 스택 및 기타 키 프로세스/스레드 데이터에서 참조하는 메모리의 제한된 추출과 함께 사용됩니다. 일반적으로 몇 메가바이트 크기이며 생성 속도가 빠릅니다(1초 미만에서 몇 초). 더 큰 서버 시스템(수백 개의 CPU가 간접적으로 SQL Server 프로세스에서 대량의 스레드를 구동하는 경우)은 거의 20~30MB를 초과하지 않습니다. 미니 덤프의 크기는 SQL Server 프로세스의 크기로 증가하지 않습니다. 이 덤프 유형은 예외, 스케줄러 문제, 래치 문제 등에서 메모리 덤프를 자동으로 생성할 때 SQL Server 사용하는 기본 형식입니다.

참고

SQL Server 기본 제공 계측의 일부로 일부 특정 상황에서 자동화된 "진단 미니 덤프"를 생성합니다. 따라서 이 작업은 SQL Server 필요할 때 자동으로 트리거할 수 있을 만큼 안전한 것으로 간주됩니다.

전체 덤프

전체 메모리 덤프는 활성 대상 프로세스 공간의 전체 복사본입니다. 따라서 모든 스레드 상태, 모든 프로세스 할당 메모리 및 로드된 모든 모듈이 포함됩니다. 따라서 전체 덤프의 크기는 SQL Server 프로세스와 거의 동일하며, 이는 전체 시스템 RAM만큼 클 수 있습니다. 단일 SQL Server instance 전용 대규모 서버에서 수백 기가바이트 이상의 파일을 의미할 수 있습니다. 말할 필요도 없이, 이러한 파일을 생성 하는 데 시간이 오래 걸릴 것입니다 하 고 따라서 장기간된 동결을 유도 합니다. 덤프의 파일 대상에 대한 디스크 성능은 시간을 고정하는 주요 드라이버가 됩니다. 이러한 종류의 덤프는 다음 형식 설명에서 설명하는 것처럼 오늘**SQL Server 거의 사용되지 않습니다.

필터링된 덤프

SQL Server 실행하는 일반적인 서버의 RAM 크기가 꾸준히 증가함에 따라 전체 덤프는 더 다루기 어려워집니다. 따라서 필터링된 덤프가 구현됩니다. 필터링된 덤프는 전체 덤프의 하위 집합으로, SQL Server 메모리의 큰 영역이 즉시 제외되고 디스크에 기록되지 않습니다. 일반적으로 제외된 메모리는 문제 해결에 추가된 값을 제공하지 않습니다. 예를 들어 데이터/인덱스 페이지와 Hekaton 데이터 페이지 및 로그 풀 메모리와 같은 일부 내부 캐시가 있습니다. 이 필터링된 덤프는 전체 덤프보다 작은 파일을 생성하지만 덤프는 여전히 거의 모든 유용성을 유지합니다. 필터링된 덤프는 미니 덤프가 충분하지 않은 대부분의 상황에서 전체 덤프를 기본 옵션으로 대체했습니다. 크기 감소는 전체 덤프에 비해 다를 수 있지만 여전히 SQL Server 프로세스 크기의 30~60%인 다소 큰 파일입니다. 따라서 최악의 옵션으로 전체 덤프만큼 큰 크기를 계획하는 것이 가장 좋으며, 이는 좋은 안전 마진을 남깁니다. 필터링된 덤프는 모든 경우에 전체 덤프보다 생성 속도가 더 빠르지 않을 수 있습니다. 즉, 방지된 IO 수와 관련된 이득이 필터 논리를 구현하는 데 필요한 시간을 초과하는지 여부(디스크 속도 및 CPU/RAM 속도가 영향을 미치는지 여부)입니다.

다음 쿼리를 사용하여 필터링된 덤프 크기의 대략적인 추정치를 가져올 수 있습니다. 대부분의 데이터/인덱스 페이지가 덤프에서 제외될 것으로 예상되지만, 단독으로 래치되고 수정되는 페이지는 제외되지 않습니다.

SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'

Sqldumper.exe 사용하여 Microsoft Windows 애플리케이션에 대한 요청 시 덤프 파일을 생성할 수 있으므로 필터링된 덤프 옵션을 사용하는 것이 좋습니다. 그러나 필터링된 덤프 파일은 SQL Server 컨텍스트에서만 적용 가능하고 의미가 있습니다. 여전히 전체 덤프 파일 또는 비 SQL Server 애플리케이션을 성공적으로 미니 덤프를 생성할 수 있습니다.

SQL Server 프로세스는 내부적으로 Sqldumper.exe 도구를 호출하여 프로세스에서 예외가 발생할 때 덤프 파일을 생성합니다. SQL Server 매개 변수를 Sqldumper.exe 전달합니다. 추적 플래그를 사용하여 예외 또는 어설션이 발생할 때 SQL Server 기본적으로 도구에 전달하는 매개 변수를 변경할 수 있습니다. 이러한 추적 플래그는 2540에서 2559까지의 범위에 있습니다. 이러한 추적 플래그 중 하나를 사용하여 생성할 SQLDumper.exe 기본 덤프 유형을 변경할 수 있습니다(기본값은 참조된 메모리가 있는 미니 덤프). 예를 들면

  • 추적 플래그 2551: 필터링된 메모리 덤프를 생성합니다.
  • 추적 플래그 2544: 전체 메모리 덤프를 생성합니다.
  • 추적 플래그 8026: SQL Server 덤프를 한 번 생성한 후 덤프 트리거를 지웁 수 있습니다.

둘 이상의 추적 플래그가 활성 상태이면 가장 큰 메모리 덤프를 나타내는 옵션이 적용됩니다. 예를 들어 추적 플래그 2551 및 2544를 사용하는 경우 SQL Server 전체 메모리 덤프를 만듭니다.

클러스터 장애 조치(failover)에서 메모리 덤프 생성

클러스터 장애 조치(failover) 시나리오에서 SQL Server 리소스 DLL은 문제 해결을 지원하기 위해 장애 조치(failover)가 발생하기 전에 덤프 파일을 가져올 수 있습니다. SQL Server 리소스 DLL이 SQL Server 리소스가 실패했다고 판단하면 SQL Server 리소스 DLL은 Sqldumper.exe 유틸리티를 사용하여 SQL Server 프로세스의 덤프 파일을 가져옵니다. Sqldumper.exe 도구가 덤프 파일을 성공적으로 생성하도록 하려면 다음 세 가지 속성을 필수 구성 요소로 설정해야 합니다.

  • SqlDumperDumpTimeOut

    사용자가 지정한 시간 제한입니다. 리소스 DLL은 리소스 DLL이 SQL Server 서비스를 중지하기 전에 덤프 파일이 완료될 때까지 기다립니다.

  • SqlDumperDumpPath

    Sqldumper.exe 도구가 덤프 파일을 생성하는 위치입니다.

  • SqlDumperDumpFlags

    Sqldumper.exe 사용하는 플래그입니다.

속성 중 하나가 설정되지 않은 경우 Sqldumper.exe 덤프 파일을 생성할 수 없습니다. 리소스가 온라인 상태가 될 때마다 이벤트 로그와 클러스터 로그에 경고 메시지가 기록됩니다.

SQL Server 2012 이상 버전의 SQLDumper에 대한 클러스터 구성

(T-SQL) 명령을 사용하여 ALTER SERVER CONFIGURATION 이러한 속성을 수정할 수 있습니다. 예를 들면

ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpTimeOut = 0;
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpPath = 'C:\temp\';
ALTER SERVER CONFIGURATION SET FAILOVER CLUSTER PROPERTY SqlDumperDumpFlags = 296;

또는 PowerShell 스크립트를 사용할 수 있습니다. 예를 들어 명명된 instance SQL2017AG:

Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpPath" -Value "C:\temp"
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpFlags" -Value 296
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Set-ClusterParameter -Name "SqlDumperDumpTimeOut" -Value 0

설정이 적용되었는지 확인하려면 다음 PowerShell 명령을 실행할 수 있습니다.

Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter

SQL Server 2008/2008 R2 또는 Windows 2012 및 이전 버전의 SQLDumper에 대한 클러스터 구성

클러스터 리소스 명령을 사용하여 클러스터 장애 조치(failover)에 대한 Sqldumper.exe 유틸리티 속성을 설정하려면 다음 단계를 수행합니다.

  1. 실행 시작을> 선택하고 cmd를 입력한 다음 확인을 선택합니다.
  2. 각 속성에 대해 명령 프롬프트에 해당 명령을 입력한 다음 Enter 키를 누릅니 .
    • 속성 SqlDumperDumpFlags

      특정 종류의 덤프 파일에 대한 속성을 설정 SqlDumperDumpFlags 하려면 명령 프롬프트에 해당 명령을 입력한 다음 Enter 키를 누릅니 .

      • 모든 스레드 전체 덤프 파일

        • 기본 인스턴스

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
          
        • 명명된 instance

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • 모든 스레드 미니 덤프 파일

        • 기본 인스턴스

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
          
        • 명명된 instance

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
          
      • 모든 스레드 덤프 파일 필터링됨

        • 기본 인스턴스

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
          
        • 명명된 instance

          cluster resource "SQL Server  (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
          
    • 속성 SqlDumperDumpPath

      cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
      

      참고:<DirectoryPath> 는 덤프 파일이 생성될 디렉터리의 자리 표시자이며 따옴표(" ")로 지정해야 합니다.

    • 속성 SqlDumperDumpTimeOut

      cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
      

      참고:<시간 제한> 은 시간 제한(밀리초)의 자리 표시자입니다.

도구가 SQL Server 프로세스의 덤프 파일을 생성하는 데 걸리는 시간은 컴퓨터 구성에 따라 달라집니다. 많은 추억이 있는 컴퓨터의 경우 시간이 중요할 수 있습니다. 프로세스가 소요되는 시간을 예상하려면 Sqldumper.exe 도구를 사용하여 덤프 파일을 수동으로 생성합니다. 속성의 SqlDumperDumpTimeOut 유효한 값은 10,000ms 에서 MAXDWORD까지입니다. MAXDWORD 는 DWORD 데이터 형식(4294967295) 범위에서 가장 높은 값을 나타냅니다.

설정이 사용하도록 설정되었는지 확인하려면 다음 명령을 실행할 수 있습니다.

cluster resource "SQL Server" /priv

클러스터 장애 조치(failover)에 대한 Sqldumper.exe 속성 제거

클러스터 장애 조치(failover)에 대한 Sqldumper.exe 도구 속성을 제거하려면 다음 단계를 수행합니다.

  1. 실행 시작을> 선택하고 cmd를 입력한 다음 확인을 선택합니다.
  2. 특정 속성의 경우 명령 프롬프트에 해당 명령을 입력한 다음 Enter 키를 누릅니 .
    • 속성 SqlDumperDumpFlags

      • 기본 인스턴스

          cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
        
      • 명명된 instance

          cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
        
    • 속성 SqlDumperDumpPath

      • 기본 인스턴스

        cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
        
      • 명명된 instance

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
        
    • 속성 SqlDumperDumpTimeOut

      • 기본 인스턴스

        cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
        
      • 명명된 instance

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
        

DBCC STACKDUMP를 사용하는 방법

명령은 DBCC STACKDUMP SQL Server instance 설치의 LOG 디렉터리에 메모리 덤프를 만드는 데 도움이 될 수 있습니다. 명령은 기본적으로 크기가 제한되고 SQL Server 프로세스의 상태를 반영하기에 적합한 모든 스레드가 있는 미니덤프를 만듭니다. SQL Server 클라이언트에서 다음 명령을 실행합니다.

DBCC STACKDUMP

SQL Server 2019의 확장된 기능은 DBCC STACKDUMPSQL Server 2019에 도입된 확장 DBCC STACKDUMP 기능을 참조하세요.

이 메서드를 사용하여 필터링된 덤프를 만들려면 다음 명령을 사용하여 추적 플래그 2551을 켭니다.

DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP

전체 덤프를 만들려면 추적 플래그 2544를 사용합니다.

덤프 파일을 받은 후에는 명령을 DBCC TRACEOFF (<TraceNumber>, -1); 사용하여 추적 플래그를 사용하지 않도록 설정해야 하며, 자체 진단 미니덤프를 더 큰 덤프로 SQL Server 모든 추가 업그레이드를 실수로 방지해야 합니다. 명령 <에서 TraceNumber> 는 이전에 2551 또는 2544와 같이 사용하도록 설정한 추적 플래그입니다. 예를 들면

DBCC TRACEOFF(2551, -1)

활성 상태로 유지되는 추적 플래그를 잘 모르는 경우 다음을 실행할 수 있습니다.

DBCC TRACESTATUS(-1)

빈 결과 집합은 추적 플래그가 활성 상태임을 나타냅니다. 반대로 2551이 여전히 활성 상태이면 다음이 표시됩니다.

TraceFlag 상태 전역 세션
2551 1 1 0

참고

에서 사용하도록 설정된 DBCC TRACEONtraceflag 서비스를 다시 시작한 후 다시 설정(제거)됩니다.

2019년 SQL Server 도입된 확장 DBCC STACKDUMP 기능

SQL Server 2019 CU2부터는 미니, DBCC STACKDUMP 필터링된 전체 덤프 등 다양한 유형의 덤프 생성을 지원하도록 명령이 확장되었습니다. 이 명령은 추적 플래그를 사용할 필요가 없습니다. 또한 메모리 덤프를 사용하여 생성되는 다른 텍스트 파일의 텍스트 출력을 제한할 수 있습니다. 이렇게 하면 메모리 덤프를 생성하는 데 SQLDumper.exe 걸리는 시간에 눈에 띄는 성능 향상을 제공할 수 있습니다.

DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]

TEXT_DUMP = LIMITED 기본 옵션입니다. SQLDump000X.txt 파일에서 자세한 출력을 받으려면 를 사용할 TEXT_DUMP = DETAILED수 있습니다.

.txt 파일에서 제한된 출력으로 필터링된 덤프를 생성하려면 다음 명령을 실행할 수 있습니다.

DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED

PowerShell 스크립트를 사용하여 SQLDumper를 사용하여 덤프 파일을 생성하는 방법

  • 다음 코드를 PS1 파일로 저장합니다(예: SQLDumpHelper.ps1).

    코드 세부 정보

    $isInt = $false
    $isIntValDcnt = $false
    $isIntValDelay = $false
    $SqlPidInt = 0
    $NumFoler = ""
    $OneThruFour = ""
    $SqlDumpTypeSelection = ""
    $SSASDumpTypeSelection = ""
    $SSISDumpTypeSelection = ""
    $SQLNumfolder = 0
    $SQLDumperDir = ""
    $OutputFolder = ""
    $DumpType = "0x0120"
    $ValidPid
    $SharedFolderFound = $false
    $YesNo = ""
    $ProductNumber = ""
    $ProductStr = ""
    
    Write-Host ""
    Write-Host "`******************************************************************"
    Write-Host "This script helps you generate one or more SQL Server memory dumps"
    Write-Host "It presents you with choices on:`
                -target SQL Server process (if more than one)
                -type of memory dump
                -count and time interval (if multiple memory dumps)
    You can interrupt this script using CTRL+C"
    Write-Host "***********************************************************************"
    
    # check for administrator rights
    # debugging tools like SQLDumper.exe require Admin privileges to generate a memory dump
    
    if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
    {
        Write-Warning "Administrator rights are required to generate a memory dump!`nPlease re-run this script as an Administrator!"
        return
    }
    
    # what product would you like to generate a memory dump
    while ($true)
    {
        Write-Host "Which product would you like to generate a memory dump of?" -ForegroundColor Yellow
        Write-Host "1) SQL Server"
        Write-Host "2) SSAS (Analysis Services)"
        Write-Host "3) SSIS (Integration Services)"
        Write-Host "4) SSRS (Reporting Services)"
        Write-Host "5) SQL Server Agent"
        Write-Host ""
        $ProductNumber = Read-Host "Enter 1-5>"
    
        if ($ProductNumber -in 1,2,3,4,5)
        {
            break
        }
        Write-Host "`nPlease enter a valid number from list above!`n"
        Start-Sleep -Milliseconds 300
    }
    
    if ($ProductNumber -eq "1")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlservr*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SQL Server"
    }
    elseif ($ProductNumber -eq "2")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq msmdsrv*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSAS (Analysis Services)"
    }
    elseif ($ProductNumber -eq "3")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq msdtssrvr*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSIS (Integration Services)"
    }
    elseif ($ProductNumber -eq "4")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq reportingservicesservice*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SSRS (Reporting Services)"
    }
    elseif ($ProductNumber -eq "5")
    {
        $SqlTaskList = Tasklist /SVC /FI "imagename eq sqlagent*" /FO CSV | ConvertFrom-Csv
        $ProductStr = "SQL Server Agent"
    }
    
    if ($SqlTaskList.Count -eq 0)
    {
        Write-Host "There are currently no running instances of $ProductStr. Exiting..." -ForegroundColor Green
        break
    }
    
    # if multiple SQL Server instances, get the user to input PID for desired SQL Server
    if ($SqlTaskList.Count -gt 1)
    {
        Write-Host "More than one $ProductStr instance found."
    
        $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host
    
        # check input and make sure it is a valid integer
        while ($true)
        {
            Write-Host "Please enter the PID for the desired SQL service from list above" -ForegroundColor Yellow
            $SqlPidStr = Read-Host ">"
    
            if( $SqlPidStr -in $SqlTaskList.PID)
            {
                $SqlPidInt = [int]$SqlPidStr
                break
            }
        }
    
        Write-Host "Using PID=$SqlPidInt for generating a $ProductStr memory dump" -ForegroundColor Green
        Write-Host ""
    
    }
    else # if only one SQL Server/SSAS on the box, go here
    {
        $SqlTaskList | Select-Object PID, "Image name", Services | Out-Host
        $SqlPidInt = [convert]::ToInt32($SqlTaskList.PID)
    
        Write-Host "Using PID=", $SqlPidInt, " for generating a $ProductStr memory dump" -ForegroundColor Green
        Write-Host ""
    }
    
    # dump type
    
    if ($ProductNumber -eq "1")  # SQL Server memory dump
    {
        # ask what type of SQL Server memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Mini-dump with referenced memory " -NoNewLine; Write-Host "(Recommended)"
            Write-Host "3) Filtered dump " -NoNewline; Write-Host "(Not Recommended)" -ForegroundColor Red
            Write-Host "4) Full dump  " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red
            Write-Host ""
            $SqlDumpTypeSelection = Read-Host "Enter 1-4>"
    
            if ($SqlDumpTypeSelection -in 1,2,3,4)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SqlDumpTypeSelection)
        {
            "1" { $DumpType="0x0120"; break }
            "2" { $DumpType="0x0128"; break }
            "3" { $DumpType="0x8100"; break }
            "4" { $DumpType="0x01100"; break }
            default { "0x0120"; break }
        }
    }
    elseif ($ProductNumber -eq "2")  # SSAS dump
    {
        # ask what type of SSAS memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Full dump  " -NoNewline; Write-Host "(Do Not Use on Production systems!)" -ForegroundColor Red
            Write-Host ""
            $SSASDumpTypeSelection = Read-Host "Enter 1-2>"
    
            if ($SSASDumpTypeSelection -in 1,2)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SSASDumpTypeSelection)
        {
            "1" {$DumpType="0x0";break}
            "2" {$DumpType="0x34";break}
            default {"0x0120"; break}
        }
    }
    elseif ($ProductNumber -in 3,4,5)  # SSIS/SSRS/SQL Agent dump
    {
        # ask what type of SSIS memory dump
        while($true)
        {
            Write-Host "Which type of memory dump would you like to generate?" -ForegroundColor Yellow
            Write-Host "1) Mini-dump"
            Write-Host "2) Full dump"
            Write-Host ""
            $SSISDumpTypeSelection = Read-Host "Enter 1-2>"
    
            if ($SSISDumpTypeSelection -in 1,2)
            {
                break
            }
            Write-Host "`nPlease enter a valid type of memory dump!`n"
            Start-Sleep -Milliseconds 300
        }
    
        Write-Host ""
    
        switch ($SSISDumpTypeSelection)
        {
            "1" { $DumpType="0x0"; break }
            "2" { $DumpType="0x34"; break }
            default { "0x0120"; break }
        }
    }
    
    # Sqldumper.exe PID 0 0x0128 0 c:\temp
    # output folder
    while($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder))
    {
        Write-Host ""
        Write-Host "Where would your like the memory dump stored (output folder)?" -ForegroundColor Yellow
        $OutputFolder = Read-Host "Enter an output folder with no quotes (e.g. C:\MyTempFolder or C:\My Folder)"
        if ($OutputFolder -eq "" -or !(Test-Path -Path $OutputFolder))
        {
            Write-Host "'" $OutputFolder "' is not a valid folder. Please, enter a valid folder location" -ForegroundColor Yellow
        }
    }
    
    # strip the last character of the Output folder if it is a backslash "\". Else Sqldumper.exe will fail
    if ($OutputFolder.Substring($OutputFolder.Length-1) -eq "\")
    {
        $OutputFolder = $OutputFolder.Substring(0, $OutputFolder.Length-1)
        Write-Host "Stripped the last '\' from output folder name. Now folder name is  $OutputFolder"
    }
    
    # find the highest version of SQLDumper.exe on the machine
    $NumFolder = dir "C:\Program Files\Microsoft SQL Server\1*" | Select-Object @{name = "DirNameInt"; expression={[int]($_.Name)}}, Name, Mode | Where-Object Mode -Match "da*" | Sort-Object DirNameInt -Descending
    
    for( $j=0; $j -lt $NumFolder.Count; $j++)
    {
        $SQLNumfolder = $NumFolder.DirNameInt[$j]   # start with the highest value from sorted folder names - latest version of dumper
        $SQLDumperDir = "C:\Program Files\Microsoft SQL Server\" + $SQLNumfolder.ToString() + "\Shared\"
        $TestPathDumperDir = $SQLDumperDir + "sqldumper.exe"
    
        if (Test-Path -Path $SQLDumperDir)
        {
            break
        }
    }
    
    # build the SQLDumper.exe command e.g. (Sqldumper.exe 1096 0 0x0128 0 c:\temp\)
    
    $cmd = "$([char]34)"+$SQLDumperDir + "sqldumper.exe$([char]34)"
    $arglist = $SqlPidInt.ToString() + " 0 " +$DumpType +" 0 $([char]34)" + $OutputFolder + "$([char]34)"
    Write-Host "Command for dump generation: ", $cmd, $arglist -ForegroundColor Green
    
    # do-we-want-multiple-dumps section
    Write-Host ""
    Write-Host "This utility can generate multiple memory dumps, at a certain interval"
    Write-Host "Would you like to collect multiple memory dumps (2 or more)?" -ForegroundColor Yellow
    
    # validate Y/N input
    while ($true)
    {
        $YesNo = Read-Host "Enter Y or N>"
    
        if ($YesNo -in "y","n")
        {
            break
        }
        Write-Host "Not a valid 'Y' or 'N' response"
    }
    
    # get input on how many dumps and at what interval
    if ($YesNo -eq "y")
    {
        [int]$DumpCountInt=0
        while (1 -ge $DumpCountInt)
        {
            Write-Host "How many dumps would you like to generate for this $ProductStr ?" -ForegroundColor Yellow
            $DumpCountStr = Read-Host ">"
    
            if ([int]::TryParse($DumpCountStr, [ref]$DumpCountInt) -and $DumpCountInt -gt 1)
            {
                break
            }
            Write-Host "Please enter a number greater than one." -ForegroundColor Red
        }
    
        [int]$DelayIntervalInt=0
        while ($true)
        {
            Write-Host "How frequently (in seconds) would you like to generate the memory dumps?" -ForegroundColor Yellow
            $DelayIntervalStr = Read-Host ">"
    
            if ([int]::TryParse($DelayIntervalStr, [ref]$DelayIntervalInt) -and $DelayIntervalInt -gt 0)
            {
                break
            }
            Write-Host "Please enter a number greater than zero." -ForegroundColor Red
        }
    
        Write-Host "Generating $DumpCountInt memory dumps at a $DelayIntervalStr-second interval" -ForegroundColor Green
    
        # loop to generate multiple dumps
        $cntr = 0
        while ($true)
        {
            Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist
            $cntr++
    
            Write-Host "Generated $cntr memory dump(s)." -ForegroundColor Green
    
            if ($cntr -ge $DumpCountInt)
            {
                break
            }
            Start-Sleep -S $DelayIntervalInt
        }
    
        # print what files exist in the output folder
        Write-Host ""
        Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green
        $MemoryDumps = $OutputFolder + "\SQLDmpr*"
        Get-ChildItem -Path $MemoryDumps
    
        Write-Host ""
        Write-Host "Process complete"
    }
    else # produce just a single dump
    {
        Start-Process -FilePath $cmd -Wait -Verb runAs -ArgumentList $arglist
    
        # print what files exist in the output folder
        Write-Host ""
        Write-Host "Here are all the memory dumps in the output folder '$OutputFolder'" -ForegroundColor Green
        $MemoryDumps = $OutputFolder + "\SQLDmpr*"
        Get-ChildItem -Path $MemoryDumps
    
        Write-Host ""
        Write-Host "Process complete"
    }
    
    Write-Host "For errors and completion status, review SQLDUMPER_ERRORLOG.log created by SQLDumper.exe in the output folder '$OutputFolder'.`nOr if SQLDumper.exe failed, look in the folder from which you are running this script."
    
  • 다음 명령을 사용하여 명령 프롬프트에서 관리자 권한으로 실행합니다.

    Powershell.exe -File SQLDumpHelper.ps1
    
  • 또는 Windows PowerShell 콘솔에서 실행하고 다음 명령을 사용하여 관리자 권한으로 실행합니다.

    .\SQLDumpHelper.ps1
    

참고

시스템에서 PowerShell 스크립트를 실행한 적이 없는 경우 다음 오류 메시지가 표시될 수 있습니다.

"이 시스템에서 스크립트를 실행할 수 없으므로 파일 ...SQLDumpHelper.ps1 로드할 수 없습니다."

다음 단계에 따라 실행할 수 있는 기능을 사용하도록 설정해야 합니다.

  1. 관리자 권한으로 실행 옵션을 사용하여 Windows PowerShell 콘솔을 시작합니다. 컴퓨터의 관리자 그룹 구성원만 실행 정책을 변경할 수 있습니다.

  2. 다음 명령을 사용하여 서명되지 않은 스크립트 실행을 사용하도록 설정합니다.

    Set-ExecutionPolicy RemoteSigned
    

    참고

    이렇게 하면 로컬 컴퓨터에서 만든 서명되지 않은 스크립트와 인터넷에서 서명된 스크립트를 실행할 수 있습니다.