Solucionar problemas de configuración de grupos de disponibilidad AlwaysOn (SQL Server)

Se aplica a:SQL Server

En este tema se proporciona información para ayudarle a solucionar los problemas más habituales relacionados con la configuración de las instancias de servidor para Grupos de disponibilidad AlwaysOn. Algunos de los problemas de configuración más habituales son que los grupos de disponibilidad AlwaysOn están deshabilitados, las cuentas no están configuradas correctamente, el punto de conexión de creación de reflejo de la base de datos no existe, el punto de conexión no es accesible (error 1418 de SQL Server), el acceso de red no existe y un comando de unión genera el error 35250 de SQL Server.

Nota

Asegúrese de que cumple los requisitos previos de Grupos de disponibilidad AlwaysOn . Para más información, consulte Requisitos previos, restricciones y recomendaciones para grupos de disponibilidad AlwaysOn (SQL Server).

En este tema:

Sección Descripción
Los grupos de disponibilidad Always On no están habilitados Si una instancia de SQL Server no está habilitada para grupos de disponibilidad Always On, la instancia no admite la creación de grupos de disponibilidad y no puede hospedar réplicas de disponibilidad.
Cuentas Analiza los requisitos para configurar correctamente las cuentas en que se ejecuta SQL Server .
Extremos Analiza cómo diagnosticar problemas relativos al extremo de creación de reflejo de la base de datos de una instancia de servidor.
Acceso de red Documenta el requisito de que cada instancia de servidor que hospeda una réplica de disponibilidad debe tener acceso al puerto de cada una de las demás instancias de servidor en TCP.
Agente de escucha Documenta cómo establecer la dirección IP y el puerto del cliente de escucha y asegurarse de que está en ejecución y escuchando las conexiones entrantes.
Acceso al extremo (error 1418 de SQL Server) Contiene información sobre este mensaje de error de SQL Server .
Error de unión de la base de datos (error 35250 de SQL Server) Analiza las posibles causas y la resolución de un error al unir las bases de datos secundarias a un grupo de disponibilidad porque la conexión a la réplica principal no está activa.
El enrutamiento de solo lectura no funciona correctamente
Tareas relacionadas Contiene una lista de temas orientados a tareas de los Libros en pantalla de SQL Server que son especialmente pertinentes para solucionar problemas de configuración de un grupo de disponibilidad.
Contenido relacionado Contiene una lista de recursos importantes externos a los Libros en pantalla de SQL Server .

Los grupos de disponibilidad AlwaysOn no están habilitados

La característica Grupos de disponibilidad AlwaysOn debe estar habilitada en cada instancia de SQL Server.

Si la característica Grupos de disponibilidad Always On no está habilitada, recibirá este mensaje de error al intentar crear un grupo de disponibilidad en SQL Server.

The Always On Availability Groups feature must be enabled for server instance 'SQL1VM' before you can create an availability group on this instance. To enable this feature, open the SQL Server Configuration Manager, select SQL Server Services, right-click on the SQL Server service name, select Properties, and use the Always On Availability Groups tab of the Server Properties dialog. Enabling Always On Availability Groups may require that the server instance is hosted by a Windows Server Failover Cluster (WSFC) node. (Microsoft.SqlServer.Management.HadrTasks)

En el mensaje de error se indica claramente que dicha característica no está habilitada y también se proporcionan instrucciones sobre cómo habilitarla. Hay dos escenarios en los que se puede obtener este estado además del obvio en el que el grupo de disponibilidad no estaba habilitado en primer lugar.

  1. Si SQL Server se instaló y la característica Grupos de disponibilidad Always On se habilitó antes de instalar la característica Clústeres de conmutación por error de Windows Server, este error puede aparecer al intentar crear un grupo de disponibilidad Always On.
  2. Si quita una característica de clústeres de conmutación por error de Windows existente y la vuelve a generar mientras SQL Server todavía tiene configurado Always On, al intentar usar el grupo de disponibilidad de nuevo, puede producirse este error.

