Используйте средство Sqldumper.exe для создания файла дампа в SQL Server

В этой статье приводятся общие рекомендации по средству Sqldumper.exe, который входит в состав SQL Server. Это средство используется для создания различных типов файлов дампа.

Исходная версия продукта: SQL Server 2019 г., SQL Server 2017 г., SQL Server 2016 г., SQL Server 2014 г., SQL Server 2012 г., SQL Server 2008 г., SQL Server 2005 г.
Исходный номер базы знаний: 917825

Сводка

Средство Sqldumper.exe входит в состав Microsoft SQL Server. Он создает файлы дампа памяти SQL Server и связанных процессов для отладки. В этой статье описывается, как использовать Sqldumper.exe для создания файла дампа для отчетов об ошибках Или задач отладки Watson.

В этой статье также описаны два других метода создания файлов дампа:

  • Подключенный скрипт PowerShell автоматизирует SQLDumper.exe параметры командной строки.
  • Для создания файла дампа в SQL Server можно использовать команду TRANSACT-SQL (T-SQL) DBCC STACKDUMP.

Запуск Sqldumper.exe вручную

Запустите средство Sqldumper.exe в контексте папки, в которой SQL Server изначально установлено средство.

По умолчанию путь установки Sqldumper.exe — <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe. Обратите внимание, что <диск> SQLServerInstall — это заполнитель для диска, на котором вы установили SQL Server.

Чтобы создать файл дампа с помощью средства Sqldumper.exe, выполните следующие действия.

  1. Откройте <sqlServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared folder.

    В этом пути к папке <число> является заполнителем для одного из следующих значений:

    • 150 за SQL Server 2019
    • 140 за SQL Server 2017
    • 130 за SQL Server 2016
    • 120 за SQL Server 2014
    • 110 за SQL Server 2012
    • 100 за SQL Server 2008
    • 90 за SQL Server 2005
  2. Убедитесь, что файлDbghelp.dll находится в этой папке.

  3. Нажмите кнопку Запустить>выполнение, введите cmd и нажмите кнопку ОК.

  4. В командной строке введите следующую команду и нажмите клавишу ВВОД:

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

    Примечание.

    В этом пути к папке число> — это тот же заполнитель, <который изменяется с версией SQL Server, как описано ранее.

  5. Чтобы создать файл дампа определенного типа, введите соответствующую команду в командной строке и нажмите клавишу ВВОД:

    • Полный файл дампа:

      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 существует главным образом для создания файлов дампа памяти для процесса SQL Server в сценариях, в которых дамп памяти необходим для решения конкретных проблем (например, исключений, утверждений, планировщиков, не являющихся результатом). В таких случаях SQL Server вызывает SQLDumper.exe для создания файла дампа памяти своего процесса. По умолчанию файл дампа памяти хранится в каталоге ЭКЗЕМПЛЯРа SQL MSSQL\LOG\ .

Изменение пути по умолчанию

Например, если размер файла дампа слишком велик, можно изменить путь, выполнив следующие действия:

  1. Откройте диспетчер конфигурации SQL Server.
  2. В разделе Службы SQL Server найдите исследуемого экземпляра SQL Server.
  3. Щелкните запись правой кнопкой мыши, выберите Свойства и перейдите на вкладку Дополнительно .
  4. Измените каталог дампа на нужный путь и нажмите кнопку ОК.
  5. Перезапустите SQL Server (если это возможно), чтобы новый параметр вступил в силу.

Если средство Sqldumper.exe используется вручную для создания файла дампа для любого приложения Windows, размер файла дампа может быть таким же, как и объем памяти, используемой приложением Windows в настоящее время. Убедитесь, что на диске, на который Sqldumper.exe записывается файл дампа, достаточно места на диске.

Указание пользовательской выходной папки в команде

Вы можете указать каталог, в который средство Sqldumper.exe будет записывать файл дампа. Каталог должен существовать перед запуском Sqldumper.exe. В противном случае Sqldumper.exe завершится ошибкой. Не используйте UNC-путь в качестве расположения для файла дампа. Ниже приведен пример указания расположения файла дампа для файла мини-дампа.

  1. Нажмите кнопку Запустить>выполнение, введите cmd и нажмите кнопку ОК.

  2. В командной строке введите следующую команду и нажмите клавишу ВВОД:

    cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
    
  3. В командной строке введите следующую команду и нажмите клавишу ВВОД:

    Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
    

    Примечание.

    <MdumpPath> — это заполнитель для каталога, в который средство Sqldumper.exe записывает файл дампа. По умолчанию файл записывается в текущую папку.

