Compartir a través de


MSSQLSERVER_19407

Se aplica a: SQL Server

Detalles

Attribute Valor
Nombre del producto SQL Server
Id. de evento 19 407
Origen de eventos MSSQLSERVER
Componente SQLEngine
Nombre simbólico HADR_AG_LEASE_EXPIRED
Texto del mensaje La concesión entre el grupo de disponibilidad "%.*ls" y el clúster de conmutación por error de Windows Server ha expirado. Ha habido un problema de conectividad entre la instancia de SQL Server y el clúster de conmutación por error de Windows Server. Para determinar si el grupo de disponibilidad se recupera ante un error correctamente, compruebe el recurso del grupo de disponibilidad correspondiente en el clúster de conmutación por error de Windows Server.

Explicación

El error 19407 se genera en el registro de errores de SQL Server cuando se pierde la comunicación entre SQL Server y el clúster de conmutación por error de Windows Server. Normalmente, se produce una acción correctiva: una migración en caso de fallo a otro nodo de AlwaysOn.

Una concesión es un mecanismo de comunicación temporal que tiene lugar entre SQL Server y el proceso del clúster de conmutación por error de Windows Server (WSFC), específicamente el proceso RHS.EXE. Los dos procesos se comunican entre sí periódicamente para asegurarse de que el otro proceso se está ejecutando y respondiendo. Esta comunicación tiene lugar mediante objetos Event de Windows y garantiza que no se produzca una conmutación por error del recurso del grupo de disponibilidad sin el conocimiento del WSFC. Si uno de los procesos no responde a la comunicación de concesión según un período de concesión predefinido, la concesión entra en tiempo de espera. Para obtener información detallada, consulte Mecanismos e instrucciones de concesión, clúster y tiempos de espera de comprobación de estado para grupos de disponibilidad AlwaysOn. Vea también Cómo funciona: Tiempo de espera de concesión alwaysOn de SQL Server

Causas

Dado que los eventos de Windows son objetos de sincronización ligeros, hay un número relativamente pequeño de factores externos que les afectan negativamente. Los problemas típicos que pueden dar lugar a un tiempo de espera de concesión implican problemas de todo el sistema. Esta es una lista de posibilidades que pueden provocar la expiración de la concesión y provocar un reinicio o conmutación por error:

  • Uso elevado de CPU en el sistema (cerca del 100 %).

  • Condiciones insuficientes de memoria: se está paginando una memoria virtual baja o uno de los procesos.

  • WSFC se queda sin conexión debido a la pérdida de cuórum. Para solucionar problemas de pérdida de cuórum, consulte Configuración y administración del cuórum y Recuperación ante desastres de WSFC a través del cuórum forzado (SQL Server).

  • Limitación de máquinas virtuales que afecta al rendimiento y a la expiración de la concesión.

  • El proceso de SQL Server no responde al generar un volcado de memoria grande. Para obtener más información sobre la generación de volcados de pila, consulte Impacto de la generación de volcados de memoria. La generación de volcados de pila puede producirse por algunos de los siguientes motivos:

    • Programador no inflexible
    • Tiempo de espera de bloqueo temporal
    • Programador interbloqueo
    • Interbloqueo sin resolver

Acción del usuario

Solución de problemas elevados de CPU

  1. Abra el Administrador de tareas.

  2. Vaya a la pestaña Rendimiento y vea si las CPU están cerca o en un 100 % de uso.

  3. Vaya a la pestaña Procesos y ordene los procesos por la columna CPU en orden descendente; para ello, seleccione en la columna CPU .

  4. Identifique el proceso que usa la mayoría de la CPU y trabaje en la comprensión y resolución del motivo por el que causa el uso elevado de la CPU.

  5. Si el proceso es SQL Server, consulte Solución de problemas de uso elevado de CPU en SQL Server.

  6. Puede usar el siguiente script de PowerShell para comprobar el uso de cpu en el sistema.

    Get-Counter -Counter "\Processor(_Total)\% Processor Time" -SampleInterval 5 -MaxSamples 30 |
        Select-Object -ExpandProperty CounterSamples | Select-Object TimeStamp, Path, CookedValue
    

Solución de problemas de falta de memoria