En estos casos, puede hacer lo siguiente para resolverlo:

  1. Deshabilite la característica Grupos de disponibilidad Always On.
  2. Reinicie el servicio de SQL Server.
  3. Vuelva a habilitar la característica Grupos de disponibilidad Always On.
  4. Reinicie el servicio de SQL Server de nuevo.

Para obtener más información, vea Habilitar y deshabilitar grupos de disponibilidad AlwaysOn (SQL Server).

Cuentas

Las cuentas en las que se ejecuta SQL Server deben estar configuradas correctamente.

  1. ¿Tienen las cuentas los permisos adecuados?

    1. Si los asociados realizan ejecuciones en la misma cuenta de dominio, automáticamente existen los inicios de sesión de usuario correctos en ambas bases de datos maestras. Esto simplifica la configuración de seguridad y es recomendable.

    2. Si dos instancias del servidor se ejecutan en cuentas diferentes, cada cuenta debe crearse en la base de datos maestra en la instancia del servidor remoto, y se deben conceder a ese servidor principal de sesión permisos CONNECT para conectarse al punto de conexión de creación de reflejo de la base de datos de esa instancia del servidor. Para obtener más información, consulte Configurar cuentas de inicio de sesión para la creación de reflejo de la base de datos o grupos de disponibilidad Always On (SQL Server). Puede usar la siguiente consulta en cada instancia para comprobar si los inicios de sesión tienen permisos CONNECT:

    SELECT 
      perm.class_desc,
      prin.name,
      perm.permission_name,
      perm.state_desc,
      prin.type_desc as PrincipalType,
      prin.is_disabled
    FROM sys.server_permissions perm
      LEFT JOIN sys.server_principals prin ON perm.grantee_principal_id = prin.principal_id
      LEFT JOIN sys.tcp_endpoints tep ON perm.major_id = tep.endpoint_id
    WHERE 
      perm.class_desc = 'ENDPOINT'
      AND perm.permission_name = 'CONNECT'
      AND tep.type = 4    
    
  2. Si SQL Server se ejecuta en una cuenta integrada, como sistema local, servicio local o servicio de red, o una cuenta que no es de dominio, debe utilizar certificados para la autenticación de puntos de conexión. Si las cuentas de servicio utilizan cuentas de dominio en el mismo dominio, puede elegir conceder acceso CONNECT para cada cuenta de servicio en todas las ubicaciones de réplica o puede utilizar certificados. Para obtener más información, consulte Usar certificados para un extremo de creación de reflejo de la base de datos (Transact-SQL).

Puntos de conexión

