Controlador OLE DB para la compatibilidad de SQL Server con la alta disponibilidad y la recuperación ante desastres

Aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Analítica (PDW)Base de datos SQL en Microsoft Fabric

Descargar controlador OLE DB

En este artículo se describe la compatibilidad de OLE DB Driver for SQL Server para Grupos de disponibilidad AlwaysOn. Para más información sobre Grupos de disponibilidad Always On, vea Agentes de escucha de grupo de disponibilidad, conectividad de cliente y conmutación por error de una aplicación (SQL Server), Creación y configuración de grupos de disponibilidad (SQL Server), Clúster de conmutación por error y grupos de disponibilidad Always On (SQL Server) y Secundarias activas: réplicas secundarias legibles (grupos de disponibilidad Always On).

Puede especificar el agente de escucha del grupo de disponibilidad de un determinado grupo de disponibilidad en la cadena de conexión. Si una aplicación de controlador OLE DB para SQL Server se conecta a una base de datos de un grupo de disponibilidad que conmuta por error, la conexión original se interrumpe y la aplicación debe abrir una nueva conexión para continuar el trabajo después de la conmutación por error.

Si no va a conectarse a una escucha de grupo de disponibilidad y varias direcciones IP están asociadas a un nombre de host, el controlador OLE DB para SQL Server iterará secuencialmente a través de todas las direcciones IP asociadas a la entrada DNS. Esto puede llevar mucho tiempo si la primera dirección IP que devuelve el servidor DNS no está enlazada a una tarjeta (NIC) de interfaz de red. Al conectarse a una escucha de grupo de disponibilidad, el controlador OLE DB para SQL Server intentará establecer conexiones con todas las direcciones IP en paralelo y, si un intento de conexión se realiza correctamente, el controlador descartará los intentos pendientes.

Nota

El aumento del tiempo de espera de la conexión y la implementación de la lógica de reintento de conexión aumentarán la probabilidad de que una aplicación se conecte a un grupo de disponibilidad. Además, dado que una conexión puede producir un error debido a la conmutación por error de un grupo de disponibilidad, es aconsejable implementar la lógica de reintento de conexión y hacer que una conexión que no se ha podido establecer se reintente hasta que vuelva a conectarse.

Conexión con MultiSubnetFailover

Siempre especifica MultiSubnetFailover=Sí cuando el destino es Azure SQL Database, Azure SQL Managed Instance, base de datos SQL en Microsoft Fabric, un oyente de grupo de disponibilidad Always On o una instancia de clúster de conmutación por fallo de SQL Server.

Cuando el nombre del servidor en tu cadena de conexión se resuelve a más de una dirección IP, MultiSubnetFailover=Yes indica a OLE DB Driver for SQL Driver para SQL Server que abra las conexiones a todas esas direcciones al mismo tiempo y use la primera que responda. Sin ella, el conductor prueba las direcciones una a una. Una dirección que no responde se queda bloqueada hasta que expira el tiempo de espera de conexión TCP del sistema operativo, lo que puede agotar el tiempo de espera antes de que el controlador alcance una dirección que responde. Tras un cambio por error, la dirección que el controlador prueba primero puede ser una que ya no sirve a la base de datos, por lo que una conexión que tendría éxito contra otra dirección falla con un tiempo de espera en su lugar.

MultiSubnetFailover=Sí cambia la rapidez con la que el cliente encuentra la réplica que sirve a la base de datos. No cambia cuánto tarda el servidor en hacer el conmutación por error.

MultiSubnetFailover=Sí es seguro en objetivos de una sola IP. Cuando el DNS se resuelve a una sola dirección, el controlador hace un único intento de conexión, así que la configuración no cuesta nada cuando no se necesita.

Para más información sobre las palabras clave de cadena de conexión, vea Uso de palabras clave de cadena de conexión con el controlador OLE DB para SQL Server.