Если указать полный файл дампа или файл отфильтрованного дампа для создания, Sqldumper.exe может потребоваться несколько минут. Затраченное время зависит от следующих переменных:

  • Объем памяти, который в настоящее время используетсяSqlservr.exe .
  • Скорость диска, на который средство записывает файл дампа.

В течение этого времени средство Sqldumper.exe не будет обрабатывать команды. Вы заметите, что сервер перестал отвечать на запросы. Кроме того, может произойти отработка отказа кластера.

Требования к разрешениям

Чтобы запустить Sqldumper.exe, войдите в Windows одним из следующих методов:

  • Используйте учетную запись, которая является членом группы администратора на компьютере.
  • Используйте ту же учетную запись пользователя, под которой запущена служба SQL Server.

Чтобы средство Sqldumper.exe успешно работало через удаленный рабочий стол или службы терминалов, необходимо запустить удаленный рабочий стол или службы терминалов в режиме консоли. Например, чтобы запустить удаленный рабочий стол в режиме консоли, выберите Запустить>, введите mstsc /console и нажмите кнопку ОК. Если целевой сервер работает под управлением Windows 2000, параметр /console автоматически игнорируется. Вы можете подключиться к серверу через удаленный рабочий стол, но не будете использовать сеанс консоли.

Если вы заметили, что после выполнения Sqldumper.exe в текущей папке не создан файл дампа, просмотрите сведения, созданные средством в командной строке, чтобы определить возможную причину сбоя. Эти сведения также регистрируются в Sqldumper_errorlog.log файле в текущем каталоге. Ниже приведены два возможных сообщения об ошибках и их причины.

Сообщение Причина
"Сбой OpenProcess 0x57 — неправильный параметр" В служебную программу Sqldumper.exe передан недопустимый идентификатор процесса.
"Недопустимое значение для идентификатора потока — <ошибка недопустимого параметра> " В служебную программу Sqldumper.exe передан недопустимый параметр.

Если создается сообщение об ошибке, похожее на одно из указанных ниже, это сообщение можно игнорировать.

  • "Неизвестный тип обратного вызова во время minidump 6"
  • "Неизвестный тип обратного вызова во время minidump 7"

Влияние создания дампа

При запросе файла дампа процесса пользовательского режима (как описано в этой статье, в отличие от дампов ядра операционной системы, которые находятся за пределами нашего область), целевой процесс (здесь SQLServer.exe) зависает на время, необходимое для сериализации содержимого дампа в целевой файл.

Замороженный означает, что процесс не сможет выполнить ни один запрос пользователя или любую внутреннюю операцию, включая механизм опроса ресурсов, например реализацию isAlive и Looks Alive кластеризации Windows (дополнительные сведения о том, как справиться с этой ситуацией, см. в разделе Дампы памяти при отработке отказа кластера ). Любое время ожидания, которое зависит от времени настенных часов, также может быть нарушено из-за замораживания.

Как можно последовать из предыдущего утверждения, таким образом, критически важным фактором здесь является длительность заморозки, и она определяется следующими факторами:

  • Выбранный тип дампа.
  • Размер SQL Server процесса в памяти, который в случае одного активного экземпляра с параметрами по умолчанию часто близок к общему физическому ОЗУ сервера.
  • Производительность диска, используемого в качестве целевого объекта для дампа.

Кроме того, следует запланировать размер файла дампа на диске, особенно если возможно несколько дампов и если выбраны большие типы дампов, отличные от стандартных. Проверьте типы дампов , чтобы узнать, чего ожидать. По умолчанию некоторые методы дампа создают дамп в папке \Log экземпляра SQL Server, которая в простой конфигурации по умолчанию также будет системным диском и диском данных и журналов для SQL Server. Насыщенность этого диска будет иметь серьезные последствия для SQL Server и (или) доступности системы.

Управление воздействием на кластеризованные системы

Процесс временно приостанавливается во время создания дампа. Это может повлиять на доступность службы SQL Server и запуск отработки отказа ресурсов в Always On контекстах (экземпляр отказоустойчивого кластера и группа доступности). Создание дампа различных процессов влияет на ресурсы по-разному. Внимательно ознакомьтесь с разделами Влияние создания дампа и Типы дампов .