Los extremos deben estar configurados correctamente.

  1. Asegúrese de que cada instancia de SQL Server que vaya a hospedar una réplica de disponibilidad (cada ubicación de réplica) tenga un punto de conexión de creación de reflejo de la base de datos. Para determinar si existe un punto de conexión de creación de reflejo de la base de datos en una instancia de servidor determinada, use la vista de catálogo sys.database_mirroring_endpoints:

    SELECT name, state_desc FROM sys.database_mirroring_endpoints  
    

    Para obtener más información sobre cómo crear puntos de conexión, vea Crear un punto de conexión de creación de reflejo de la base de datos para la autenticación de Windows (Transact-SQL) o Permitir que un punto de conexión de creación de reflejo de la base de datos utilice certificados para las conexiones salientes (Transact-SQL&).

  2. Compruebe que los números de puerto son correctos.

    Para identificar el puerto asociado actualmente al punto de conexión de reflejo de la base de datos de una instancia de servidor, utilice la siguiente instrucción Transact-SQL:

    SELECT type_desc, port FROM sys.tcp_endpoints;  
    GO  
    
  3. En caso de problemas de configuración de los grupos de disponibilidad Always On que son difíciles de explicar, se recomienda que compruebe cada una de las instancias de servidor para determinar si escuchan en los puertos correctos.

  4. Asegúrese de que se han iniciado los extremos (STATE=STARTED). En cada una de las instancias de servidor, utilice la siguiente instrucción Transact-SQL.

    SELECT state_desc FROM sys.database_mirroring_endpoints  
    

    Para obtener más información sobre la columna state_desc, consulte sys.database_mirroring_endpoints (Transact-SQL).

    Para iniciar un punto de conexión, utilice la siguiente instrucción Transact-SQL:

    ALTER ENDPOINT Endpoint_Mirroring   
    STATE = STARTED   
    AS TCP (LISTENER_PORT = <port_number>)  
    FOR database_mirroring (ROLE = ALL);  
    GO  
    

    Para obtener más información, vea ALTER ENDPOINT (Transact-SQL).

    Nota

    En algunos casos, si se inicia el punto de conexión, pero las réplicas del grupo de disponibilidad no se comunican, puede intentar detener y reiniciar el punto de conexión. Puede usar ALTER ENDPOINT [Endpoint_Mirroring] STATE = STOPPED seguido de ALTER ENDPOINT [Endpoint_Mirroring] STATE = STARTED

  5. Asegúrese de que el inicio de sesión del otro servidor dispone de permiso CONNECT. Para determinar quién tiene permiso CONNECT para un punto de conexión, utilice la siguiente instrucción Transact-SQL en cada instancia de servidor

    SELECT 'Metadata Check';  
    SELECT EP.name, SP.STATE,   
       CONVERT(nvarchar(38), suser_name(SP.grantor_principal_id))   
          AS GRANTOR,   
       SP.TYPE AS PERMISSION,  
       CONVERT(nvarchar(46),suser_name(SP.grantee_principal_id))   
          AS GRANTEE   
       FROM sys.server_permissions SP , sys.endpoints EP  
       WHERE SP.major_id = EP.endpoint_id  
       ORDER BY Permission,grantor, grantee;   
    
  6. Asegúrese de que se usa el nombre de servidor correcto en la dirección URL del punto de conexión.

    Para el nombre del servidor en una dirección URL de punto de conexión, se recomienda usar el nombre de dominio completo (FQDN), aunque puede usar cualquier nombre que identifique de forma única la máquina. La dirección del servidor puede ser un nombre de NetBIOS (si los sistemas se encuentran en el mismo dominio), un nombre de dominio completo (FQDN) o una dirección IP (preferiblemente, una dirección IP estática). La opción recomendada es usar el nombre de dominio completo.

    Si ya ha definido una dirección URL del punto de conexión, puede consultarla mediante:

    select endpoint_url from sys.availability_replicas
    

    A continuación, compare la salida endpoint_url con el nombre del servidor (nombre de NetBIOS o FQDN). Para consultar el nombre del servidor, ejecute los siguientes comandos en una instancia de PowerShell en la réplica localmente:

    $env:COMPUTERNAME
    [System.Net.Dns]::GetHostEntry([string]$env:computername).HostName
    

    Para validar el nombre del servidor en un equipo remoto, ejecute este comando desde PowerShell.

    $servername_from_endpoint_url = "server_from_endpoint_url_output"
    
    Test-NetConnection -ComputerName $servername_from_endpoint_url
    

    Para obtener más información, vea Especificar la dirección URL del punto de conexión - Agregar o modificar una réplica de disponibilidad (SQL Server).

Nota

Para usar la autenticación Kerberos para la comunicación entre los puntos de conexión del grupo de disponibilidad (AG), registre un nombre de entidad de seguridad de servicio para las conexiones con Kerberos para los puntos de conexión de creación de reflejo de la base de datos usados por el grupo de disponibilidad.

Acceso de red