Utilice las siguientes instrucciones para conectarse a un servidor en un grupo de disponibilidad o una instancia de clúster de conmutación por error:

  • Configura la propiedad de conexión MultiSubnetFailover en .

  • Para conectarse a un grupo de disponibilidad, especifique el agente de escucha del grupo de disponibilidad como el servidor en la cadena de conexión.

  • No puedes usar MultiSubnetFailover sobre un protocolo que no sea TCP.

  • Conectarse a una instancia de SQL Server configurada con más de 64 direcciones IP provoca un fallo de conexión.

  • No puedes usar MultiSubnetFailover con duplicación de bases de datos. El controlador devuelve un error cuando el servidor informa que la base de datos está espejada. El reflejo de bases de datos está obsoleto en todas las versiones compatibles de SQL Server. Use en su lugar los grupos de disponibilidad de Always On.

  • El tipo de autenticación, Autenticación SQL Server, Autenticación Kerberos o Autenticación de Windows, no afecta al comportamiento de una aplicación que utiliza la propiedad de conexión MultiSubnetFailover.

  • Puedes aumentar el valor del tiempo de espera de conexión para acomodar el tiempo de conmutación por error y reducir los intentos de reintento de conexión de la aplicación. El valor predeterminado es 15 segundos. La misma configuración se llama Timeout cuando la configuras a IDBInitialize::Initializetravés de , y se asigna a la DBPROP_INIT_TIMEOUT propiedad. Para Azure SQL Database sin servidor con pausa automática activada, usa un tiempo de espera de Connect de al menos 60 segundos. Una base de datos en pausa automática se reanuda en el primer intento de conexión, y ese intento puede fallar con el error 40613 mientras la base de datos se reanuda, por lo que la aplicación debe intentarlo de nuevo. Para más información, consulta la pausa automática y la reanudación automática.

  • No se admiten transacciones distribuidas.

Si no está activado el enrutamiento de solo lectura, no se podrá conectar a una ubicación de réplica secundaria en un grupo de disponibilidad en las siguientes situaciones:

  1. Si la ubicación de réplica secundaria no está configurada para aceptar conexiones.
  2. Si una aplicación usa ApplicationIntent=ReadWrite y la ubicación de la réplica secundaria está configurada para acceso de solo lectura.

Una conexión falla si una réplica primaria está configurada para rechazar cargas de solo lectura y la cadena de conexión contiene ApplicationIntent=ReadOnly.

Actualización desde el espejado de bases de datos

Ocurre un error de conexión si el cadena de conexión contiene tanto la palabra clave MultiSubnetFailover como Failover_Partner. También ocurre un error si usas MultiSubnetFailover y el SQL Server devuelve una respuesta del socio de conmutación por fallo indicando que forma parte de un par de espejo de base de datos.

Si actualizas una aplicación OLE DB Driver for SQL Server que actualmente usa espejamiento de base de datos a un escenario multi-subred, elimina la propiedad de conexión Failover_Partner y reemplázala por MultiSubnetFailover configurada en . Sustituye el nombre del servidor en la cadena de conexión por un oyente de grupo de disponibilidad. Si un cadena de conexión usa Failover_Partner y MultiSubnetFailover=Sí, el controlador genera un error. Sin embargo, si un cadena de conexión usa Failover_Partner y MultiSubnetFailover=No (o IntenciónAplicación=Escritura de Lectura), la aplicación utiliza espejado de base de datos.

El controlador devuelve un error si usas el reflejo de base de datos en la réplica primaria del grupo de disponibilidad, y si usas MultiSubnetFailover=Yes en la cadena de conexión que se conecta a una réplica primaria en lugar de a un oyente de grupo de disponibilidad.

Establecer MultiSubnetFailover programáticamente

Las propiedades de conexión equivalentes son:

  • SSPROP_INIT_MULTISUBNETFAILOVER
  • DBPROP_INIT_PROVIDERSTRING

Una aplicación de OLE DB Driver for SQL Server puede usar uno de los siguientes métodos para establecer la opción MultiSubnetFailover:

  • IDBInitialize::Initialize
    Utiliza el conjunto de propiedades previamente configurado para inicializar la fuente de datos y crear el objeto fuente de datos. Especifica MultiSubnetFailover como una propiedad del proveedor o como parte de la cadena de propiedades extendidas.
  • IDataInitialize::GetDataSource
    Toma una cadena de conexión de entrada que puede contener la palabra clave MultiSubnetFailover.
  • IDBProperties::SetProperties
    Para establecer el valor de la propiedad MultiSubnetFailover , llama a IDBProperties::SetProperties pasando la propiedad SSPROP_INIT_MULTISUBNETFAILOVER con el valor VARIANT_TRUE o VARIANT_FALSE, o la propiedad DBPROP_INIT_PROVIDERSTRING con valor que contiene MultiSubnetFailover=Sí o MultiSubnetFailover=No.

Ejemplo

DBPROP rgPropMultisubnet;

rgPropMultisubnet.dwPropertyID = SSPROP_INIT_MULTISUBNETFAILOVER;
rgPropMultisubnet.dwOptions = DBPROPOPTIONS_REQUIRED;
rgPropMultisubnet.dwStatus = DBPROPSTATUS_OK;
rgPropMultisubnet.colid = DB_NULLID;
V_VT(&(rgPropMultisubnet.vValue)) = VT_BOOL;
V_BOOL(&(rgPropMultisubnet.vValue)) = VARIANT_TRUE;