При записи дампа SQL Server в экземпляре отказоустойчивой кластеризации или экземпляре группы доступности (AG) SQL Server кластеризованный SQL Server или группы доступности может выполнить отработку отказа на другой узел, если выполнение дампа занимает слишком много времени. Это может быть особенно проблематично в системах, использующих очень большие объемы ОЗУ, или при создании отфильтрованного или полного дампа памяти. Чтобы предотвратить отработку отказа, используйте следующие параметры перед записью файла дампа. Изменение можно отменить после создания файла дампа:

  • Для отказоустойчивого кластеризованного экземпляра (FCI):
    • Щелкните правой кнопкой мыши SQL Server ресурс в администраторе кластера и выберите в случае сбоя ресурса не перезапускать на вкладке Политики.
    • На вкладке Свойства увеличьте время ожидания Проверки работоспособности. Например, задайте для свойства значение 180 секунд или выше. Если это время ожидания достигнуто, политика Если ресурс завершается сбоем, не перезапускать будет игнорироваться, и ресурс будет перезапущен в любом случае.
    • На вкладке Свойства измените значение FailureConditionLevel на ноль.
  • Для группы доступности примените все следующие параметры:
    • Увеличьте время ожидания сеанса, например 120 секунд для всех реплик. В SQL Server Management Studio (SSMS) щелкните правой кнопкой мыши реплика, который необходимо настроить, и выберите пункт Свойства. Измените поле Время ожидания сеанса (в секундах) на 120 секунд. Дополнительные сведения см. в разделе Изменение периода Session-Timeout для реплики доступности (SQL Server).
    • Измените автоматическую отработку отказа всех реплик на отработку отказа вручную. В SSMS щелкните правой кнопкой мыши реплика, выберите Свойства и измените автоматическую отработку отказа всех реплик на отработку отказа вручную на вкладке Свойства. Дополнительные сведения см. в разделе Изменение режима отработки отказа реплики доступности (SQL Server).
    • Увеличьте значение LeaseTimeout до 60 000 мс (60 секунд) и измените значение HealthCheckTimeout на 90 000 мс (90 секунд). В разделе Администратор кластера щелкните правой кнопкой мыши ресурс группы доступности, выберите Свойства, а затем перейдите на вкладку Свойства , чтобы изменить оба параметра. Дополнительные сведения см. в разделе Настройка параметров свойств 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 с пакетом обновления 2 (SP2) с накопительным пакетом обновления 13 (CU13), фильтрация растровых изображений включена по умолчанию.

  • SQL Server 2017

    • Это недоступно в RTM до CU15.
    • В SQL Server 2017 CU16 можно включить фильтрацию растровых изображений с помощью T8089 и отключить ее, отключив T8089.
    • Начиная с SQL Server 2017 CU20 фильтрация растровых изображений включена по умолчанию. Флаг трассировки T8089 больше не будет применяться и будет игнорироваться, если он включен. Фильтрацию растровых изображений можно отключить с помощью T8095.
  • SQL Server 2019

    Это включено по умолчанию в SQL Server RTM 2019. Его можно отключить с помощью T8095.

Устранение повторяющегося дампа по той же проблеме

Повторяющиеся дампы памяти при одной и той же проблеме устраняются. С помощью сигнатуры стека подсистема SQL отслеживает наличие исключения и не создает новый дамп памяти, если он уже есть. Это относится к нарушениям доступа, переполнению стека, утверждениям и исключениям повреждения индекса. Это значительно сокращает объем дискового пространства, используемого дампами памяти, и не замораживает процесс создания дампа временно. Это было добавлено в SQL Server 2019 году.

Сокращенные выходные данные в журнале ошибок

Содержимое, созданное в журнале ошибок SQL Server из одного дампа памяти, может не только быть слишком большим, но и замедлить процесс создания дампа памяти из-за времени, необходимого для сериализации всех этих сведений в текстовом формате в журнале ошибок. В SQL Server 2019 г. содержимое, хранящееся в журнале ошибок при создании дампа, значительно сократилось и может выглядеть следующим образом:

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 печатали сведения для каждого сеанса или потока, например, когда пользователь активировал дамп вручную.

Параллельное сжатие дампов памяти

Чтобы быстрее создавать дампы и уменьшать их размер, в SQL Server 2022 cu8 и SQL Server 2019 CU23 появилась функция дампа сжатой памяти. При активации Sqldumper.exe создает несколько потоков для одновременного считывания памяти процесса, сжимает ее, а затем сохраняет в файле дампа. Это многопоточное параллельное сжатие уменьшает размер файла и ускоряет процесс дампа при использовании с полными и отфильтрованными дампами.

Вы можете включить флаг трассировки 2610, чтобы включить сжатый дамп памяти:

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

Кроме того, можно добавить -T2610 в качестве параметра запуска экземпляр SQL Server, чтобы он всегда создавал сжатые дампы памяти.

При выполнении Sqldumper.exe вручную можно использовать -zdmp параметр для записи сжатого дампа памяти. Например:

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

