Usar la herramienta Sqldumper.exe para generar un archivo de volcado en SQL Server
En este artículo se proporcionan instrucciones generales para la herramienta Sqldumper.exe que se incluye con SQL Server. Esta herramienta se usa para generar diferentes tipos de archivos de volcado de memoria.
Versión original del producto: SQL Server 2019, SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012, SQL Server 2008, SQL Server 2005
Número de KB original: 917825
Resumen
La herramienta Sqldumper.exe se incluye con Microsoft SQL Server. Genera archivos de volcado de memoria de SQL Server y procesos relacionados para la depuración. En este artículo se describe cómo usar Sqldumper.exe para generar un archivo de volcado de memoria para las tareas de depuración o informes de errores de Watson.
En el artículo también se describen otros dos métodos para generar archivos de volcado de memoria:
- El script de PowerShell asociado automatiza SQLDumper.exe opciones de línea de comandos.
- El comando DBCC STACKDUMP transact-SQL (T-SQL) se puede usar para generar un archivo de volcado de memoria en SQL Server.
Ejecución manual de Sqldumper.exe
Ejecute la herramienta Sqldumper.exe en el contexto de la carpeta donde SQL Server instaló originalmente la herramienta.
De forma predeterminada, la ruta de instalación de Sqldumper.exe es <UNIDAD SQLServerInstall>:\Archivos de programa\Microsoft SQL Server\90\Shared\SQLDumper.exe. Observe que <la unidad> SQLServerInstall es un marcador de posición para la unidad en la que instaló SQL Server.
Para generar un archivo de volcado mediante la herramienta Sqldumper.exe, siga estos pasos:
Abra <unidad SQLServerInstall>:\Archivos de programa\Microsoft SQL Server\<number>\Carpeta compartida .
En esta ruta de acceso de carpeta, <number es un marcador> de posición para una de las siguientes versiones:
- 150 para SQL Server 2019
- 140 para SQL Server 2017
- 130 para SQL Server 2016
- 120 para SQL Server 2014
- 110 para SQL Server 2012
- 100 para SQL Server 2008
- 90 para SQL Server 2005
Asegúrese de que el archivo Dbghelp.dll está en esta carpeta.
Seleccione Iniciar>ejecución, escriba cmd y, a continuación, seleccione Aceptar.
En el símbolo del sistema, escriba el siguiente comando y presione Entrar:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
Nota:
En esta ruta de acceso de carpeta, <el número> es el mismo marcador de posición que cambia con la versión de SQL Server, como se ha descrito anteriormente.
Para generar un tipo específico de archivo de volcado de memoria, escriba el comando correspondiente en el símbolo del sistema y presione Entrar:
Archivo de volcado completo:
Sqldumper.exe <ProcessID> 0 0x01100
Archivo de minivolcado:
Sqldumper.exe <ProcessID> 0 0x0120
Archivo de minivolcado de memoria que incluye memoria a la que se hace referencia indirectamente (esta es la opción recomendada y también la usa SQL Server de forma predeterminada cuando genera automáticamente archivos de volcado de memoria):
Sqldumper.exe <ProcessID> 0 0x0128
Archivo de volcado filtrado:
Sqldumper.exe <ProcessID> 0 0x8100
Nota:
<ProcessID> es un marcador de posición para el identificador de proceso de la aplicación de Windows para la que desea generar un archivo de volcado.
Si Sqldumper.exe se ejecuta correctamente, la herramienta genera un archivo de volcado en la carpeta en la que se instala la herramienta.
El archivo de volcado de memoria que Sqldumper.exe genera tiene un patrón de nombre de archivo similar a SQLDmpr<xxxx.mdmp>.
En este patrón, <xxxx> es un número creciente que se determina en función de otros archivos que tienen un nombre de archivo similar en la misma carpeta. Si hay archivos en la carpeta que coinciden con el patrón especificado, considere la posibilidad de comparar sus fechas y horas de creación para encontrar el archivo que desea.
Obtención de un identificador de proceso de aplicación de Microsoft Windows
Para generar un archivo de volcado mediante la herramienta Sqldumper.exe, debe tener el identificador de proceso de la aplicación de Windows para la que desea generar un archivo de volcado de memoria. Aquí se muestra cómo obtener el identificador de proceso:
- Presione Ctrl+Alt+Eliminar y seleccione Administrador de tareas.
- En el cuadro de diálogo Administrador de tareas de Windows, seleccione la pestaña Procesos .
- En el menú Ver , seleccione Seleccionar columnas.
- En el cuadro de diálogo Seleccionar columnas , active la casilla PID (identificador de proceso) y, a continuación, seleccione Aceptar.
- Tenga en cuenta el identificador de proceso de la aplicación windows para la que desea generar un archivo de volcado. Para la aplicación de SQL Server, tenga en cuenta el identificador de proceso del proceso de Sqlservr.exe .
- Cierre el Administrador de tareas.
Como alternativa, use el archivo de registro de errores de SQL Server para obtener el identificador de proceso de la aplicación de SQL Server que se ejecuta en el equipo. Parte del archivo de registro de errores de SQL Server es similar al ejemplo siguiente:
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.
El número que aparece después Server process ID
es el identificador de proceso del proceso de Sqlservr.exe .
Ruta de acceso de salida para archivos de volcado de memoria
SQLDumper.exe genera principalmente archivos de volcado de memoria para el proceso de SQL Server cuando se necesita un volcado de memoria para resolver problemas específicos, como excepciones, aserciones o programadores que no producen rendimiento. En tales casos, SQL Server invoca el SQLDumper.exe para generar un archivo de volcado de memoria de su proceso. De forma predeterminada, el archivo de volcado de memoria se almacena en el directorio MSSQL\LOG\ de la instancia de SQL.
Cómo cambiar la ruta de acceso predeterminada
Si, por ejemplo, el tamaño del archivo de volcado de memoria es demasiado grande, puede modificar la ruta de acceso siguiendo estos pasos:
- Abra el Administrador de configuración de SQL Server.
- En Servicios de SQL Server, busque la instancia de SQL Server que se está investigando.
- Haga clic con el botón derecho en esa entrada, seleccione Propiedades y, a continuación, vaya a la pestaña Avanzadas .
- Cambie ese directorio de volcado a la ruta de acceso deseada y, a continuación, seleccione Aceptar.
- Reinicie SQL Server (siempre que sea posible) para que la nueva configuración surta efecto.
Cuando la herramienta de Sqldumper.exe se usa manualmente para generar un archivo de volcado de memoria para cualquier aplicación de Windows, el archivo de volcado de memoria podría ser tan grande como la memoria que la aplicación de Windows está usando actualmente. Asegúrese de que haya suficiente espacio en disco disponible en la unidad en la que Sqldumper.exe está escribiendo el archivo de volcado.
Especificar una carpeta de salida personalizada en el comando
Puede especificar el directorio en el que desea que la herramienta de Sqldumper.exe escriba el archivo de volcado. El directorio ya debe existir antes de ejecutar Sqldumper.exe. De lo contrario, Sqldumper.exe produce un error. No use una ruta de acceso UNC (Convención de nomenclatura universal) como ubicación para el archivo de volcado. Los pasos siguientes proporcionan un ejemplo de cómo especificar la ubicación del archivo de minivolcado:
Seleccione Iniciar>ejecución, escriba cmd y, a continuación, seleccione Aceptar.
En el símbolo del sistema, escriba el siguiente comando y presione Entrar:
cd <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared
En el símbolo del sistema, escriba el siguiente comando y presione Entrar:
Sqldumper.exe ProcessID 0 0x0128 0 <MdumpPath>
Nota:
<MdumpPath> es un marcador de posición para el directorio donde desea que la herramienta de Sqldumper.exe escriba el archivo de volcado. De forma predeterminada, el archivo se escribe en la carpeta actual.
Si especifica un archivo de volcado completo o un archivo de volcado filtrado que se va a generar, Sqldumper.exe puede tardar varios minutos en generar el archivo de volcado. El tiempo que se tarda depende de las variables siguientes:
- Cantidad de memoria que Sqlservr.exe está usando actualmente.
- Velocidad de escritura de la unidad usada por la herramienta para almacenar el archivo de volcado.
Durante este tiempo, la herramienta Sqldumper.exe no procesa comandos. Observará que el servidor deja de responder. Además, puede producirse una conmutación por error de clúster.
Requisitos de permisos de
Para ejecutar Sqldumper.exe, debe iniciar sesión en Windows mediante uno de los métodos siguientes:
- Use una cuenta que sea miembro del grupo del administrador en el equipo.
- Use la misma cuenta de usuario en la que se ejecuta el servicio SQL Server.
Para que la herramienta de Sqldumper.exe funcione correctamente a través de Escritorio remoto o a través de Terminal Services, debe iniciar Escritorio remoto o Terminal Services en el modo de consola. Por ejemplo, para iniciar Escritorio remoto en el modo de consola, seleccione Iniciar>ejecución, escriba mstsc /console y, a continuación, seleccione Aceptar. Si el servidor de destino ejecuta Windows 2000, la opción /console se omite silenciosamente. Puede conectarse al servidor a través de Escritorio remoto, pero no usará la sesión de consola.
Si encuentra que no se ha generado ningún archivo de volcado en la carpeta actual después de ejecutar Sqldumper.exe, compruebe la salida de la línea de comandos generada por la herramienta para identificar la posible causa del error. Esta información también se registra en el archivo Sqldumper_errorlog.log en el directorio actual. A continuación se muestran dos posibles mensajes de error y sus causas:
Message | Causa |
---|---|
"Error de OpenProcess 0x57: el parámetro es incorrecto" | Se pasó un identificador de proceso no válido a la utilidad Sqldumper.exe. |
"Valor no válido para el identificador de subproceso: <error de parámetro> no válido" | Se pasó un parámetro no válido a la utilidad Sqldumper.exe. |
Si se genera un mensaje de error similar a uno de los siguientes, puede omitir este mensaje de forma segura:
- "Tipo de devolución de llamada desconocido durante minivolcado 6"
- "Tipo de devolución de llamada desconocido durante el minivolcado 7"
Impacto de la generación de volcados de memoria
Cuando se solicita un archivo de volcado de un proceso en modo de usuario (como se describe en este artículo, en lugar de volcados de kernel del sistema operativo, que están fuera de nuestro ámbito), el proceso de destino (aquí SQLServer.exe) se inmoviliza mientras tarda en serializar el contenido de volcado en su destino de archivo.
Inmovilizado significa que el proceso no podrá ejecutar ninguna solicitud de usuario ni ninguna operación interna, incluido cualquier mecanismo de sondeo de recursos, como la implementación de IsAlive y Looks Alive de la agrupación en clústeres de Windows (consulte la sección Volcados de memoria en conmutaciones por error del clúster para obtener más información sobre cómo controlar esa situación). Cualquier tiempo de espera que se base en la hora del reloj también se puede infringir debido a la inmovilización.
En función de la instrucción anterior, la duración de la inmovilización es el factor crítico aquí, controlado por lo siguiente:
- Tipo de volcado seleccionado.
- El tamaño del proceso de SQL Server en memoria, que en el caso de una única instancia activa que ejecuta parámetros predeterminados suele estar cerca de la MEMORIA RAM física total del servidor.
- Rendimiento del disco usado como destino para el volcado de memoria.
Además, el tamaño del archivo de volcado de memoria en el disco debe planearse, especialmente si se pueden seleccionar varios volcados de memoria y si se seleccionan tipos de volcado no predeterminados grandes. Asegúrese de revisar los tipos de volcado para saber qué esperar. De forma predeterminada, algunos métodos de volcado crean el volcado en la carpeta \Log de la instancia de SQL Server, que, en la configuración sencilla predeterminada, también sería disco del sistema y disco de datos+registro para SQL Server. Llevar ese disco a la saturación tiene un impacto grave en SQL Server o disponibilidad del sistema.
Administración del impacto en los sistemas agrupados
El proceso se suspende temporalmente durante la generación del volcado de memoria. Esto puede afectar a la disponibilidad del servicio SQL Server y desencadenar la conmutación por error de recursos en contextos AlwaysOn (tanto la instancia de clúster de conmutación por error como el grupo de disponibilidad). La generación de volcado de memoria de diferentes procesos afecta a los recursos de forma diferente. Lea detenidamente las secciones Impacto de la generación de volcados y tipos de volcado.
Al capturar un volcado de SQL Server en una instancia en clúster de conmutación por error o una instancia de grupo de disponibilidad (AG) de SQL Server, el grupo de disponibilidad o SQL Server agrupado podría conmutar por error a otro nodo si el volcado tarda demasiado tiempo en completarse. Esto puede ser especialmente problemático en sistemas que usan grandes cantidades de RAM o si está generando un volcado de memoria filtrado o completo. Para evitar la conmutación por error, use la siguiente configuración antes de capturar el archivo de volcado de memoria. El cambio se puede revertir después de tomar un archivo de volcado:
- Para la instancia en clúster de conmutación por error (FCI):
- Haga clic con el botón derecho en recurso de SQL Server en Administrador de clústeres, seleccione Si se produce un error en el recurso, no reinicie en la pestaña Directivas.
- En la pestaña Propiedades , aumente el tiempo de espera de HealthCheck. Por ejemplo, establezca el valor de la propiedad en 180 segundos o superior. Si se alcanza este tiempo de espera, se omite la directiva Si se produce un error en el recurso, no se reinicia y se reinicia el recurso.
- En la pestaña Propiedades , cambie el valor FailureConditionLevel a cero.
- En el caso del grupo de disponibilidad, aplique todas las opciones siguientes:
- Aumente el tiempo de espera de sesión, por ejemplo, 120 segundos para todas las réplicas. En SQL Server Management Studio (SSMS), haga clic con el botón derecho en la réplica que se va a configurar y seleccione Propiedades. Cambie el campo Tiempo de espera de sesión (segundos) a 120 segundos. Para obtener más información, vea Cambiar el período de tiempo de espera de sesión de una réplica de disponibilidad (SQL Server).
- Cambie la conmutación automática por error de todas las réplicas a conmutación por error manual. En SSMS, haga clic con el botón derecho en réplica, seleccione Propiedades y cambie la conmutación automática por error de todas las réplicas a conmutación por error manual en la pestaña Propiedades. Para obtener más información, vea Cambiar el modo de conmutación por error de una réplica de disponibilidad (SQL Server).
- Aumente LeaseTimeout a 60 000 ms (60 segundos) y cambie HealthCheckTimeout a 90 000 ms (90 segundos). En Administrador de clústeres, haga clic con el botón derecho en el recurso de grupo de disponibilidad, seleccione Propiedades y, a continuación, cambie a la pestaña Propiedades para modificar ambas opciones. Para obtener más información, vea Configure HealthCheckTimeout Property Settings.
Mejoras del producto para reducir el impacto en SQL Server
Se han agregado cuatro mejoras principales a las versiones recientes de SQL Server para reducir el tamaño del archivo de volcado de memoria o el tiempo para generar el volcado de memoria:
- Mecanismo de filtrado de mapa de bits
- Eliminación de volcados repetidos en el mismo problema
- Salida abreviada en el registro de errores
- Compresión paralela de volcados de memoria
Mecanismo de filtrado de mapa de bits
SQL Server asigna un mapa de bits que realiza un seguimiento de las páginas de memoria que se van a excluir de un volcado de memoria filtrado. Sqldumper.exe lee el mapa de bits y filtra las páginas sin necesidad de leer otros metadatos del administrador de memoria. Verá los siguientes mensajes en el registro de errores de SQL Server cuando el mapa de bits está habilitado o deshabilitado respectivamente:
Page exclusion bitmap is enabled.
y Page exclusion bitmap is disabled.
SQL Server 2016
A partir de SQL Server 2016 SP2 CU13, el filtrado de mapa de bits está habilitado de forma predeterminada.
SQL Server 2017
- Esto no está disponible en RTM a CU15.
- En SQL Server 2017 CU16, puede habilitar el filtrado de mapa de bits a través de T8089 y deshabilitarlo desactivando T8089.
- A partir de SQL Server 2017 CU20, el filtrado de mapa de bits está habilitado de forma predeterminada. La marca de seguimiento T8089 ya no se aplicará y se omitirá si está activada. El filtrado de mapa de bits se puede deshabilitar a través de T8095.
SQL Server 2019
Esto está habilitado de forma predeterminada en SQL Server 2019 RTM. Se puede deshabilitar a través de T8095.
Eliminación de volcados repetidos en el mismo problema
Se eliminan volcados de memoria repetidos en el mismo problema. Con una firma de pila, el motor de SQL realiza un seguimiento si ya se ha producido una excepción y no generará un nuevo volcado de memoria si ya hay una. Esto se aplica a infracciones de acceso, desbordamiento de pila, aserciones e excepciones de daños en el índice. Esto reduce significativamente la cantidad de espacio en disco utilizado por los volcados de memoria y no inmoviliza el proceso temporalmente para generar un volcado de memoria. Esto se agregó en SQL Server 2019.
Salida abreviada en el registro de errores
El contenido generado en el registro de errores de SQL Server desde un único volcado de memoria no solo puede ser abrumador, sino que también puede ralentizar el proceso de generación de un volcado de memoria debido al tiempo necesario para serializar toda esta información en un formato de texto en el registro de errores. En SQL Server 2019, el contenido almacenado en el registro de errores tras la generación de volcados de memoria se ha reducido considerablemente y puede tener este aspecto:
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, SQL Server imprimiría información para cada sesión o subproceso cuando el usuario desencadenó un volcado manual.
Compresión paralela de volcados de memoria
Para generar volcados de memoria más rápido y hacer que sean más pequeños, se introdujo una característica de volcado de memoria comprimida en SQL Server 2022 CU8 y SQL Server 2019 CU23. Cuando se activa, Sqldumper.exe crea varios subprocesos para leer la memoria de un proceso simultáneamente, lo comprime y, a continuación, lo guarda en el archivo de volcado de memoria. Esta compresión en paralelo de varios subprocesos reduce el tamaño del archivo y acelera el proceso de volcado cuando se usa con volcados completos y filtrados.
Puede activar la marca de seguimiento 2610 para habilitar el volcado de memoria comprimido:
DBCC TRACEON (2610,-1)
GO
DBCC STACKDUMP with FILTERED_DUMP
GO
DBCC TRACEOFF (2610,-1)
Como alternativa, puede agregar -T2610
como parámetro de inicio a la instancia de SQL Server para que siempre cree volcados de memoria comprimidos.
Si ejecuta manualmente Sqldumper.exe, puede usar el -zdmp
parámetro para capturar un volcado de memoria comprimido. Por ejemplo:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp
También puede limitar cuántos núcleos Sqldumper.exe puede usar para crear el volcado comprimido mediante el -cpu:X
parámetro , donde X es el número de CPU. Este parámetro solo está disponible cuando se ejecuta manualmente Sqldumper.exe desde la línea de comandos:
Sqldumper.exe <ProcessID> 0 0x8100 0 d:\temp -zdmp -cpu:8
Factores que impiden o retrasan la creación de volcados de memoria
Se sabe que los siguientes factores provocan retrasos o impiden la creación de volcados de memoria.
- La ruta de acceso de E/S en la que se escriben los volcados de memoria funciona mal. En tales casos, para investigar y resolver el rendimiento de E/S de disco es el siguiente paso lógico.
- Un antivirus u otro software de supervisión interfiere con SQLDumper.exe. En algunos casos, la función Detour ReadProcessMemory de software de terceros. Esto puede aumentar drásticamente la duración del volcado. Para resolver la mayoría de estos problemas, deshabilite el software que interfiera o agregue SQLDumper.exe a una lista de exclusión.
Tipos de volcado
Los métodos siguientes se pueden usar para generar tres tipos diferentes de volcados: mini volcados, volcados completos y volcados filtrados.
Mini volcados con memoria a la que se hace referencia
Este tipo de volcado de memoria es una instantánea de todos los subprocesos activos del proceso ("pilas de subprocesos"), junto con un extracto limitado de la memoria a la que hacen referencia las pilas de subprocesos y otros datos clave de proceso o subproceso. Normalmente son unos pocos megabytes de tamaño y son rápidos para generar (de menos de un segundo a un par de segundos). Incluso sistemas de servidor más grandes (con cientos de CPU que impulsan indirectamente un número masivo de subprocesos en el proceso de SQL Server) rara vez superarán los 20-30 MB: el tamaño de un mini volcado no crece con el tamaño del proceso de SQL Server. Este tipo de volcado de memoria es el tipo predeterminado que usa SQL Server al generar volcados de memoria automáticamente en excepciones, problemas del programador, problemas de bloqueo temporal, daños en la base de datos y aserciones.
Nota:
SQL Server, como parte de su instrumentación integrada, generará "mini volcados de diagnóstico" automatizados en algunas situaciones específicas. Por lo tanto, esta operación se considera lo suficientemente segura como para que SQL Server pueda desencadenarla automáticamente cuando sea necesario.
Volcados completos
Un volcado de memoria completa es una copia completa del espacio de proceso de destino activo. Por lo tanto, incluiría todo el estado del subproceso, toda la memoria asignada por el proceso y todos los módulos cargados. Por lo tanto, los volcados completos tendrán un tamaño, que es aproximadamente el mismo proceso de SQL Server, que a su vez puede ser casi tan grande como la RAM total del sistema. En servidores grandes dedicados a una sola instancia de SQL Server que podría significar un archivo, que es varios cientos de gigabytes o más. No es necesario decir que este archivo tardará mucho tiempo en generarse y, por tanto, inducirá la inmovilización prolongada. El rendimiento del disco para el destino de archivo del volcado influirá significativamente en el tiempo de congelación. Este tipo de volcado de memoria rara vez se usa para SQL Server en la actualidad, como se describe en la explicación siguiente.
Volcados filtrados
A medida que aumenta constantemente el tamaño de RAM de los servidores típicos que ejecutan SQL Server, los volcados completos se vuelven más inconfundibles. Por lo tanto, se implementan volcados filtrados. Un volcado filtrado es un subconjunto de un volcado completo, donde se excluyen grandes áreas de memoria de SQL Server sobre la marcha y no se escriben en el disco. Normalmente, la memoria excluida no aporta ningún valor añadido a la solución de problemas. Algunos ejemplos son páginas de datos/índice y algunas cachés internas, como páginas de datos hekaton y memoria del grupo de registros. Este volcado filtrado da como resultado un archivo más pequeño que un volcado completo, pero el volcado sigue conservando casi toda su utilidad. Los volcados filtrados han reemplazado a los volcados completos como opción preferida en una gran mayoría de situaciones en las que los mini volcados de memoria no son suficientes. La disminución del tamaño puede variar en comparación con un volcado de memoria completo, pero sigue siendo un archivo bastante grande, que a menudo es del 30 al 60 por ciento del tamaño del proceso de SQL Server. Por lo tanto, es mejor planear un tamaño tan grande como un volcado completo como una peor opción, lo que deja un buen margen de seguridad. Es posible que un volcado filtrado no sea necesariamente más rápido que un volcado completo en cada caso: es cuestión de si las ganancias relacionadas con el número de E/S evitadas superan el tiempo necesario para implementar la lógica de filtro (la velocidad del disco y la velocidad de CPU/RAM influirán en eso).
Puede usar la consulta siguiente para obtener una estimación aproximada del tamaño de volcado filtrado. Aunque la expectativa es que la mayoría de los datos o páginas de índice se excluyen del volcado de memoria, no se omitirán los que están exclusivamente en bloqueo temporal y que se modifican.
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE type != 'MEMORYCLERK_SQLBUFFERPOOL'
Dado que puede usar Sqldumper.exe para generar un archivo de volcado a petición para cualquier aplicación de Microsoft Windows, puede considerar la posibilidad de usar la opción de volcado filtrado. Sin embargo, un archivo de volcado filtrado solo es aplicable y significativo en el contexto de SQL Server. Todavía puede generar un minivolcado de memoria, un archivo de volcado completo o aplicaciones que no sean de SQL Server correctamente.
El proceso de SQL Server llama a la herramienta Sqldumper.exe internamente para generar un archivo de volcado cuando el proceso experimenta excepciones. SQL Server pasa parámetros a Sqldumper.exe. Puede usar marcas de seguimiento para cambiar los parámetros que SQL Server pasa a la herramienta de forma predeterminada cuando se produce una excepción o aserción. Estas marcas de seguimiento están en el intervalo de 2540 a 2559. Puede usar una de estas marcas de seguimiento para cambiar el tipo de volcado predeterminado SQLDumper.exe generar (el valor predeterminado es un minivolcado con memoria a la que se hace referencia). Por ejemplo:
- Marca de seguimiento 2551: genera un volcado de memoria filtrado.
- Marca de seguimiento 2544: genera un volcado de memoria completo.
- Marca de seguimiento 8026: SQL Server borrará un desencadenador de volcado después de generar el volcado de memoria una vez.
Si dos o más marcas de seguimiento están activas, se respeta la opción que indica el volcado de memoria más grande. Por ejemplo, si se usan marcas de seguimiento 2551 y 2544, SQL Server crea un volcado de memoria completo.
Generación de un volcado de memoria en conmutaciones por error de clúster
En escenarios de conmutación por error de clúster, el archivo DLL de recursos de SQL Server puede obtener un archivo de volcado de memoria antes de que se produzca la conmutación por error para ayudar a solucionar problemas. Cuando el archivo DLL de recurso de SQL Server determina que se ha producido un error en un recurso de SQL Server, la DLL usa la utilidad Sqldumper.exe para obtener un archivo de volcado de memoria del proceso de SQL Server. Para asegurarse de que la herramienta Sqldumper.exe genera correctamente el archivo de volcado, debe establecer las tres propiedades siguientes como requisitos previos:
SqlDumperDumpTimeOut
Tiempo de espera especificado por el usuario. El archivo DLL de recursos espera a que el archivo de volcado se complete antes de que el archivo DLL de recursos detenga el servicio SQL Server.
SqlDumperDumpPath
Ubicación donde la herramienta Sqldumper.exe genera el archivo de volcado.
SqlDumperDumpFlags
Marcas que Sqldumper.exe usan.
Si no se establece ninguna de las propiedades, Sqldumper.exe no puede generar el archivo de volcado de memoria. Se registra un mensaje de advertencia en el registro de eventos y en el registro del clúster cada vez que el recurso se pone en línea.
Configuración del clúster para SQLDumper en SQL Server 2012 y versiones posteriores
Puede usar el ALTER SERVER CONFIGURATION
comando (T-SQL) para modificar estas propiedades. Por ejemplo:
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;
Como alternativa, puede usar scripts de PowerShell. Por ejemplo, para una instancia con nombre 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 comprobar si se aplica la configuración, puede ejecutar el siguiente comando de PowerShell:
Get-ClusterResource -Name "SQL Server (SQL2017AG)" | Get-ClusterParameter
Configuración del clúster para SQLDumper en SQL Server 2008/2008 R2 o Windows 2012 y versiones anteriores
Para establecer las propiedades de la utilidad Sqldumper.exe para la conmutación por error del clúster mediante el comando de recurso de clúster, siga estos pasos:
- Seleccione Iniciar>ejecución, escriba cmd y, a continuación, seleccione Aceptar.
- Para cada propiedad, escriba el comando correspondiente en el símbolo del sistema y presione Entrar:
La propiedad
SqlDumperDumpFlags
Para establecer la
SqlDumperDumpFlags
propiedad de un archivo de volcado específico, escriba el comando correspondiente en el símbolo del sistema y presione Entrar:Todo el archivo de volcado completo del subproceso
Instancia predeterminada
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
Todos los archivos de minivolcado de subproceso
Instancia predeterminada
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x0120
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x0120
Filtrado de todo el archivo de volcado de subproceso
Instancia predeterminada
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x8100
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x8100
La propiedad
SqlDumperDumpPath
cluster resource "SQL Server" /priv SqlDumperDumpPath = <DirectoryPath>
Nota:
<DirectoryPath> es un marcador de posición para el directorio en el que se generará el archivo de volcado de memoria y debe especificarse entre comillas (" ").
La propiedad
SqlDumperDumpTimeOut
cluster resource "SQL Server" /priv SqlDumperDumpTimeOut = <Timeout>
Nota:
<El tiempo de espera> es un marcador de posición para el tiempo de espera en milisegundos (ms).
El tiempo que tarda la herramienta en generar un archivo de volcado de memoria de un proceso de SQL Server depende de la configuración del equipo. Para un equipo con una gran cantidad de memoria, el tiempo podría ser significativo. Para calcular el tiempo necesario para el proceso, use la herramienta Sqldumper.exe para generar manualmente un archivo de volcado de memoria. Los valores válidos de la SqlDumperDumpTimeOut
propiedad son de 10 000 ms a MAXDWORD. MAXDWORD representa el valor más alto en el intervalo del tipo de datos DWORD (4294967295).
Para comprobar que la configuración está habilitada, puede ejecutar el siguiente comando:
cluster resource "SQL Server" /priv
Eliminación de propiedades de Sqldumper.exe para la conmutación por error del clúster
Para quitar las propiedades de la herramienta Sqldumper.exe para la conmutación por error del clúster, siga estos pasos:
Seleccione Iniciar>ejecución, escriba cmd y, a continuación, seleccione Aceptar.
Para una propiedad específica, escriba el comando correspondiente en el símbolo del sistema y presione Entrar:
La propiedad
SqlDumperDumpFlags
Instancia predeterminada
cluster resource "SQL Server" /priv:SqlDumperDumpFlags /usedefault
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpFlags /usedefault
La propiedad
SqlDumperDumpPath
Instancia predeterminada
cluster resource "SQL Server" /priv:SqlDumperDumpPath /usedefault
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpPath /usedefault
La propiedad
SqlDumperDumpTimeOut
Instancia predeterminada
cluster resource "SQL Server" /priv:SqlDumperDumpTimeOut /usedefault
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv:SqlDumperDumpTimeOut /usedefault
Cómo usar DBCC STACKDUMP
El DBCC STACKDUMP
comando puede ayudarle a crear un volcado de memoria en el directorio LOG de la instalación de la instancia de SQL Server. El comando creará de forma predeterminada un minivolcado con todos los subprocesos, que tiene un tamaño limitado y es adecuado para reflejar el estado del proceso de SQL Server. Ejecute el siguiente comando en un cliente de SQL Server:
DBCC STACKDUMP
Para obtener la funcionalidad extendida de DBCC STACKDUMP
en SQL Server 2019, consulte Funcionalidad de DBCC STACKDUMP extendida introducida en SQL Server 2019.
Para habilitar este método para crear un volcado filtrado, active las marcas de seguimiento 2551 mediante el comando siguiente:
DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP
Para crear un volcado de memoria completo, use la marca de seguimiento 2544.
Después de obtener el archivo de volcado de memoria, debe deshabilitar la marca de seguimiento mediante el comando DBCC TRACEOFF (<TraceNumber>, -1);
para evitar la actualización involuntaria de todos los minivolcados de autodiagnóstico de SQL Server a volcados de memoria mayores. En el comando, <TraceNumber> es la marca de seguimiento que ha habilitado anteriormente, como 2551 o 2544. Por ejemplo:
DBCC TRACEOFF(2551, -1)
En caso de que no esté seguro de qué marca de seguimiento permanece activa, ejecute el siguiente comando:
DBCC TRACESTATUS(-1)
Un conjunto de resultados vacío indica que no hay ninguna marca de seguimiento activa. Por el contrario, si 2551 sigue activo, verá lo siguiente:
TraceFlag | Estado | Global | Sesión |
---|---|---|---|
2551 | 1 | 1 | 0 |
Nota:
Los traceflag
habilitados por DBCC TRACEON
se restablecen (quitan) después de reiniciar un servicio.
Funcionalidad DE DBCC STACKDUMP extendida introducida en SQL Server 2019
A partir de SQL Server 2019 CU2, el DBCC STACKDUMP
comando se extendió para admitir la generación de volcados de memoria de diferentes tipos: mini, filtrado y volcados completos. Este comando elimina la necesidad de usar marcas de seguimiento. También permite limitar la salida de texto en el otro archivo de texto que se genera con el volcado de memoria. Si lo hace, puede proporcionar una ganancia de rendimiento visible en el tiempo que tarda SQLDumper.exe en generar un volcado de memoria.
DBCC STACKDUMP WITH MINI_DUMP | FILTERED_DUMP | FULL_DUMP [, TEXT_DUMP = LIMITED | DETAILED]
TEXT_DUMP = LIMITED
es la opción predeterminada. Si desea recibir una salida detallada en el archivo SQLDump000X.txt , puede usar TEXT_DUMP = DETAILED
.
Para generar un volcado filtrado con salida limitada en el archivo .txt , ejecute el siguiente comando:
DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED
Uso de un script de PowerShell para generar un archivo de volcado con SQLDumper
Guarde el código siguiente como un archivo PS1, por ejemplo SQLDumpHelper.ps1:
Detalles del 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."
Ejecútelo desde el símbolo del sistema como administrador mediante el comando siguiente:
Powershell.exe -File SQLDumpHelper.ps1
O ejecútelo desde la consola de Windows PowerShell y ejecútelo como administrador mediante el siguiente comando:
.\SQLDumpHelper.ps1
Nota:
Si nunca ha ejecutado scripts de PowerShell en el sistema, puede recibir el siguiente mensaje de error:
"Archivo ... SQLDumpHelper.ps1 no se puede cargar porque los scripts en ejecución están deshabilitados en este sistema".
Para habilitar la capacidad de ejecutar los comandos, siga estos pasos:
Inicie la consola de Windows PowerShell mediante la opción Ejecutar como administrador . Solo los miembros del grupo de administradores del equipo pueden cambiar la directiva de ejecución.
Habilite la ejecución de scripts sin firmar mediante el siguiente comando:
Set-ExecutionPolicy RemoteSigned
Nota:
Esto le permitirá ejecutar scripts sin firmar que cree en el equipo local y scripts firmados desde Internet.