Cada instancia de servidor que hospeda una réplica de disponibilidad debe tener acceso al puerto de cada una de las demás instancias de servidor en TCP. Esto es especialmente importante si las instancias de servidor están en distintos dominios que no confían unos en otros (dominios que no son de confianza). Siga estos pasos para comprobar si puede conectarse a los puntos de conexión:

  • Use Test-NetConnection (equivalente a Telnet) para validar la conectividad. Estos son algunos ejemplos de comandos que puede usar:

    $server_name = "your_server_name"
    $IP_address = "your_ip_address"
    $port_number = "your_port_number"
    
    Test-NetConnection -ComputerName $server_name -Port $port_number
    Test-NetConnection -ComputerName $IP_address -Port $port_number
    
  • Si el punto de conexión está escuchando y la conexión se realiza correctamente, verá "TcpTestSucceeded : True". Si no es así, verá "TcpTestSucceeded : False".

  • Si la conexión de est-NetConnection (Telnet) a la dirección IP funciona, pero no ocurre lo mismo con ServerName, es probable que haya un problema de resolución de nombres o DNS.

  • Si la conexión funciona con ServerName y no con la dirección IP, significa que podría haber más de un punto de conexión definido en ese servidor (otra instancia de SQL quizás) que escuche en ese puerto. Aunque el estado del punto de conexión de la instancia en cuestión muestra "STARTED" (INICIADO), otra instancia puede tener el puerto elazado e impedir que la instancia correcta escuche y establezca conexiones TCP.

  • Si Test-NetConnection no se conecta, compruebe si hay algún firewall o antivirus que pueda estar bloqueando el puerto del punto de conexión en cuestión. Compruebe la configuración de firewall para ver si permite la comunicación de puerto del punto de conexión entre las instancias de servidor que hospedan la réplica principal y la secundaria (el puerto 5022 de forma predeterminada). Ejecute el siguiente script de PowerShell para examinar las reglas de tráfico de entrada deshabilitadas.

  • Si está ejecutando SQL Server en máquina virtual de Azure, además, deberá asegurarse de que el grupo de seguridad de red permita el tráfico al puerto del punto de conexión. Compruebe la configuración de firewall (y el grupo de seguridad de red, para la máquina virtual de Azure) para ver si permite la comunicación de puerto del punto de conexión entre las instancias de servidor que hospedan la réplica principal y la secundaria (el puerto 5022 de forma predeterminada).

    Get-NetFirewallRule -Action Block -Enabled True -Direction Inbound |Format-Table
    
  • Capture la salida del cmdlet Get-NetTCPConnection (equivalente a NETSTAT -a) y compruebe que el estado es LISTENING o ESTABLISHED en el valor de IP:Port para el punto de conexión especificado.

    Get-NetTCPConnection 
    

Agente de escucha

