Utilizar a ferramenta Sqldumper.exe para gerar um ficheiro de informação de falha de sistema no SQL Server
Este artigo fornece diretrizes gerais para a ferramenta Sqldumper.exe que está incluída no SQL Server. Esta ferramenta é utilizada para gerar diferentes tipos de ficheiros de informação de falha de sistema.
Versão original do produto: SQL Server 2019, SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012, SQL Server 2008, SQL Server 2005
Número original da BDC: 917825
Resumo
A ferramenta Sqldumper.exe está incluída no Microsoft SQL Server. Gera ficheiros de captura de memória do SQL Server e processos relacionados para depuração. Este artigo descreve como utilizar Sqldumper.exe para gerar um ficheiro de informação de falha de sistema para relatórios de erros do Watson ou tarefas de depuração.
O artigo também descreve dois outros métodos para gerar ficheiros de informação de falha de sistema:
- O script do PowerShell anexado automatiza SQLDumper.exe opções da linha de comandos.
- O comando DBCC STACKDUMP Transact-SQL (T-SQL) pode ser utilizado para gerar um ficheiro de informação de falha de sistema no SQL Server.
Como executar Sqldumper.exe manualmente
Execute a ferramenta Sqldumper.exe no contexto da pasta onde o SQL Server instalou originalmente a ferramenta.
Por predefinição, o caminho de instalação do Sqldumper.exe é <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\90\Shared\SQLDumper.exe. Repare que <SQLServerInstall Drive> é um marcador de posição para a unidade na qual instalou o SQL Server.
Para gerar um ficheiro de informação de falha de sistema com a ferramenta Sqldumper.exe, siga estes passos:
Abra <a unidade SQLServerInstall>:\Program Files\Microsoft SQL Server\<number>\Shared .
Neste caminho de pasta, <o número> é um marcador de posição para uma das seguintes versões:
- 150 para o SQL Server 2019
- 140 para o SQL Server 2017
- 130 para o SQL Server 2016
- 120 para o SQL Server 2014
- 110 para SQL Server 2012
- 100 para o SQL Server 2008
- 90 para o SQL Server 2005
Certifique-se de que o ficheiro Dbghelp.dll está nesta pasta.
Selecione Iniciar>Execução, escreva cmd e, em seguida, selecione OK.
Na linha de comandos, escreva o seguinte comando e, em seguida, prima Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
Observação
Neste caminho de pasta, <o número> é o mesmo marcador de posição que muda com a versão do SQL Server, conforme descrito anteriormente.
Para gerar um tipo específico de ficheiro de informação de falha de sistema, escreva o comando correspondente na linha de comandos e, em seguida, prima Enter:
Ficheiro de informação de falha de sistema completo:
Sqldumper.exe <ProcessID> 0 0x01100
Ficheiro de mini-informação de falha de sistema:
Sqldumper.exe <ProcessID> 0 0x0120
Ficheiro de mini-informação de falha de sistema que inclui memória referenciada indiretamente (esta é a opção recomendada e também é utilizado pelo SQL Server por predefinição quando gera automaticamente ficheiros de informação de falha de sistema de memória):
Sqldumper.exe <ProcessID> 0 0x0128
Ficheiro de informação de falha de sistema filtrado:
Sqldumper.exe <ProcessID> 0 0x8100
Observação
<ProcessID> é um marcador de posição para o identificador de processo da aplicação do Windows para a qual pretende gerar um ficheiro de informação de falha de sistema.
Se Sqldumper.exe for executada com êxito, a ferramenta gera um ficheiro de informação de falha de sistema na pasta na qual a ferramenta está instalada.
O ficheiro de informação de falha de sistema que Sqldumper.exe gera tem um padrão de nome de ficheiro semelhante a SQLDmpr<xxxx.mdmp>.
Neste padrão, <xxxx> é um número crescente que é determinado com base noutros ficheiros que têm um nome de ficheiro semelhante na mesma pasta. Se existirem ficheiros na pasta que correspondam ao padrão especificado, considere comparar as respetivas datas e horas de criação para encontrar o ficheiro pretendido.
Como obter um identificador do processo de aplicação do Microsoft Windows
Para gerar um ficheiro de informação de falha de sistema com a ferramenta Sqldumper.exe, tem de ter o identificador de processo da aplicação do Windows para a qual pretende gerar um ficheiro de informação de falha de sistema. Eis como obter o identificador do processo:
- Prima Ctrl+Alt+Delete e selecione Gestor de Tarefas.
- Na caixa de diálogo Gestor de Tarefas do Windows , selecione o separador Processos .
- No menu Ver , selecione Selecionar Colunas.
- Na caixa de diálogo Selecionar Colunas , selecione a caixa de verificação PID (Identificador do Processo) e, em seguida, selecione OK.
- Tenha em atenção o identificador do processo da aplicação Do Windows para a qual pretende gerar um ficheiro de informação de falha de sistema. Para a aplicação SQL Server, tenha em atenção o identificador do processo do processo Sqlservr.exe .
- Feche o Gestor de Tarefas.
Em alternativa, utilize o ficheiro de registo de erros do SQL Server para obter o identificador de processo da aplicação do SQL Server em execução no seu computador. Parte do ficheiro de registo de erros do SQL Server assemelha-se ao seguinte exemplo:
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.
O número que aparece depois Server process ID
é o identificador do processo para o processo deSqlservr.exe .
Caminho de saída para ficheiros de informação de falha de sistema da memória
SQLDumper.exe gera principalmente ficheiros de captura de memória para o processo do SQL Server quando é necessária uma captura de memória para resolver problemas específicos, tais como exceções, asserções ou agendadores que não produzem. Nestes casos, o SQL Server invoca o SQLDumper.exe para gerar um ficheiro de captura de memória do respetivo processo. Por predefinição, o ficheiro de captura de memória é armazenado no diretório MSSQL\LOG\ da instância do SQL.
Como alterar o caminho predefinido
Se, por exemplo, o tamanho do ficheiro de informação de falha de sistema for demasiado grande, pode modificar o caminho ao seguir estes passos:
- Abra o Gestor de Configuração do SQL Server.
- Em SQL Server Services, localize a instância do SQL Server que está a ser investigada.
- Clique com o botão direito do rato nessa entrada, selecione Propriedades e, em seguida, aceda ao separador Avançadas .
- Altere esse Diretório de Informação de Falha de Sistema para o caminho pretendido e, em seguida, selecione OK.
- Reinicie o SQL Server (sempre que possível) para que a nova definição entre em vigor.
Quando a ferramenta Sqldumper.exe é utilizada manualmente para gerar um ficheiro de informação de falha de sistema para qualquer aplicação do Windows, o ficheiro de informação de falha de sistema pode ser tão grande como a memória que a aplicação do Windows está a utilizar atualmente. Certifique-se de que está disponível espaço em disco suficiente na unidade para a qual Sqldumper.exe está a escrever o ficheiro de informação de falha de sistema.
Especificar uma pasta de saída personalizada no comando
Pode especificar o diretório onde pretende que a ferramenta Sqldumper.exe escreva o ficheiro de informação de falha de sistema. O diretório já tem de existir antes de executar Sqldumper.exe. Caso contrário, Sqldumper.exe falha. Não utilize um caminho UNC (Convenção de Nomenclatura Universal) como localização para o ficheiro de informação de falha de sistema. Os passos seguintes fornecem um exemplo de como especificar a localização do ficheiro de mini-informação de falha de sistema:
Selecione Iniciar>Execução, escreva cmd e, em seguida, selecione OK.
Na linha de comandos, escreva o seguinte comando e, em seguida, prima Enter:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
Na linha de comandos, escreva o seguinte comando e, em seguida, prima Enter:
Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
Observação
<O MdumpPath> é um marcador de posição para o diretório onde pretende que a ferramenta Sqldumper.exe escreva o ficheiro de informação de falha de sistema. Por predefinição, o ficheiro é escrito na pasta atual.
Se especificar um ficheiro de informação de falha de sistema completo ou um ficheiro de informação de falha de sistema filtrado a ser gerado, Sqldumper.exe poderá demorar vários minutos a gerar o ficheiro de informação de falha de sistema. O tempo que demorou depende das seguintes variáveis:
- A quantidade de memória que Sqlservr.exe está atualmente a utilizar.
- A velocidade de escrita da unidade utilizada pela ferramenta para armazenar o ficheiro de informação de falha de sistema.
Durante este período, a ferramenta Sqldumper.exe não processa comandos. Irá reparar que o servidor deixa de responder. Além disso, pode ocorrer uma ativação pós-falha do cluster.
Requisitos de permissão
Para executar Sqldumper.exe, tem de iniciar sessão no Windows através de um dos seguintes métodos:
- Utilize uma conta que seja membro do grupo de administradores no computador.
- Utilize a mesma conta de utilizador na qual o serviço do SQL Server está em execução.
Para que a ferramenta Sqldumper.exe funcione com êxito através do Ambiente de Trabalho Remoto ou através dos Serviços de Terminal, tem de iniciar o Ambiente de Trabalho Remoto ou os Serviços de Terminal no modo de consola. Por exemplo, para iniciar o Ambiente de Trabalho Remoto no modo de consola, selecione Iniciar>Execução, escreva mstsc /console e, em seguida, selecione OK. Se o servidor de destino executar o Windows 2000, a opção /console é ignorada silenciosamente. Pode ligar ao servidor através do Ambiente de Trabalho Remoto, mas não utilizará a sessão da consola.
Se constatar que não foi gerado nenhum ficheiro de informação de falha de sistema na pasta atual depois de executar Sqldumper.exe, verifique a saída da linha de comandos gerada pela ferramenta para identificar a potencial causa da falha. Estas informações também são registadas no ficheiro Sqldumper_errorlog.log no diretório atual. Seguem-se duas possíveis mensagens de erro e as respetivas causas:
Mensagem | Motivo |
---|---|
"Falha do OpenProcess 0x57 – O parâmetro está incorreto" | Foi transmitido um ID de Processo inválido para o utilitário Sqldumper.exe. |
"Valor inválido para o ID do thread – <erro de parâmetro> inválido" | Foi transmitido um parâmetro inválido para o utilitário Sqldumper.exe. |
Se for gerada uma mensagem de erro semelhante a uma das seguintes, pode ignorar esta mensagem com segurança:
- "Tipo de chamada de retorno desconhecido durante o minidump 6"
- "Tipo de chamada de retorno desconhecido durante o minidump 7"
Impacto da geração de informações de falha de sistema
Quando é pedido um ficheiro de informação de falha de sistema de um processo de modo de utilizador (conforme abordado neste artigo, em oposição às Capturas de Kernel do Sistema Operativo, que estão fora do nosso âmbito), o Processo de destino (aqui SQLServer.exe) é bloqueado durante o tempo necessário para serializar o conteúdo de captura para o destino do ficheiro.
Congelado significa que o processo não poderá executar nenhum pedido de utilizador ou qualquer operação interna, incluindo qualquer mecanismo de Consulta de Recursos, como a implementação de IsAlive e Looks Alive do Clustering do Windows (veja a secção Capturas de memória nas ativações pós-falha do cluster para obter detalhes sobre como lidar com essa situação). Qualquer tempo limite que dependa da hora do relógio de parede também pode ser violado por causa do congelamento.
Com base na instrução anterior, a duração do congelamento é o fator crítico aqui, impulsionado pelo seguinte:
- O tipo de informação de falha de sistema selecionado.
- O tamanho do processo do SQL Server na memória, que no caso de uma única instância ativa a executar parâmetros predefinidos está, muitas vezes, próximo da RAM física total do servidor.
- O desempenho do disco utilizado como destino para a informação de falha de sistema.
Além disso, o tamanho do ficheiro de informação de falha de sistema no disco deve ser planeado, especialmente se forem possíveis várias informações de falha de sistema e se forem selecionados tipos de informação de falha de sistema grandes e não predefinidos. Certifique-se de que revê os tipos de Informação de Falha de Sistema para saber o que esperar. Por predefinição, alguns métodos de informação de falha de sistema criam a informação de falha de sistema na pasta \Log da Instância do SQL Server, que, na configuração simples predefinida, também seria disco do sistema e data+disco de registo para o SQL Server. Colocar esse disco em saturação tem um impacto grave na disponibilidade do SQL Server e/ou do sistema.
Gerir o impacto nos sistemas em cluster
O processo é suspenso temporariamente durante a geração da informação de falha de sistema. Isto pode afetar a disponibilidade do serviço do SQL Server e acionar a ativação pós-falha de recursos em contextos AlwaysOn (instância de cluster de Ativação pós-falha e Grupo de disponibilidade). A geração de informações de falha de sistema de diferentes processos afeta os recursos de forma diferente. Leia cuidadosamente o Impacto das secções De geração de informações de falha de sistema e tipos de informação de falha de sistema.
Quando captura uma captura do SQL Server numa instância de cluster de ativação pós-falha ou numa instância do grupo de disponibilidade (AG) do SQL Server, o SQL Server ou AG em cluster poderá efetuar a ativação pós-falha para outro nó se a captura demorar demasiado tempo a ser concluída. Isto pode ser especialmente problemático em sistemas que utilizam grandes quantidades de RAM ou se estiver a gerar uma captura de memória filtrada ou completa. Para impedir a ativação pós-falha, utilize as seguintes definições antes de capturar o ficheiro de informação de falha de sistema. A alteração pode ser revertida após a criação de um ficheiro de informação de falha de sistema:
- Para a instância em cluster de ativação pós-falha (FCI):
- Clique com o botão direito do rato em Recurso do SQL Server no Administrador de Cluster, selecione Se o recurso falhar, não reinicie no separador Políticas .
- No separador Propriedades , aumente o Tempo Limite da Verificação de Estado de Funcionamento. Por exemplo, defina o valor da propriedade como 180 segundos ou superior. Se este tempo limite for atingido, a política Se o recurso falhar, não reiniciar será ignorada e o recurso será reiniciado.
- No separador Propriedades , altere o valor FailureConditionLevel para zero.
- Para o AG, aplique todas as seguintes definições:
- Aumente o tempo limite de sessão, por exemplo, 120 segundos para todas as réplicas. No SQL Server Management Studio (SSMS), clique com o botão direito do rato na réplica a configurar e, em seguida, selecione Propriedades. Altere o campo Tempo limite da sessão (segundos) para 120 segundos. Para obter mais informações, veja Alterar o Período de Session-Timeout para uma Réplica de Disponibilidade (SQL Server).
- Altere a ativação pós-falha automática de todas as réplicas para ativação pós-falha manual. No SSMS, clique com o botão direito do rato na réplica, selecione Propriedades e altere a ativação pós-falha automática de todas as réplicas para ativação pós-falha manual no separador Propriedades . Para obter mais informações, veja Alterar o Modo de Ativação Pós-falha de uma Réplica de Disponibilidade (SQL Server).
- Aumente o LeaseTimeout para 60 000 ms (60 segundos) e altere HealthCheckTimeout para 90 000 ms (90 segundos). Em Administrador de Clusters, clique com o botão direito do rato em Recurso do AG, selecione Propriedades e, em seguida, mude para o separador Propriedades para modificar ambas as definições. Para obter mais informações, veja Configurar Definições de Propriedade HealthCheckTimeout.
Melhorias nos produtos para reduzir o impacto no SQL Server
São adicionadas quatro melhorias importantes às versões recentes do SQL Server para reduzir o tamanho do ficheiro de informação de falha de sistema e/ou o tempo para gerar a captura de memória:
- Mecanismo de filtragem de mapa de bits
- Eliminação de informações de falha de sistema repetidas sobre o mesmo problema
- Resultado abreviado no registo de erros
- Compressão paralela de capturas de memória
Mecanismo de filtragem de mapa de bits
O SQL Server aloca um mapa de bits que mantém um registo das páginas de memória a serem excluídas de uma captura filtrada. Sqldumper.exe lê o mapa de bits e filtra as páginas sem a necessidade de ler outros metadados do gestor de memória. Verá as seguintes mensagens no registo de erros do SQL Server quando o mapa de bits está ativado ou desativado, respetivamente:
Page exclusion bitmap is enabled.
e Page exclusion bitmap is disabled.
SQL Server 2016
A partir do SQL Server 2016 SP2 CU13, a filtragem de mapa de bits está ativada por predefinição.
SQL Server 2017
- Isto não está disponível no RTM através da CU15.
- No SQL Server 2017 CU16, pode ativar a filtragem de mapa de bits através do T8089 e desativá-lo ao desativar o T8089.
- A partir do SQL Server 2017 CU20, a filtragem do mapa de bits está ativada por predefinição. O sinalizador de rastreio T8089 deixará de ser aplicado e será ignorado se estiver ativado. A filtragem de mapa de bits pode ser desativada através do T8095.
SQL Server 2019
Esta opção está ativada por predefinição no SQL Server 2019 RTM. Pode ser desativado através do T8095.
Eliminação de informações de falha de sistema repetidas sobre o mesmo problema
As capturas de memória repetidas no mesmo problema são eliminadas. Com uma assinatura de pilha, o motor do SQL controla se já ocorreu uma exceção e não produzirá uma nova captura de memória se já existir uma. Isto aplica-se a violações de acesso, capacidade excedida da pilha, afirmações e exceções de danos no índice. Isto reduz significativamente a quantidade de espaço em disco utilizado pelas capturas de memória e não congela temporariamente o processo para gerar uma captura. Isto foi adicionado no SQL Server 2019.
Resultado abreviado no registo de erros
O conteúdo gerado no registo de erros do SQL Server a partir de uma captura de memória única pode não só ser esmagador, como também pode abrandar o processo de geração de uma captura de memória devido ao tempo necessário para serializar todas estas informações num formato de texto no registo de erros. No SQL Server 2019, o conteúdo armazenado no Registo de erros após a geração de informações de falha de sistema foi bastante reduzido e poderá ter o seguinte aspeto:
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.
Anteriormente, o SQL Server imprime informações para cada sessão ou thread quando uma captura manual era acionada pelo utilizador, por exemplo.
Compressão paralela de capturas de memória
Para gerar informações de falha de sistema mais rapidamente e torná-las mais pequenas, foi introduzida uma funcionalidade de captura de memória comprimida no SQL Server 2022 CU8 e SQL Server 2019 CU23. Quando ativada, Sqldumper.exe cria vários threads para ler a memória de um processo em simultâneo, comprime-a e, em seguida, guarda-a no ficheiro de informação de falha de sistema. Esta compressão paralela de vários threads reduz o tamanho do ficheiro e acelera o processo de captura quando utilizado com informações de falha de sistema completas e filtradas.
Pode ativar o sinalizador de rastreio 2610 para ativar a captura de memória comprimida:
DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)
Em alternativa, pode adicionar -T2610
como um parâmetro de arranque à sua instância do SQL Server para que crie sempre capturas de memória comprimidas.
Se executar manualmente Sqldumper.exe, pode utilizar o -zdmp
parâmetro para capturar uma captura de memória comprimida. Por exemplo:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp
Também pode limitar o número de núcleos Sqldumper.exe pode utilizar para criar a informação de falha de sistema comprimida com o -cpu:X
parâmetro , em que X é o número de CPUs. Este parâmetro só está disponível quando executa manualmente Sqldumper.exe a partir da linha de comandos:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8
Fatores que impedem ou atrasam a criação de capturas de memória
Sabe-se que os seguintes fatores causam atrasos ou impedem a criação de capturas de memória.
- O caminho de E/S onde as capturas de memória são escritas tem um desempenho fraco. Nestes casos, investigar e resolver o desempenho de E/S do disco é o próximo passo lógico.
- Um software antivírus ou outro software de monitorização está a interferir com SQLDumper.exe. Em alguns casos, o software de terceiros desvia a função ReadProcessMemory . Isto pode aumentar significativamente a duração da informação de falha de sistema. Para resolver a maioria destes problemas, desative o software que está a interferir ou adicione SQLDumper.exe a uma lista de exclusão.
Tipos de informação de falha de sistema
Os seguintes métodos podem ser utilizados para gerar três tipos diferentes de informações de falha de sistema: mini capturas, capturas completas e informações de falha de sistema filtradas.
Mini capturas com memória referenciada
Este tipo de captura de memória é um instantâneo de todos os threads ativos do processo ("pilhas de thread"), juntamente com uma extração limitada da memória referenciada pelas pilhas de threads e outros dados de thread ou processo chave. Normalmente, são alguns megabytes de tamanho e são rápidos de gerar (de menos de um segundo a alguns segundos). Os sistemas de servidor ainda maiores (com centenas de CPU a conduzir indiretamente um grande número de threads no processo do SQL Server) raramente excederão os 20 a 30 MB: o tamanho de uma mini captura não aumenta com o tamanho do processo do SQL Server. Este tipo de informação de falha de sistema é o tipo predefinido utilizado pelo SQL Server ao gerar capturas de memória automaticamente em exceções, problemas do agendador, problemas de bloqueio temporário, danos na base de dados e afirmações.
Observação
O SQL Server, como parte da instrumentação incorporada, irá gerar "mini capturas de diagnóstico" automatizadas em algumas situações específicas. Por conseguinte, esta operação é considerada suficientemente segura para que o SQL Server possa acioná-la automaticamente quando necessário.
Informações de falha de sistema completas
Uma Captura de memória completa é uma cópia completa do espaço de processo de destino ativo. Isto incluiria, portanto, todo o estado do thread, toda a memória alocada do processo e todos os módulos carregados. Por conseguinte, as capturas completas terão um tamanho, que é aproximadamente o mesmo do processo do SQL Server, que por sua vez pode ser quase tão grande como a RAM do sistema total. Em servidores grandes dedicados a uma única instância do SQL Server que pode significar um ficheiro, que é várias centenas de gigabytes ou mais. Desnecessariamente, tal ficheiro demorará muito tempo a ser gerado e, por conseguinte, induzirá um congelamento prolongado. O desempenho do disco para o destino do ficheiro da captura irá influenciar significativamente o tempo de congelação. Este tipo de informação de falha de sistema raramente é utilizado para o SQL Server hoje em dia, conforme descrito na explicação seguinte.
Capturas filtradas
À medida que o tamanho da RAM dos servidores típicos que executam o SQL Server aumenta constantemente, as capturas completas tornam-se mais inflexíveis. Por conseguinte, as capturas filtradas são implementadas. Uma captura filtrada é um subconjunto de uma captura completa, onde grandes áreas de memória do SQL Server são excluídas de imediato e não escritas no disco. Normalmente, a memória excluída não traz valor adicional para a resolução de problemas. Os exemplos são páginas de dados/índices e algumas caches internas, como páginas de dados hekaton e memória do Conjunto de Registos. Esta informação de falha de sistema filtrada resulta num ficheiro mais pequeno do que uma captura completa, mas a informação de falha de sistema mantém quase toda a sua utilidade. As informações de falha de sistema filtradas substituíram as informações de falha de sistema completas como a opção preferencial numa grande maioria das situações em que as mini capturas não são suficientes. A diminuição do tamanho pode variar em comparação com uma captura completa, mas continua a ser um ficheiro bastante grande, que é, muitas vezes, 30 a 60 por cento do tamanho do processo do SQL Server. Portanto, é melhor planear um tamanho possível tão grande quanto uma informação de falha de sistema completa como a pior opção, o que deixa uma boa margem de segurança. Uma captura filtrada pode não ser necessariamente mais rápida de gerar do que uma captura completa em todos os casos: é uma questão de saber se os ganhos relacionados com o número de E/S evitadas excedem o tempo necessário para implementar a lógica de filtro (a velocidade do disco e a velocidade da CPU/RAM influenciarão isso).
Pode utilizar a seguinte consulta para obter uma estimativa aproximada do tamanho da informação de falha de sistema filtrada. Embora a expectativa seja que a maioria das páginas de dados ou índice sejam excluídas da informação de falha de sistema, as que estão exclusivamente bloqueadas e modificadas não serão omitidas.
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'
Uma vez que pode utilizar Sqldumper.exe para gerar um ficheiro de informação de falha de sistema a pedido para qualquer aplicação do Microsoft Windows, poderá considerar utilizar a opção de informação de falha de sistema filtrada. No entanto, um ficheiro de informação de falha de sistema filtrado só é aplicável e significativo no contexto do SQL Server. Ainda pode gerar uma mini-captura, um ficheiro de informação de falha de sistema completo ou aplicações que não são do SQL Server com êxito.
O processo do SQL Server chama internamente a ferramenta Sqldumper.exe para gerar um ficheiro de informação de falha de sistema quando o processo sofrer exceções. O SQL Server transmite parâmetros para Sqldumper.exe. Pode utilizar sinalizadores de rastreio para alterar os parâmetros que o SQL Server transmite à ferramenta por predefinição quando ocorre uma exceção ou asserção. Estes sinalizadores de rastreio estão entre 2540 e 2559. Pode utilizar um destes sinalizadores de rastreio para alterar o tipo de captura predefinido SQLDumper.exe gerar (a predefinição é uma mini-captura com memória referenciada). Por exemplo:
- Sinalizador de Rastreio 2551: produz uma captura de memória filtrada.
- Sinalizador de Rastreio 2544: produz uma captura de memória completa.
- Sinalizador de Rastreio 8026: o SQL Server limpará um acionador de captura depois de gerar a informação de falha de sistema uma vez.
Se dois ou mais sinalizadores de rastreio estiverem ativos, é respeitada a opção que indica a maior captura de memória. Por exemplo, se forem utilizados sinalizadores de rastreio 2551 e 2544, o SQL Server cria uma captura de memória completa.
Gerar uma captura de memória nas ativações pós-falha do cluster
Em cenários de ativação pós-falha do cluster, a DLL de recurso do SQL Server pode obter um ficheiro de informação de falha de sistema antes de ocorrer a ativação pós-falha para ajudar na resolução de problemas. Quando a DLL de recurso do SQL Server determina que um recurso do SQL Server falhou, a DLL de recurso do SQL Server utiliza o utilitário Sqldumper.exe para obter um ficheiro de captura do processo do SQL Server. Para se certificar de que a ferramenta Sqldumper.exe gera com êxito o ficheiro de informação de falha de sistema, tem de definir as três propriedades seguintes como pré-requisitos:
SqlDumperDumpTimeOut
Um tempo limite especificado pelo utilizador. A DLL do recurso aguarda que o ficheiro de informação de falha de sistema seja concluído antes de a DLL do recurso parar o serviço do SQL Server.
SqlDumperDumpPath
A localização onde a ferramenta Sqldumper.exe gera o ficheiro de informação de falha de sistema.
SqlDumperDumpFlags
Sinalizadores que Sqldumper.exe utiliza.
Se uma das propriedades não estiver definida, Sqldumper.exe não conseguirá gerar o ficheiro de informação de falha de sistema. É registada uma mensagem de aviso no registo de eventos e no registo do cluster sempre que o recurso é colocado online.
Configuração do cluster para SQLDumper no SQL Server 2012 e versões posteriores
Pode utilizar o ALTER SERVER CONFIGURATION
comando (T-SQL) para modificar estas propriedades. Por exemplo:
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;
Em alternativa, pode utilizar scripts do PowerShell. Por exemplo, para uma instância nomeada 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
Para verificar se as definições são aplicadas, pode executar o seguinte comando do PowerShell:
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter
Configuração do cluster para SQLDumper no SQL Server 2008/2008 R2 ou Windows 2012 e versões anteriores
Para definir as propriedades do utilitário Sqldumper.exe para a ativação pós-falha do cluster com o comando de recurso do cluster , siga estes passos:
- Selecione Iniciar>Execução, escreva cmd e, em seguida, selecione OK.
- Para cada propriedade, escreva o comando correspondente na linha de comandos e, em seguida, prima Enter:
A propriedade
SqlDumperDumpFlags
Para definir a
SqlDumperDumpFlags
propriedade para um ficheiro de informação de falha de sistema específico, escreva o comando correspondente na linha de comandos e, em seguida, prima Enter:Todos os ficheiros de captura completa de threads
Instância padrão
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
Instância nomeada
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
Todos os ficheiros de mini-captura de thread
Instância padrão
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
Instância nomeada
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
Filtrado por todos os ficheiros de informação de falha de sistema do thread
Instância padrão
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
Instância nomeada
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
A propriedade
SqlDumperDumpPath
cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
Observação
<O DirectoryPath> é um marcador de posição para o diretório no qual o ficheiro de informação de falha de sistema será gerado e deve ser especificado entre aspas (" ").
A propriedade
SqlDumperDumpTimeOut
cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
Observação
<O tempo limite> é um marcador de posição para o tempo limite em milissegundos (ms).
O tempo que a ferramenta demora a gerar um ficheiro de informação de falha de sistema de um processo do SQL Server depende da configuração do computador. Para um computador com uma grande quantidade de memória, o tempo pode ser significativo. Para estimar o tempo necessário para o processo, utilize a ferramenta Sqldumper.exe para gerar manualmente um ficheiro de informação de falha de sistema. Os valores válidos para a SqlDumperDumpTimeOut
propriedade são de 10 000 ms a MAXDWORD. MAXDWORD representa o valor mais alto no intervalo do tipo de dados DWORD (4294967295).
Para verificar se as definições estão ativadas, pode executar o seguinte comando:
cluster resource "SQL Server" /priv
Remover Sqldumper.exe propriedades da ativação pós-falha do cluster
Para remover as propriedades da ferramenta Sqldumper.exe para a ativação pós-falha do cluster, siga estes passos:
Selecione Iniciar>Execução, escreva cmd e, em seguida, selecione OK.
Para uma propriedade específica, escreva o comando correspondente na linha de comandos e, em seguida, prima Enter:
A propriedade
SqlDumperDumpFlags
Instância padrão
cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
Instância nomeada
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
A propriedade
SqlDumperDumpPath
Instância padrão
cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
Instância nomeada
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
A propriedade
SqlDumperDumpTimeOut
Instância padrão
cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
Instância nomeada
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
Como utilizar o DBCC STACKDUMP
O DBCC STACKDUMP
comando pode ajudá-lo a criar uma captura de memória no diretório LOG da instalação da instância do SQL Server. Por predefinição, o comando criará um minidump com todos os threads, que tem um tamanho limitado e é adequado para refletir o estado do processo do SQL Server. Execute o seguinte comando num cliente do SQL Server:
DBCC STACKDUMP
Para obter a funcionalidade expandida do DBCC STACKDUMP
no SQL Server 2019, veja Funcionalidade Expandida do DBCC STACKDUMP introduzida no SQL Server 2019.
Para ativar este método para criar uma captura filtrada, ative os sinalizadores de rastreio 2551 com o seguinte comando:
DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP
Para criar uma informação de falha de sistema completa, utilize o sinalizador de rastreio 2544.
Depois de obter o ficheiro de informação de falha de sistema, deve desativar o sinalizador de rastreio com o comando DBCC TRACEOFF (<TraceNumber>, -1);
para evitar atualizar inadvertidamente todos os minidumps de autodiagnóstica do SQL Server adicionais para capturas maiores. No comando, <TraceNumber> é o sinalizador de rastreio que ativou anteriormente, como 2551 ou 2544. Por exemplo:
DBCC TRACEOFF(2551, -1)
Caso não tenha a certeza de que sinalizador de rastreio permanece ativo, execute o seguinte comando:
DBCC TRACESTATUS(-1)
Um conjunto de resultados vazio indica que nenhum sinalizador de rastreio está ativo. Por outro lado, se 2551 ainda estiver ativo, verá:
TraceFlag | Status | Global | Sessão |
---|---|---|---|
2551 | 1 | 1 | 0 |
Observação
Os traceflag
ativados por DBCC TRACEON
são repostos (removidos) após um reinício do serviço.
Funcionalidade expandida do DBCC STACKDUMP introduzida no SQL Server 2019
A partir do SQL Server 2019 CU2, o DBCC STACKDUMP
comando foi expandido para suportar a geração de informações de falha de sistema de diferentes tipos: cópias de segurança mini, filtradas e completas. Este comando elimina a necessidade de utilizar sinalizadores de rastreio. Também lhe permite limitar a saída de texto no outro ficheiro de texto que é gerado com a captura de memória. Ao fazê-lo, poderá proporcionar um ganho de desempenho visível no tempo que demora SQLDumper.exe a gerar uma captura de memória.
DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]
É TEXT_DUMP = LIMITED
a opção predefinida. Se quiser receber uma saída detalhada no ficheiro SQLDump000X.txt , pode utilizar TEXT_DUMP = DETAILED
.
Para gerar uma captura filtrada com saída limitada no ficheiro .txt , execute o seguinte comando:
DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED
Como utilizar um script do PowerShell para gerar um ficheiro de informação de falha de sistema com o SQLDumper
Guarde o seguinte código como um ficheiro PS1, por exemplo ,SQLDumpHelper.ps1:
Detalhes do código
$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."
Execute-o a partir da Linha de Comandos como administrador com o seguinte comando:
Powershell.exe -File SQLDumpHelper.ps1
Em alternativa, execute-o a partir da consola do Windows PowerShell e execute-o como administrador com o seguinte comando:
.\SQLDumpHelper.ps1
Observação
Se nunca tiver executado scripts do PowerShell no seu sistema, poderá receber a seguinte mensagem de erro:
"Não é possível carregar o ficheiro ...SQLDumpHelper.ps1 porque a execução de scripts está desativada neste sistema."
Para ativar a capacidade de executar os comandos, siga estes passos:
Inicie a consola do Windows PowerShell com a opção Executar como Administrador . Apenas os membros do grupo de administradores no computador podem alterar a política de execução.
Ative a execução de scripts não assinados pelo seguinte comando:
Set-ExecutionPolicy RemoteSigned
Observação
Isto permite-lhe executar scripts não assinados que cria no seu computador local e scripts assinados a partir da Internet.