DBPROPSET PropSet;

PropSet.rgProperties = &rgPropMultisubnet;
PropSet.cProperties = 1;
PropSet.guidPropertySet = DBPROPSET_SQLSERVERDBINIT;
IDBProperties* pIDBProperties = NULL;
hr = pIDBInitialize->QueryInterface(IID_IDBProperties, (void **)&pIDBProperties);
pIDBProperties->SetProperties(1, &PropSet);

Especificación de la intención de aplicación

Puede especificar la palabra clave ApplicationIntent en la cadena de conexión. Los valores asignables son ReadWrite (el valor predeterminado) o ReadOnly.

Al establecer ApplicationIntent=ReadOnly, el cliente solicita una carga de trabajo de lectura al conectarse. El servidor aplicará la intención en el momento de la conexión y durante una instrucción de base de datos USE.

La palabra clave ApplicationIntent no funciona con bases de datos de solo lectura heredadas.

Destinos de ReadOnly

Cuando una conexión elige ReadOnly, la conexión se asigna a cualquiera de las siguientes configuraciones especiales que pueden existir para la base de datos:

Si ninguno de esos destinos especiales está disponible, se lee desde la base de datos normal.

La palabra clave ApplicationIntent habilita el enrutamiento de solo lectura.

Enrutamiento de solo lectura

El enrutamiento de solo lectura es una característica que puede asegurar la disponibilidad de una réplica de solo lectura de una base de datos. Para habilitar el enrutamiento de solo lectura, se aplica lo siguiente:

  • Debe conectarse a un cliente de escucha del grupo de disponibilidad Always On.

  • La palabra clave de la cadena de conexión ApplicationIntent debe establecerse en ReadOnly.

  • El administrador de bases de datos debe configurar el grupo de disponibilidad para habilitar el enrutamiento de solo lectura.

Varias conexiones que utilizan cada una el enrutamiento de solo lectura podrían no conectarse todas a la misma réplica de solo lectura. Los cambios en la sincronización de la base de datos o los cambios en la configuración de enrutamiento del servidor pueden producir conexiones de cliente para réplicas de solo lectura diferentes.

Para asegurarse de que todas las solicitudes de solo lectura se conectan a la misma réplica de solo lectura, no pase un cliente de escucha de grupo de disponibilidad a la palabra clave de cadena de conexión Server. En su lugar, especifique el nombre de la instancia de solo lectura.

El enrutamiento de solo lectura puede tardar más que la conexión a la principal. Esto se debe a que el enrutamiento de solo lectura se conecta primero a la principal y, luego, busca la mejor instancia secundaria legible que esté disponible. Debido a estos múltiples pasos, debe aumentar el tiempo de espera de login a 30 segundos como mínimo.

Intención de aplicación

El controlador OLE DB Driver for SQL Server soporta la palabra clave de cadena de conexión ApplicationIntent. Para más información sobre las palabras clave de cadena de conexión, vea Uso de palabras clave de cadena de conexión con el controlador OLE DB para SQL Server.

Establecer ApplicationIntent programáticamente

Las propiedades de conexión equivalentes son:

  • SSPROP_INIT_APPLICATIONINTENT
  • DBPROP_INIT_PROVIDERSTRING

Una aplicación de OLE DB Driver for SQL Server puede utilizar uno de los siguientes métodos para especificar la intención de la aplicación:

  • IDBInitialize::Initialize
    Utiliza el conjunto de propiedades previamente configurado para inicializar la fuente de datos y crear el objeto fuente de datos. Especifique la intención de aplicaciones como una propiedad del proveedor o como parte de la cadena de propiedades extendidas.
  • IDataInitialize::GetDataSource
    Toma una cadena de conexión de entrada que puede contener la palabra clave Application Intent.
  • IDBProperties::SetProperties
    Para establecer el valor de la propiedad ApplicationIntent , llama a IDBProperties::SetProperties pasando la propiedad SSPROP_INIT_APPLICATIONINTENT con valor ReadWrite o ReadOnly, o la propiedad DBPROP_INIT_PROVIDERSTRING con valor que contiene ApplicationIntent=ReadOnly o ApplicationIntent=ReadWrite.

Puedes especificar la intención de aplicación en el campo Propiedades de Intención de Aplicación de la pestaña Todos en el cuadro de diálogo Propiedades de Enlace de Datos .

Cuando estableces conexiones implícitas, la conexión implícita utiliza la configuración de intención de aplicación de la conexión padre. De manera similar, varias sesiones creadas a partir de la misma fuente de datos heredan la configuración de intención de aplicación de la fuente.