Para configurar correctamente la escucha de un grupo de disponibilidad, siga "Configuración de un cliente de escucha para un grupo de disponibilidad Always On".

  1. Una vez configurado el cliente de escucha, puede validar la dirección IP y el puerto en el que escucha mediante la consulta siguiente:

    $server_name = $env:computername  #replace this with your sql instance "server\instance"
    
    sqlcmd -E -S$server_name -Q"SELECT dns_name AS AG_listener_name, port, ip_configuration_string_from_cluster 
    FROM sys.availability_group_listeners"
    
  2. También puede encontrar la información del cliente de escucha junto con los puertos de SQL Server mediante esta consulta:

    $server_name = $env:computername      #replace this with your sql instance "server\instance"
    
    sqlcmd -E -S($server_name) -Q("SELECT  convert(varchar(32), SERVERPROPERTY ('servername')) servername, convert(varchar(32),ip_address) ip_address, port, type_desc,state_desc, start_time 
    FROM sys.dm_tcp_listener_states 
    WHERE ip_address not in ('127.0.0.1', '::1') and type <> 2")
    
  3. Si necesita establecer conectividad con el cliente de escucha y sospecha que un puerto está bloqueado, puede realizar una prueba mediante el cmdlet Test-NetConnection de PowerShell (equivalente a telnet).

    $listener_name = "your_ag_listener"
    $IP_address = "your_ip_address"
    $port_number = "your_port_number"
    
    Test-NetConnection -ComputerName $listener_name -Port $port_number
    Test-NetConnection -ComputerName $IP_address -Port $port_number
    
  4. Por último, compruebe si el cliente de escucha está escuchando en el puerto especificado:

    $port_number = "your_port_number"
    
    Get-NetTCPConnection -LocalPort $port_number -State Listen
    

Acceso al extremo (error 1418 de SQL Server)

Este mensaje de SQL Server indica que la dirección de red del servidor especificada en la dirección URL del punto de conexión no se encuentra o no existe, y recomienda que compruebe el nombre de la dirección de red y vuelva a emitir el comando.

Error de unión de la base de datos (error 35250 de SQL Server)

En esta sección se analiza las posibles causas y la resolución de un error al unir las bases de datos secundarias al grupo de disponibilidad porque la conexión a la réplica principal no está activa. Este es el mensaje de error completo:

Msg 35250 The connection to the primary replica is not active. The command cannot be processed.

Resolución:

A continuación se muestra un resumen de los pasos.

Para obtener instrucciones detalladas y paso a paso, vea el error de motor MSSQLSERVER_35250.

  1. Asegúrese de que el punto de conexión se ha creado e iniciado.
  2. Compruebe si puede conectarse al punto de conexión a través de Telnet y descarte que haya reglas de firewall que estén bloqueando la conectividad.
  3. Compruebe si hay errores en el sistema. Puede consultar la vista de administración única sys.dm_hadr_availability_replica_states de last_connect_error_number, que puede ayudarle a diagnosticar el problema de combinación.
  4. Asegúrese de que el punto de conexión está definido para que coincida correctamente con la dirección IP o el puerto que el grupo de disponibilidad utiliza.
  5. Compruebe si la cuenta de servicio de red tiene permiso de conexión al punto de conexión.
  6. Compruebe los posibles problemas de resolución de nombres.
  7. Asegúrese de que SQL Server está ejecutando una compilación reciente (preferiblemente la más reciente) para protegerse de problemas.

El enrutamiento de solo lectura no funciona correctamente

  1. Asegúrese de haber configurado el enrutamiento de solo lectura según el documento Configuración del enrutamiento de solo lectura.

  2. Asegúrese de que los controladores de cliente son compatibles.

    La aplicación cliente debe usar un proveedor de cliente que admita parámetros ApplicationIntent. Vea Compatibilidad con la conectividad de cliente y controlador para grupos de disponibilidad.

    Nota

    Si se conecta a un cliente de escucha de nombre de red distribuida (DNN), el proveedor también debe admitir el parámetro MultiSubnetFailover.

  3. Asegúrese de que las propiedades de la cadena de conexión se han establecido correctamente.

    Para que el enrutamiento de solo lectura funcione correctamente, la aplicación cliente debe usar estas propiedades en la cadena de conexión:

    • Un nombre de base de datos perteneciente al grupo de disponibilidad.
    • Un nombre de escucha de grupo de disponibilidad
      • Si usa DNN, debe especificar el nombre del cliente de escucha de DNN y el número de puerto de DNN <DNN name,DNN port>.
    • ApplicationIntent establecido en ReadOnly.
    • El nombre de red distribuido (DNN) requiere establecer MultiSubnetFailover en true.

    Ejemplos

    Este ejemplo ilustra la cadena de conexión para el proveedor .NET System.Data.SqlClient de un agente de escucha de nombre de red virtual (VNN):

    Server=tcp:VNN_AgListener,1433;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
    

    Esto ilustra la cadena de conexión para el proveedor .NET System.Data.SqlClient de un agente de escucha de nombre de red distribuida (DNN):

    Server=tcp:DNN_AgListener,DNN_Port;Database=AgDb1;ApplicationIntent=ReadOnly;MultiSubnetFailover=True
    

    Nota

    Si usa programas de línea de comandos como SQLCMD, asegúrese de especificar los modificadores correctos para el nombre del servidor. Por ejemplo, en SQLCMD debe usar el modificador -S en mayúsculas que especifica el nombre del servidor, no el modificador -s en minúsculas que se usa para el separador de columnas.
    Ejemplo: sqlcmd -S AG_Listener,port -E -d AgDb1 -K ReadOnly -M

  4. Asegúrese de que el agente de escucha del grupo de disponibilidad está en línea. Para asegurarse de que el agente de escucha del grupo de disponibilidad está en línea, ejecute la siguiente consulta en la réplica principal:

    SELECT * FROM sys.dm_tcp_listener_states;
    

    Si descubre que el agente de escucha está sin conexión, puede intentar ponerlo en línea mediante un comando como el siguiente:

    ALTER AVAILABILITY GROUP myAG RESTART LISTENER 'AG_Listener';
    
  5. Asegúrese de que READ_ONLY_ROUTING_LIST se ha rellenado correctamente. En la réplica principal, asegúrese de que READ_ONLY_ROUTING_LIST solo contiene instancias de servidor que hospedan réplicas secundarias legibles.

    Para ver las propiedades de cada réplica, puede ejecutar esta consulta y examinar el punto de conexión de conectividad (URL) de la réplica de solo lectura.

    SELECT replica_id, replica_server_name, secondary_role_allow_connections_desc, read_only_routing_url 
    FROM sys.availability_replicas;   
    

    Para ver una lista de enrutamiento de solo lectura y compararla con la dirección URL del punto de conexión:

    SELECT * FROM sys.availability_read_only_routing_lists;
    

    Para cambiar una lista de enrutamiento de solo lectura, puede usar una consulta como esta:

    ALTER AVAILABILITY GROUP [AG1]   
    MODIFY REPLICA ON  
    N'COMPUTER02' WITH   
    (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER01','COMPUTER02')));  
    

    Para obtener más información, Configuración del enrutamiento de solo lectura para un grupo de disponibilidad Always On.

  6. Compruebe que el puerto READ_ONLY_ROUTING_URL está abierto. Asegúrese de que el firewall de Windows no está bloqueando el puerto de READ_ONLY_ROUTING_URL. Configure un firewall de Windows para el acceso al motor de base de datos en todas las réplicas de read_only_routing_list y cualquiera para los clientes que se conectarán a esas réplicas.

    Nota

    Si ejecuta SQL Server una máquina virtual de Azure, debe realizar pasos de configuración adicionales. Asegúrese de que el grupo de seguridad de red (NSG) de cada máquina virtual de réplica permite el tráfico al puerto del punto de conexión y al puerto DNN, si usa el agente de escucha de DNN. Si usa el agente de escucha de VNN, debe asegurarse de que el equilibrador de carga está configurado correctamente.

  7. Asegúrese de que READ_ONLY_ROUTING_URL (TCP://system-address:port) contiene el nombre de dominio completo (FQDN) y el número de puerto correctos. Vea:

  8. Asegúrese de que la configuración de red de SQL Server es la adecuada en SQL Server Configuration Manager.

    Compruebe en todas las réplicas de read_only_routing_list lo siguiente:

    • La conectividad remota de SQL Server está habilitada.
    • TCP/IP está habilitado.
    • Las direcciones IP están configuradas correctamente.

    Nota

    Puede comprobar rápidamente que todos estos ajustes están configurados correctamente si puede conectarse desde un equipo remoto al nombre de instancia de SQL Server de una réplica secundaria de destino mediante la sintaxis TCP:SQL_Instance.

Vea Configurar un servidor para que escuche en un puerto TCP específico (Administrador de configuración de SQL Server) y Ver o cambiar las propiedades del servidor (SQL Server).

Related Tasks

Contenido relacionado

Consulte también

Seguridad de transporte para la creación de reflejo de la base de datos y grupos de disponibilidad AlwaysOn (SQL Server)
Configuración de red de cliente
Requisitos previos, restricciones y recomendaciones para Grupos de disponibilidad AlwaysOn (SQL Server)