Можно также ограничить количество ядер, Sqldumper.exe можно использовать для создания сжатого дампа с помощью -cpu:X параметра , где X — это количество ЦП. Этот параметр доступен только при выполнении Sqldumper.exe вручную из командной строки:

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

Факторы, которые предотвращают или задерживают создание дампов памяти

Известно, что следующие факторы вызывают задержки или препятствуют созданию дампов памяти.

  • Путь ввода-вывода, в который записываются дампы памяти, работает плохо. В таких случаях следующим логическим шагом является изучение и разрешение производительности операций ввода-вывода диска.
  • Антивирусная программа или другое программное обеспечение для мониторинга мешает SQLDumper.exe. В некоторых случаях стороннее программное обеспечение объездает функцию ReadProcessMemory . Это может значительно увеличить длительность дампа. Чтобы устранить большинство этих проблем, отключите мешающее программное обеспечение или добавьте SQLDumper.exe в список исключений.

Типы дампов

Для создания трех различных типов дампов можно использовать следующие методы: мини-дампы, полные дампы и отфильтрованные дампы.

Мини-дампы с указанной памятью

Этот тип дампа памяти является snapshot всех активных потоков процесса ("стеков потоков"), а также ограниченное извлечение памяти, на которую ссылаются стеки потоков и некоторые другие ключевые процессы или данные потока. Обычно они имеют размер в несколько мегабайт и быстро создаются (от менее чем за секунду до нескольких секунд). Даже более крупные серверные системы (с сотнями ЦП, косвенно управляя огромным количеством потоков в SQL Server процессе) редко превышают 20–30 МБ: размер мини-дампа не увеличивается с размером SQL Server процесса. Этот тип дампа является типом по умолчанию, используемым SQL Server при автоматическом создании дампов памяти для исключений, проблем планировщика, проблем с блокировкой, повреждения базы данных, утверждений.

Примечание.

SQL Server в рамках встроенного инструментирования будет создавать автоматические "диагностические мини-дампы" в некоторых конкретных ситуациях. Поэтому эта операция считается достаточно безопасной, что SQL Server может активировать ее автоматически при необходимости.

Полные дампы

Полный дамп памяти — это полная копия активного целевого пространства процесса. Таким образом, это будет включать все состояние потока, всю выделенную процессом память и все загруженные модули. Таким образом, полные дампы будут иметь размер, который примерно совпадает с размером SQL Server процесса, который, в свою очередь, может быть почти таким же, как и общий объем системной памяти. На больших серверах, выделенных для одного экземпляра SQL Server, это может означать файл, который составляет несколько сотен гигабайт или более. Излишне говорить, что такой файл займет много времени для создания и, следовательно, вызовет длительную замораживание. Производительность диска для целевого файла дампа значительно повлияет на время замораживания. Этот тип дампа редко используется для SQL Server в настоящее время, как описано в следующем объяснении.

Отфильтрованные дампы

По мере того как размер ОЗУ на обычных серверах, работающих SQL Server, неуклонно увеличивается, полные дампы становятся все более громоздкими. Поэтому реализованы отфильтрованные дампы. Отфильтрованный дамп — это подмножество полного дампа, где большие области SQL Server памяти исключаются на лету и не записываются на диск. Как правило, исключенная память не приносит дополнительных значений для устранения неполадок. Примерами являются страницы данных и индексов и некоторые внутренние кэши, такие как страницы данных Hekaton и память пула журналов. Этот отфильтрованный дамп приводит к тому, что файл меньше, чем полный, но он по-прежнему сохраняет почти всю свою полезность. Отфильтрованные дампы заменили полные дампы в качестве предпочтительного варианта в подавляющем большинстве ситуаций, когда мини-дампов недостаточно. Уменьшение размера может отличаться по сравнению с полным дампом, но это по-прежнему довольно большой файл, который часто составляет 30–60 % от SQL Server размера процесса. Поэтому лучше всего планировать возможный размер как большой, как полный свал, как худший вариант, который оставляет хороший запас безопасности. В каждом случае отфильтрованный дамп не обязательно будет создаваться быстрее, чем полный дамп: вопрос о том, превышает ли выигрыш, связанный с количеством избежать операций ввода-вывода, время, необходимое для реализации логики фильтра (скорость диска и скорость ЦП/ОЗУ будет влиять на это).

Вы можете использовать следующий запрос, чтобы получить приблизительную оценку размера отфильтрованного дампа. Хотя ожидается, что большинство страниц данных или индексов будут исключены из дампа, те страницы, которые исключительно блокируются и изменяются, не будут пропущены.

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 создаст полный дамп памяти.

