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.
- 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.
- 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:
- Deshabilite la característica Grupos de disponibilidad Always On.
- Reinicie el servicio de SQL Server.
- Vuelva a habilitar la característica Grupos de disponibilidad Always On.
- 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.
¿Tienen las cuentas los permisos adecuados?
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.
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
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.
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&).
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
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.
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
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;
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".
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"
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")
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
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.
- Asegúrese de que el punto de conexión se ha creado e iniciado.
- 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.
- 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.
- 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.
- Compruebe si la cuenta de servicio de red tiene permiso de conexión al punto de conexión.
- Compruebe los posibles problemas de resolución de nombres.
- 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
Asegúrese de haber configurado el enrutamiento de solo lectura según el documento Configuración del enrutamiento de solo lectura.
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
.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>
.
- Si usa DNN, debe especificar el nombre del cliente de escucha de DNN y el número de puerto de DNN
- 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
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';
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.
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.
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:
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
Creación y configuración de grupos de disponibilidad (SQL Server)
Crear un extremo de reflejo de la base de datos para la autenticación de Windows (Transact-SQL)
Preparar manualmente una base de datos secundaria para un grupo de disponibilidad (SQL Server)
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)