Создание файла дампа в 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 для создания файла дампа для задач создания отчетов об ошибках Или отладки Вотсон.
В статье также описаны два других метода создания файлов дампа:
- Подключенный скрипт PowerShell автоматизирует SQLDumper.exe параметры командной строки.
- Команда DBCC STACKDUMP Transact-SQL (T-SQL) может использоваться для создания файла дампа в SQL Server.
Запуск Sqldumper.exe вручную
Запустите средство Sqldumper.exe в контексте папки, в которой SQL Server первоначально установил средство.
По умолчанию путь установки Sqldumper.exe — <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe. Обратите внимание, что <SQLServerInstall Drive> является заполнителем для диска, на котором установлен SQL Server.
Чтобы создать файл дампа с помощью средства Sqldumper.exe, выполните следующие действия:
Откройте <диск> SQLServerInstall:\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
Убедитесь, что файл Dbghelp.dll находится в этой папке.
Нажмите кнопку "Запустить">, введите cmd и нажмите кнопку "ОК".
В командной строке введите следующую команду и нажмите клавишу ВВОД:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
Примечание.
В этом пути <к папке номер> совпадает с заполнителем, изменяющим версию SQL Server, как описано ранее.
Чтобы создать определенный тип файла дампа, введите соответствующую команду в командной строке и нажмите клавишу ВВОД:
Полный файл дампа:
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, для которого требуется создать файл дампа. Вот как получить идентификатор процесса:
- Нажмите клавиши CTRL+ALT+DELETE и выберите диспетчер задач.
- В диалоговом окне диспетчера задач Windows перейдите на вкладку "Процессы".
- В меню "Вид" выберите "Выбрать столбцы".
- В диалоговом окне "Выбор столбцов" установите флажок PID (Идентификатор процесса) и нажмите кнопку "ОК".
- Обратите внимание на идентификатор процесса приложения Windows, для которого требуется создать файл дампа. Для приложения SQL Server обратите внимание на идентификатор процесса Sqlservr.exe процесса.
- Закройте диспетчер задач.
Кроме того, используйте файл журнала ошибок 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 для создания файла дампа памяти процесса. По умолчанию файл дампа памяти хранится в каталоге MSSQL\LOG\ экземпляра SQL.
Изменение пути по умолчанию
Например, если размер файла дампа слишком велик, можно изменить путь, выполнив следующие действия.
- Откройте Диспетчер конфигурации SQL Server.
- В службах SQL Server найдите экземпляр SQL Server, который находится под расследованием.
- Щелкните эту запись правой кнопкой мыши, выберите "Свойства" и перейдите на вкладку "Дополнительно ".
- Измените каталог дампа на нужный путь и нажмите кнопку "ОК".
- Перезапустите SQL Server (по возможности), чтобы новый параметр вступил в силу.
Если средство Sqldumper.exe используется вручную для создания файла дампа для любого приложения Windows, файл дампа может быть как большой, так как в настоящее время используется приложение Windows. Убедитесь, что на диске доступно достаточно места на диске, на котором Sqldumper.exe записывает файл дампа.
Указание пользовательской папки вывода в команде
Вы можете указать каталог, в котором нужно, чтобы средство Sqldumper.exe записывал файл дампа. Каталог уже должен существовать перед запуском Sqldumper.exe. В противном случае Sqldumper.exe завершается ошибкой. Не используйте UNC-путь (соглашение об именовании универсального имени) в качестве расположения для файла дампа. Ниже приведен пример указания расположения файла мини-дампа:
Нажмите кнопку "Запустить">, введите cmd и нажмите кнопку "ОК".
В командной строке введите следующую команду и нажмите клавишу ВВОД:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
В командной строке введите следующую команду и нажмите клавишу ВВОД:
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 в кластере Windows (см . раздел "Дампы памяти" в разделе отработки отказа кластера, чтобы получить подробные сведения о том, как справиться с этой ситуацией). Любое время ожидания, которое зависит от времени на стены часов, также может быть нарушено из-за заморозки.
На основе предыдущей инструкции длительность замораживания является критически важным фактором здесь, на основе следующих факторов:
- Выбранный тип дампа .
- Размер процесса SQL Server в памяти, который в случае одного активного экземпляра, выполняющего параметры по умолчанию, часто близко к общему физическому ОЗУ сервера.
- Производительность диска, используемого в качестве целевого объекта для дампа.
Кроме того, следует запланировать размер файла дампа на диске, особенно если несколько дампов являются возможностью и если выбраны большие типы дампов, отличные от по умолчанию. Проверьте типы дампов , чтобы узнать, что ожидать. По умолчанию некоторые методы дампа создают дампа в папке \Log экземпляра SQL Server, которая по умолчанию также будет системным диском и диском журнала для SQL Server. Приведение этого диска к насыщенности оказывает серьезное влияние на доступность SQL Server и (или) системы.
Управление воздействием на кластеризованные системы
Процесс временно приостановлен во время создания дампа. Это может повлиять на доступность службы SQL Server и активировать отработку отказа ресурсов в контекстах AlwaysOn (как экземпляр отказоустойчивого кластера, так и группу доступности). Создание дампа различных процессов влияет на ресурсы по-разному. Внимательно ознакомьтесь с разделами о влиянии создания дампа и типов дампа.
При записи дампа SQL Server на отказоустойчивом кластеризованном экземпляре или экземпляре группы доступности SQL Server кластеризованный SQL Server или группа доступности может выполнить отработку отказа на другой узел, если дамп занимает слишком много времени. Это может быть особенно проблематично в системах, использующих большие объемы ОЗУ или при создании отфильтрованного или полного дампа памяти. Чтобы предотвратить отработку отказа, используйте следующие параметры перед записью файла дампа. Изменение можно отменить после выполнения файла дампа:
- Для отказоустойчивого кластеризованного экземпляра (FCI):
- Щелкните правой кнопкой мыши ресурс SQL Server в администраторе кластера, выберите "Если ресурс завершается сбоем", не перезапустить на вкладке "Политики".
- На вкладке "Свойства" увеличьте время ожидания HealthCheck. Например, задайте для свойства значение 180 секунд или выше. Если это время ожидания достигнуто, политика , если ресурс завершается ошибкой, не перезапускается и ресурс перезапускается.
- На вкладке "Свойства" измените значение FailureConditionLevel на нулевое.
- Для группы доступности примените все следующие параметры:
- Увеличьте время ожидания сеанса, например, 120 секунд для всех реплик. В SQL Server Management Studio (SSMS) щелкните правой кнопкой мыши реплику, чтобы настроить, и выберите пункт "Свойства". Измените время ожидания сеанса (секунды) на 120 секунд. Дополнительные сведения см. в разделе "Изменение периода ожидания сеанса" для реплики доступности (SQL Server).
- Измените автоматическую отработку отказа всех реплик на отработку отказа вручную. В SSMS щелкните правой кнопкой мыши реплику, выберите "Свойства" и измените автоматическую отработку отказа всех реплик на отработку отказа вручную на вкладке "Свойства". Дополнительные сведения см. в разделе "Изменение режима отработки отказа" реплики доступности (SQL Server).
- Увеличьте Время аренды до 60 000 мс (60 секунд) и измените HealthCheckTimeout на 90 000 мс (90 секунд). В администраторе кластера щелкните правой кнопкой мыши ресурс группы доступности, выберите "Свойства", а затем перейдите на вкладку "Свойства ", чтобы изменить оба параметра. Дополнительные сведения см. в разделе Configure HealthCheckTimeout Property Settings.
Улучшения продукта для снижения влияния на 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 (SP2) фильтрация растровых карт включена по умолчанию.
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. В некоторых случаях сторонний программный компонент detour 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 завершился сбоем, она использует служебную программу 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 для отработки отказа кластера с помощью команды ресурса кластера, выполните следующие действия.
- Нажмите кнопку "Запустить">, введите cmd и нажмите кнопку "ОК".
- Для каждого свойства введите соответствующую команду в командной строке и нажмите клавишу ВВОД:
Свойство
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 для отработки отказа кластера, выполните следующие действия.
Нажмите кнопку "Запустить">, введите cmd и нажмите кнопку "ОК".
Для определенного свойства введите соответствующую команду в командной строке и нажмите клавишу ВВОД:
Свойство
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
Дополнительные возможности в SQL Server 2019 см. в статье Расширенные функции DBCC STACKDUMP
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, так как запущенные скрипты отключены в этой системе".
Чтобы включить возможность выполнения команд, выполните следующие действия.
Запустите консоль Windows PowerShell с помощью параметра "Запуск от имени администратора ". Только члены группы администраторов на компьютере могут изменить политику выполнения.
Включите выполнение неподписанных скриптов с помощью следующей команды:
Set-ExecutionPolicy RemoteSigned
Примечание.
Это позволит запускать неподписанные скрипты, создаваемые на локальном компьютере и подписанные скрипты из Интернета.