Создание дампа памяти при отработке отказа кластера

В сценариях отработки отказа кластера библиотека DLL ресурса SQL Server может получить файл дампа до отработки отказа для устранения неполадок. Когда библиотека DLL ресурса SQL Server определяет, что ресурс SQL Server завершился сбоем, библиотека DLL ресурса SQL Server использует служебную программу Sqldumper.exe для получения файла дампа SQL Server процесса. Чтобы убедиться, что средство Sqldumper.exe успешно создало файл дампа, необходимо задать следующие три свойства в качестве необходимых компонентов:

  • SqlDumperDumpTimeOut

    Указанное пользователем время ожидания. Библиотека DLL ресурса ожидает завершения файла дампа, прежде чем библиотека DLL ресурса остановит службу SQL Server.

  • SqlDumperDumpPath

    Расположение, в котором средство Sqldumper.exe создает файл дампа.

  • SqlDumperDumpFlags

    Флаги, которые Sqldumper.exe использует.

Если какое-либо из свойств не задано, Sqldumper.exe не сможет создать файл дампа. Предупреждающее сообщение будет регистрироваться как в журнале событий, так и в журнале кластера каждый раз, когда ресурс будет подключен к сети.

Конфигурация кластера для SQLDumper в SQL Server 2012 и более поздних версиях

Для изменения этих свойств можно использовать ALTER SERVER CONFIGURATION команду (T-SQL). Например:

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. Например, для именованного экземпляра 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

Конфигурация кластера для SQLDumper в SQL Server 2008/2008 R2 или Windows 2012 и более ранних версиях

Чтобы задать свойства служебной программы Sqldumper.exe для отработки отказа кластера с помощью команды ресурса кластера , выполните следующие действия.

  1. Нажмите кнопку Запустить>выполнение, введите cmd и нажмите кнопку ОК.
  2. Для каждого свойства введите соответствующую команду в командной строке и нажмите клавишу ВВОД:
    • Свойство SqlDumperDumpFlags.

      Чтобы задать SqlDumperDumpFlags свойство для файла дампа определенного типа, введите соответствующую команду в командной строке и нажмите клавишу ВВОД:

      • Файл дампа полного потока

        • Экземпляр по умолчанию

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
          
        • Именованный экземпляр

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
          
      • Файл мини-дампа всех потоков

        • Экземпляр по умолчанию

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
          
        • Именованный экземпляр

          cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
          
      • Отфильтрованный файл дампа всех потоков

        • Экземпляр по умолчанию

          cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
          
        • Именованный экземпляр

          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 000 мс до MAXDWORD. MAXDWORD представляет наибольшее значение в диапазоне типа данных DWORD (4294967295).

Чтобы убедиться, что параметры включены, выполните следующую команду:

cluster resource "SQL Server" /priv

Удаление свойств Sqldumper.exe для отработки отказа кластера

Чтобы удалить свойства средства Sqldumper.exe для отработки отказа кластера, выполните следующие действия.

  1. Нажмите кнопку Запустить>выполнение, введите cmd и нажмите кнопку ОК.
  2. Для определенного свойства введите соответствующую команду в командной строке и нажмите клавишу ВВОД:
    • Свойство SqlDumperDumpFlags.

      • Экземпляр по умолчанию

          cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
        
      • Именованный экземпляр

          cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
        
    • Свойство SqlDumperDumpPath.

      • Экземпляр по умолчанию

        cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
        
      • Именованный экземпляр

        cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
        
    • Свойство SqlDumperDumpTimeOut.

      • Экземпляр по умолчанию

        cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
        
      • Именованный экземпляр

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

Использование DBCC STACKDUMP

Команда DBCC STACKDUMP поможет создать дамп памяти в каталоге LOG установки экземпляра SQL Server. Команда по умолчанию создает минидамп со всеми потоками, размер которого ограничен и достаточно для отражения состояния SQL Server процесса. Выполните следующую команду в клиенте SQL Server:

DBCC STACKDUMP

Дополнительные функциональные DBCC STACKDUMP возможности в SQL Server 2019 г. см. в статье Расширенные функции DBCC STACKDUMP, представленные в SQL Server 2019 г.

Чтобы включить этот метод для создания отфильтрованного дампа, включите флаги трассировки 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

Примечание.

Объект , traceflag включенный параметром DBCC TRACEON , сбрасывается (удаляется) после перезапуска службы.

Расширенные функции DBCC STACKDUMP, представленные в SQL Server 2019 г.

Начиная с 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
    

    Примечание.

    Это позволит выполнять неподписанные скрипты, создаваемые на локальном компьютере, и подписанные скрипты из Интернета.