Si hay apariciones de poca memoria virtual o física en el sistema, el proceso de SQL Server o del servicio host de recursos de clúster (RHS.exe) se podría paginar. Si el proceso se pagina en el disco, no se ejecuta activamente y el tiempo de espera de concesión podría alcanzarse con la memoria de tiempo disponible y los bytes virtuales del proceso se paginan de nuevo en la memoria física. La memoria virtual baja puede deberse a aplicaciones, controladores o sistema operativo que consumen toda la memoria del sistema. Use los métodos siguientes para solucionar este problema:

  1. Compruebe si hay errores en el registro de eventos de aplicación o sistema, como Your system is low on virtual memory. Es posible que incluso vea este error en pantalla si ha iniciado sesión en el servidor.

  2. Abra el Administrador de tareas, seleccione Rendimiento:> memoria para comprobar si se consume cerca del 100 % de la memoria. Use la pestaña Detalles para identificar las aplicaciones que podrían ser los consumidores de memoria más grandes.

  3. También puede usar Monitor de rendimiento y supervisar estos contadores a lo largo del tiempo:

    • Process\Working Set : para comprobar el uso de memoria de procesos individuales
    • Memoria\MBytes disponibles: para comprobar el uso general de la memoria en el sistema

    Puede usar el siguiente script de PowerShell para identificar el uso general de memoria en todo el proceso y la memoria disponible en el sistema. Si desea obtener el uso de memoria de procesos individuales, cámbielo "\Process(_Total)\Working Set" a "\Process(*)\Working Set".

    $serverName = $env:COMPUTERNAME
    $Counters = @(
      ("\\$serverName" + "\Process(_Total)\Working Set") , ("\\$serverName" + "\Memory\Available Bytes")
    )
    
    Get-Counter -Counter $Counters -MaxSamples 30 | ForEach-Object {
        $_.CounterSamples | ForEach-Object {
            [pscustomobject]@{
                TimeStamp = $_.TimeStamp
                Path      = $_.Path
                Value_MB  = ([Math]::Round($_.CookedValue, 3)) / 1024 / 1024
            }
            Start-Sleep -s 5
        }
    }
    
  4. Si identifica aplicaciones específicas que consumen grandes cantidades de memoria, considere la posibilidad de detener o mover esas aplicaciones en otro sistema o controlar su uso de memoria.

  5. Si SQL Server consume grandes cantidades de memoria, puede considerar la posibilidad de usar sp_configure 'max server memory' para reducir su uso de memoria.

Monitor de rendimiento recopilación de datos para CPU, memoria y disco

Este script de PowerShell facilita la recopilación de datos del monitor de rendimiento (PerfMon) con respecto a la CPU, la memoria y el disco. El script está diseñado para ser flexible, lo que permite personalizar las instancias predeterminadas y con nombre de SQL Server.

#Replace with your instance name if need to collect PerfMon data for named instance
$InstanceName = 'MSSQLSERVER'

# Replace with your desired location
$Location = "D:\PerfMonLogs"

# Function to create performance counter log
function Create-PerfCounterLog {
    param
    (
        [string]$InstanceName,
        [string]$Location
    )
    $counters = @(
        '\Memory\*',
        '\PhysicalDisk(*)\*',
        '\LogicalDisk(*)\*',
        '\Server\*',
        '\System\*',
        '\Process(*)\*',
        '\Processor(*)\*',
        '\SQLServer:Databases(*)\*',
        '"\SQLServer:Buffer Manager\*"',
        '"\SQLServer:SQL Statistics\*"',
        '"\SQLServer:Transactions\*"',
        '"\SQLServer:Database Mirroring\*"',
        '"\SQLServer:Latches\*"',
        '"\SQLServer:General Statistics\*"',
        '"\SQLServer:Availability Replica(*)\*"',
        '"\SQLServer:Plan Cache(*)\*"'
    )
    if ($InstanceName -eq 'MSSQLSERVER') {
        # This is for the default SQL Server instance
        $logmanCommand = "logman create counter MS_perf_log -f bin -c $counters"

    }
    else {
        # This is for a named SQL Server instance
        $InstanceName = "MSSQL`$$InstanceName"
        $counters = $counters -replace 'SQLServer', $InstanceName
        $logmanCommand = "logman create counter MS_perf_log -f bin -c $counters"

    }

    $Location = $Location + '\MS_perf_log.blg'
    $logmanCommand += " -si 00:00:01 -max 500 -o $Location"

    Start-Process -FilePath "cmd.exe" -ArgumentList "/c $logmanCommand" -Verb RunAs -Wait

}

# Function to start the collector
function Start-PerfCounterLog {
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman start MS_perf_log" -Verb RunAs -Wait
}

