Поделиться через


Создание файла дампа в SQL Server с помощью средства Sqldumper.exe

В этой статье приведены общие рекомендации по средству 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 и активировать отработку отказа ресурсов в контекстах AlwaysOn (экземпляр отказоустойчивого кластера и группа доступности). Создание дампа различных процессов влияет на ресурсы по-разному. Внимательно ознакомьтесь с разделами Влияние создания дампа и Типы дампов .

При записи дампа SQL Server в экземпляре отказоустойчивой кластеризации или экземпляре группы доступности 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 2019 RTM. Его можно отключить с помощью 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 в список исключений.

Типы дампов

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

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

Этот тип дампа памяти представляет собой моментальный снимок всех активных потоков процесса ("стеков потоков"), а также ограниченное извлечение памяти, на которую ссылаются стеки потоков и некоторые другие ключевые данные процесса или потока. Обычно они имеют размер в несколько мегабайт и быстро создаются (от менее чем за секунду до нескольких секунд). Даже более крупные серверные системы (с сотнями ЦП, косвенно управляя большим количеством потоков в процессе 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
    

    Примечание.

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