Uso de la herramienta Sqldumper.exe para generar un archivo de volcado de memoria en SQL Server
En este artículo se proporcionan instrucciones generales para la herramienta de 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 informes de errores o depuración 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 adjunto 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.
Cómo ejecutar Sqldumper.exe manualmente
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 <SQLServerInstall Drive>:\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 de memoria mediante la herramienta Sqldumper.exe, siga estos pasos:
Abra <SQLServerInstall Drive>:\Program Files\Microsoft SQL Server\<number>\Shared folder.
En esta ruta de acceso de carpeta, <number> es un marcador de posición para una de las versiones siguientes:
- 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, <number> es el mismo marcador de posición que cambia con la versión de SQL Server, como se describió anteriormente.
Para generar un tipo específico de archivo de volcado de memoria, escriba el comando correspondiente en el símbolo del sistema y, a continuación, presione Entrar:
Archivo de volcado completo:
Sqldumper.exe <ProcessID> 0 0x01100
Archivo de volcado de memoria:
Sqldumper.exe <ProcessID> 0 0x0120
Archivo de volcado 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 está instalada la herramienta.
El archivo de volcado 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 las fechas y horas de creación para buscar el archivo que desee.
Obtención de un identificador de proceso de aplicación de Microsoft Windows
Para generar un archivo de volcado de memoria mediante la herramienta Sqldumper.exe, debe tener el identificador de proceso de la aplicación windows para la que desea generar un archivo de volcado de memoria. A continuación 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 de Windows para la que desea generar un archivo de volcado. En el caso de la aplicación SQL Server, tenga en cuenta el identificador de proceso del proceso deSqlservr.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 deSqlservr.exe .
Ruta de acceso de salida para los 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. 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 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 está en investigación.
- Haga clic con el botón derecho en esa entrada, seleccione Propiedades y, a continuación, vaya a la pestaña Opciones 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 Sqldumper.exe se usa manualmente para generar un archivo de volcado de memoria para cualquier aplicación de Windows, el archivo de volcado podría ser tan grande como la memoria que la aplicación de Windows está usando actualmente. Asegúrese de que hay 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 donde 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 mini volcado:
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 del 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 siguientes variables:
- 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
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 con la que se ejecuta el servicio SQL Server.
Para que la herramienta 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 detecta 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 del directorio actual. A continuación se muestran dos posibles mensajes de error y sus causas:
Mensaje | 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 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 el 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 memoria de un proceso en modo de usuario (como se describe en este artículo, en lugar de los volcados de kernel del sistema operativo, que están fuera de nuestro ámbito), el proceso de destino (aquí SQLServer.exe) se inmoviliza durante el tiempo necesario para 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 de 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 de pared también podría verse vulnerado 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í, impulsado por lo siguiente:
- Tipo de volcado seleccionado.
- El tamaño del proceso de SQL Server en memoria, que en el caso de una sola instancia activa que ejecuta parámetros predeterminados suele estar cerca de la RAM física total del servidor.
- Rendimiento del disco utilizado como destino para el volcado.
Además, se debe planear el tamaño del archivo de volcado en el disco, especialmente si varios volcados son una posibilidad y si se seleccionan tipos de volcado de memoria grandes y no predeterminados. Asegúrese de revisar los tipos de volcado de memoria para saber qué esperar. De forma predeterminada, algunos métodos de volcado de memoria crean el volcado en la carpeta \Log de la instancia de SQL Server, que, en configuración simple predeterminada, también sería disco del sistema y disco de datos y registro para SQL Server. Llevar ese disco a la saturación tiene un impacto grave en la disponibilidad de SQL Server o del sistema.
Administración del impacto en los sistemas en clúster
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 del clúster de conmutación por error como el grupo de disponibilidad). La generación de volcado de memoria de distintos procesos afecta a los recursos de forma diferente. Lea detenidamente las secciones Impacto de la generación de volcados de memoria y Tipos de volcado de memoria .
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 en clúster 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 se genera 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. El cambio se puede revertir después de realizar 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 se reinicie en la pestaña Directivas .
- En la pestaña Propiedades , aumente el tiempo de espera de HealthCheck. Por ejemplo, establezca el valor de propiedad en 180 segundos o superior. Si se alcanza este tiempo de espera, la directiva Si se produce un error en el recurso, no se omite el reinicio y se reinicia el recurso.
- En la pestaña Propiedades , cambie el valor FailureConditionLevel a cero.
- Para ag, 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, a continuación, 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 Session-Timeout de una réplica de disponibilidad (SQL Server).
- Cambie la conmutación por error automática 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 por error automática 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 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 Configuración de la propiedad HealthCheckTimeout.
Mejoras del producto para reducir el impacto en SQL Server
Se agregan cuatro mejoras importantes a las versiones recientes de SQL Server para reducir el tamaño del archivo de volcado 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 filtrado. Sqldumper.exe lee el mapa de bits y filtra las páginas sin necesidad de leer ningún otro metadato 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 través de 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 los volcados de memoria repetidos en el mismo problema. Con una firma de pila, el motor de SQL realiza un seguimiento de si ya se ha producido una excepción y no generará un nuevo volcado de memoria si ya hay uno. Esto se aplica a las infracciones de acceso, el desbordamiento de pila, las aserciones y las excepciones de daños en el índice. Esto reduce significativamente la cantidad de espacio en disco que usan los volcados de memoria y no inmoviliza temporalmente el proceso para generar un volcado. 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 al generar el volcado 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, por ejemplo.
Compresión paralela de volcados de memoria
Para generar volcados más rápido y reducir su tamaño, se introdujo una característica de volcado de memoria comprimido 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, la comprime y, a continuación, la guarda en el archivo de volcado. Esta compresión en paralelo multiproceso 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 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 volcados de memoria tiene un rendimiento deficiente. 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 está interfiriendo con SQLDumper.exe. En algunos casos, la función ReadProcessMemory de desvío de software de terceros . Esto puede aumentar considerablemente la duración del volcado. Para resolver la mayoría de estos problemas, deshabilite el software que interfiere o agregue SQLDumper.exe a una lista de exclusión.
Tipos de volcado de memoria
Los métodos siguientes se pueden usar para generar tres tipos diferentes de volcados de memoria: mini volcados, volcados completos y volcados filtrados.
Volcados mínimos con memoria referenciada
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 de subproceso o proceso clave. Suelen tener un tamaño de unos pocos megabytes y son rápidos de generar (de menos de un segundo a un par de segundos). Los sistemas de servidor aún 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 aumenta 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 completo 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 del proceso y todos los módulos cargados. Por lo tanto, los volcados completos tendrán un tamaño, que es aproximadamente el mismo del 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 única instancia de SQL Server que podría significar un archivo, que es varios cientos de gigabytes o más. No hace falta decir que un archivo de este tipo tardará mucho tiempo en generarse y, por lo tanto, provocará una 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 en SQL Server hoy en día, 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 difíciles de manejar. Por lo tanto, se implementan volcados filtrados. Un volcado filtrado es un subconjunto de un volcado completo, donde grandes áreas de memoria de SQL Server se excluyen 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 las páginas de datos o índices y algunas memorias caché internas, como las páginas de datos de Hekaton y la memoria del grupo de registros. Este volcado filtrado da como resultado un archivo más pequeño que un volcado completo, pero el volcado conserva casi toda su utilidad. Los volcados filtrados han reemplazado los volcados completos como la opción preferida en una gran mayoría de situaciones en las que los mini volcados no son suficientes. La disminución del tamaño puede variar en comparación con un volcado completo, pero sigue siendo un archivo bastante grande, que suele ser entre el 30 y el 60 por ciento del tamaño del proceso de SQL Server. Por lo tanto, es mejor planear un tamaño posible 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 de generar que un volcado completo en todos los casos: se trata 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 ello).
Puede usar la siguiente consulta para obtener una estimación aproximada del tamaño de volcado filtrado. Aunque la expectativa es que la mayoría de las páginas de datos o índices se excluyan del volcado de memoria, no se omitirán las que se bloquee y se modifiquen exclusivamente.
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 mini volcado, un archivo de volcado completo o aplicaciones que no son de SQL Server correctamente.
El proceso de SQL Server llama internamente a la herramienta Sqldumper.exe 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 una 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 mini volcado con memoria referenciada). 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 una vez.
Si hay dos o más marcas de seguimiento 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 antes de que se produzca la conmutación por error para ayudar a solucionar problemas. Cuando el archivo DLL de recursos de SQL Server determina que se ha producido un error en un recurso de SQL Server, el archivo DLL de recursos de SQL Server usa la utilidad Sqldumper.exe para obtener un archivo de volcado 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 del recurso espera a que el archivo de volcado se complete antes de que el archivo DLL del recurso detenga el servicio SQL Server.
SqlDumperDumpPath
Ubicación donde la herramienta Sqldumper.exe genera el archivo de volcado.
SqlDumperDumpFlags
Marcas que Sqldumper.exe usa.
Si no se establece ninguna de las propiedades, Sqldumper.exe no puede generar el archivo de volcado. Se registra un mensaje de advertencia tanto en el registro de eventos como en el registro del clúster cada vez que el recurso se conecta.
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 recursos 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 de memoria específico, escriba el comando correspondiente en el símbolo del sistema y, a continuación, presione Entrar:Todo el archivo de volcado de memoria completo del subproceso
Instancia predeterminada
cluster resource "SQL Server" /priv SqlDumperDumpFlags = 0x01100
Instancia con nombre
cluster resource "SQL Server (INSTANCE1)" /priv SqlDumperDumpFlags = 0x01100
Todo el archivo de mini volcado de subprocesos
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 subprocesos
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:
<Timeout> 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. Los valores válidos para la SqlDumperDumpTimeOut
propiedad van de 10 000 ms a MAXDWORD. MAXDWORD representa el valor más alto del 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
Uso de 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 una funcionalidad extendida de DBCC STACKDUMP
en SQL Server 2019, consulte Funcionalidad de STACKDUMP de DBCC extendida introducida en SQL Server 2019.
Para habilitar este método para crear un volcado filtrado, active las marcas de seguimiento 2551 mediante el siguiente comando:
DBCC TRACEON(2551, -1)
GO
DBCC STACKDUMP
Para crear un volcado completo, use la marca de seguimiento 2544.
Después de obtener el archivo de volcado, debe deshabilitar la marca de seguimiento mediante el comando DBCC TRACEOFF (<TraceNumber>, -1);
para evitar actualizar involuntariamente todos los minidumps de autodiagnóstica de SQL Server adicionales a volcados de memoria más grandes. 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 el servicio.
Funcionalidad de STACKDUMP de DBCC extendida introducida en SQL Server 2019
A partir de SQL Server 2019 CU2, el comando se extendió para admitir la DBCC STACKDUMP
generación de volcados de memoria de diferentes tipos: volcados mínimos, filtrados y 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, podría proporcionar una ganancia de rendimiento visible en el tiempo que se 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 una salida limitada en el archivo .txt , ejecute el siguiente comando:
DBCC STACKDUMP WITH FILTERED_DUMP , TEXT_DUMP = LIMITED
Cómo usar 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 siguiente comando:
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, es posible que reciba el siguiente mensaje de error:
"El archivo ...SQLDumpHelper.ps1 no se puede cargar porque la ejecución de scripts está deshabilitada 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.