# Function to stop and delete the collector
function Stop-Delete-PerfCounterLog {
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman stop MS_perf_log" -Verb RunAs -Wait
    Start-Process -FilePath "cmd.exe" -ArgumentList "/c logman delete MS_perf_log" -Verb RunAs -Wait
}

# Create folder if not exists - update the file path as per your environment
$folderPath = $Location
if (-not (Test-Path $folderPath)) {
    New-Item -Path $folderPath -ItemType Directory
}

# Create performance counter log
Create-PerfCounterLog -InstanceName $InstanceName -Location $Location

# Start the collector
Start-PerfCounterLog

# If the event has occurred again and captured, then stop the collector
# Uncomment below line when you want to stop and delete the collector
# Stop-Delete-PerfCounterLog

Reducir o evitar grandes volcados de memoria del proceso de clúster o SQL Server

En algunos casos, el proceso de SQL Server podría encontrar excepciones, aserciones, problemas del programador, etc. En esos casos, SQL Server desencadena el SQLDumper.exe proceso de forma predeterminada para generar un minivolcado con memoria indirecta. Sin embargo, si esa generación de volcado de memoria tarda mucho tiempo, el proceso de SQL Server deja de responder, lo que podría desencadenar un tiempo de espera de concesión. Entre las causas comunes de un volcado de memoria se tarda mucho tiempo:

  • uso de memoria grande por el proceso
  • el subsistema de E/S donde se escribe el volcado de memoria es lento.
  • La configuración predeterminada se cambió de mini volcado a un volcado filtrado o completo

Para evitar un tiempo de espera de concesión, siga estos pasos en los sistemas de grupo de disponibilidad:

  • Aumentar el tiempo de espera de sesión, por ejemplo, 120 segundos para todas las réplicas
  • Cambio de la conmutación automática por error de todas las réplicas a conmutación por error manual
  • Aumente leaseTimeout a 60 000 ms (60 segundos) y cambie HealthCheckTimeout a 90 000 ms (90 segundos).

Para obtener más información, consulte Uso de la herramienta Sqldumper.exe para generar un archivo de volcado en SQL Server.

Comprobación de la configuración de máquina virtual (VM) para el sobreaprovisionamiento

Si usa una máquina virtual, asegúrese de no aprovisionar o sobreaprovisionar o sobreaprovisionar recursos de memoria y CPU. El aprovisionamiento excesivo de CPU o memoria podría hacer que el sistema operativo invitado se quedese sin recursos y mostrar los mismos problemas descritos anteriormente: cpu elevada y poca memoria. Con frecuencia, si está viendo cosas dentro del sistema operativo invitado, explicando por qué se está quedando sin recursos informáticos es difícil, ya que las cosas están sucediendo fuera de la propia máquina virtual. La sobreasignación de recursos puede provocar detención temporal del procesamiento, lo que probablemente provocará tiempos de espera de concesión. Para obtener más información sobre cómo abordar la sobrecommitción, consulte Solución de problemas de rendimiento de máquinas virtuales ESX/ESXi (2001003) y Virtualización: sobreasignación de memoria y cómo detectarla dentro de la máquina virtual.

Comprobación de la migración o copia de seguridad de máquinas virtuales (VM)

Hyper-V, VMware y otras soluciones de máquina virtual ofrecen la capacidad de mover máquinas virtuales entre máquinas host (Migración en vivo de Hyper-V y VMware vMotion). En la mayoría de los casos, estas tecnologías proporcionan una migración casi instantánea. Sin embargo, si hay cuellos de botella de la máquina host o de red, estas migraciones se pueden prolongar, lo que hace que la máquina virtual esté en un estado suspendido y no operativo. Esto puede provocar la expiración del tiempo de espera de concesión entre SQL Server y los procesos del clúster. Resuelva los problemas con la migración de la máquina virtual antes de solucionar los problemas de tiempo de espera de concesión.

Las soluciones de copias de seguridad de máquinas virtuales también pueden provocar un tiempo de inactividad para las máquinas virtuales. Si se realiza una copia de seguridad de máquina virtual en el sistema operativo host, o cualquier mantenimiento similar se realiza en la máquina host que tarda mucho tiempo, puede provocar un problema de tiempo de espera de concesión. El motivo es que, mientras el reloj está marcando, los procesos de CLÚSTER y SQL Server no pueden comunicarse entre sí en la máquina virtual suspendida. Solucione los retrasos causados por las copias de seguridad de máquina virtual u otro mantenimiento en primer lugar, antes de examinar los problemas de tiempo de espera de concesión.