Partilhar via


Driver OLE DB para suporte do SQL Server para alta disponibilidade, recuperação de desastres

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Base de dados SQL no Microsoft Fabric

Baixar driver OLE DB

Este artigo discute o suporte do Driver OLE DB para SQL Server para grupos de disponibilidade Always On. Para mais informações sobre grupos de disponibilidade Always On, consulte Availability Group Listeners, Connectivity do Cliente e Failover de Aplicações (SQL Server),Criação e Configuração de Grupos de Disponibilidade (SQL Server),Clustering por Failover e Grupos de Disponibilidade Sempre Ligados (SQL Server), e Ativos Secundários: Réplicas Secundárias Legíveis (Always On Availability Groups).

Pode especificar o ouvinte do grupo de disponibilidade de um dado grupo de disponibilidade na cadeia de conexão. Se um Driver OLE DB para aplicação SQL Server estiver ligado a uma base de dados num grupo de disponibilidade que faz failover, a ligação original é interrompida e a aplicação tem de abrir uma nova ligação para continuar o trabalho após o failover.

Se não estiver a ligar-se a um ouvinte de grupo de disponibilidade, e se vários endereços IP estiverem associados a um nome de host, o OLE DB Driver para SQL Server irá iterar sequencialmente por todos os endereços IP associados à entrada DNS. Isto pode ser demorado se o primeiro endereço IP devolvido pelo servidor DNS não estiver ligado a nenhuma placa de interface de rede (NIC). Ao ligar-se a um ouvinte de grupo de disponibilidade, o OLE DB Driver para SQL Server tenta estabelecer ligações a todos os endereços IP em paralelo e, se uma tentativa de ligação for bem-sucedida, o driver descarta quaisquer tentativas de ligação pendentes.

Observação

Aumentar o tempo de espera da ligação e implementar lógica de retentativa de ligação aumentará a probabilidade de uma aplicação se ligar a um grupo de disponibilidade. Além disso, como uma ligação pode falhar devido a um failover de grupo de disponibilidade, deve implementar lógica de retentativa de ligação, tentando novamente uma ligação falhada até que esta se reconecte.

Ligação com MultiSubnetFailover

Especifique sempre MultiSubnetFailover=Sim ao ligar a um ouvinte de Grupo de Disponibilidade Sempre Ativo do SQL Server ou a uma Instância de Cluster de Failover do SQL Server. O MultiSubnetFailover permite um failover mais rápido para todos os Grupos de Disponibilidade Sempre Ligados e Instâncias de Cluster de Failover no SQL Server, e reduzirá significativamente o tempo de failover para topologias Sempre Ligadas de uma e múltiplas sub-redes. Durante um failover multi-sub-rede, o cliente tentará ligações em paralelo. Durante um failover de sub-rede, o OLE DB Driver para SQL Server tentará novamente a ligação TCP.

A propriedade de ligação MultiSubnetFailover indica que a aplicação está a ser implementada num grupo de disponibilidade ou Instância de Cluster de Failover, e que o OLE DB Driver para SQL Server tentará ligar-se à base de dados na instância principal do SQL Server tentando ligar-se a todos os endereços IP. Quando MultiSubnetFailover=Yes é especificado para uma ligação, o cliente tenta novamente as tentativas de ligação TCP mais rapidamente do que os intervalos padrão de retransmissão TCP do sistema operativo. Isto permite uma reconexão mais rápida após o failover de um Grupo de Disponibilidade Sempre Ligado ou de uma Instância de Cluster de Failover, sendo aplicável tanto a Grupos de Disponibilidade de uma como a múltiplas sub-redes e Instâncias de Cluster de Failover.

Para mais informações sobre palavras-chave de cadeia de ligação, consulte Utilização de Palavras-chave de Stringas de Ligação com o Driver OLE DB para SQL Server.

Especificar MultiSubnetFailover=Sim ao ligar-se a algo que não seja um ouvinte de grupo de disponibilidade ou uma Instância de Cluster de Failover pode resultar num impacto negativo no desempenho, e não é suportado.

Use as seguintes diretrizes para se ligar a um servidor num grupo de disponibilidade ou numa Instância de Cluster de Failover:

  • Use a propriedade de ligação MultiSubnetFailover ao ligar-se a uma única sub-rede ou multi-sub-redes; Vai melhorar o desempenho de ambos.

  • Para se ligar a um grupo de disponibilidade, especifique o ouvinte do grupo de disponibilidade do grupo de disponibilidade como o servidor na sua cadeia de ligação.

  • Ligar a uma instância SQL Server configurada com mais de 64 endereços IP causará uma falha de ligação.

  • O comportamento de uma aplicação que utiliza a propriedade de ligação MultiSubnetFailover não é afetado consoante o tipo de autenticação: Autenticação SQL Server, Autenticação Kerberos ou Autenticação Windows.

  • Pode aumentar o valor do loginTimeout para acomodar o tempo de failover e reduzir as tentativas de ligação à aplicação.

  • Transações distribuídas não são suportadas.

Se o encaminhamento apenas de leitura não estiver em vigor, a ligação a uma localização secundária de réplica num grupo de disponibilidade falhará nas seguintes situações:

  1. Se a localização da réplica secundária não estiver configurada para aceitar ligações.

  2. Se uma aplicação usar ApplicationIntent=ReadWrite (discutido abaixo) e a localização da réplica secundária estiver configurada para acesso apenas de leitura.

Uma ligação falhará se uma réplica primária estiver configurada para rejeitar cargas de trabalho apenas de leitura e a cadeia de ligação contiver ApplicationIntent=ReadOnly.

Atualização para Utilização de Clusters Multi-Subredes a partir de Espelhamento de Bases de Dados

Ocorrerá um erro de ligação se as palavras-chave MultiSubnetFailover e Failover_Partner connection estiverem presentes na cadeia de ligação. Também ocorrerá um erro se for usado MultiSubnetFailover e o SQL Server devolver uma resposta do parceiro de failover indicando que faz parte de um par de espelhamento da base de dados.

Se atualizar um driver OLE DB para uma aplicação SQL Server que atualmente usa espelhamento de base de dados para um cenário multi-sub-rede, deve remover a propriedade de ligação Failover_Partner e substituí-la por MultiSubnetFailover definida para Yes e substituir o nome do servidor na string de ligação por um ouvinte de grupo de disponibilidade. Se uma cadeia de ligação usar Failover_Partner e MultiSubnetFailover=Sim, o driver gerará um erro. No entanto, se uma cadeia de ligação usar Failover_Partner e MultiSubnetFailover=Não (ou ApplicationIntent=ReadWrite), a aplicação usará espelhamento de base de dados.

O driver devolverá um erro se for usado espelhamento de base de dados na base de dados principal do grupo de disponibilidade, e se MultiSubnetFailover=Yes for usado na cadeia de ligação que se liga a uma base de dados primária em vez de um ouvinte de grupo de disponibilidade.

Especifique a intenção da aplicação

Podes especificar a palavra-chave ApplicationIntent na tua cadeia de ligação. Os valores atribuíveis são ReadWrite (o padrão) ou ReadOnly.

Quando defines ApplicationIntent=ReadOnly, o cliente solicita uma carga de trabalho de leitura ao ligar. O servidor faz cumprir a intenção no momento da ligação e durante uma USE instrução da base de dados.

A ApplicationIntent palavra-chave não funciona com bases de dados legadas de apenas leitura.

Alvos do ReadOnly

Quando uma ligação escolhe ReadOnly, a ligação é atribuída a qualquer uma das seguintes configurações especiais que possam existir para a base de dados:

  • Sempre ligado. Uma base de dados pode permitir ou não a leitura de cargas de trabalho na base de dados do grupo de disponibilidade alvo. Esta escolha é controlada usando a ALLOW_CONNECTIONS cláusula das PRIMARY_ROLE instruções e SECONDARY_ROLE Transact-SQL.

  • Geo-replication

  • Escalamento horizontal de leituras

Se nenhum desses alvos especiais estiver disponível, a base de dados regular é consultada.

A ApplicationIntent palavra-chave permite o encaminhamento apenas de leitura.

Encaminhamento de apenas leitura

O encaminhamento apenas de leitura é uma funcionalidade que pode garantir a disponibilidade de uma réplica somente de leitura de uma base de dados. Para permitir o encaminhamento apenas de leitura, aplicam-se todas as seguintes condições:

  • Deve ligar-se a um ouvinte do grupo de disponibilidade Always On.

  • A ApplicationIntent palavra-chave da cadeia de ligação deve ser definida para ReadOnly.

  • O administrador da base de dados deve configurar o grupo de disponibilidade para permitir o encaminhamento apenas de leitura.

Várias ligações que usam roteamento apenas de leitura podem não se ligar todas à mesma réplica de apenas leitura. Alterações na sincronização da base de dados ou alterações na configuração de encaminhamento do servidor podem resultar em ligações do cliente a diferentes réplicas somente de leitura.

Pode garantir que todos os pedidos apenas de leitura se ligam à mesma réplica de somente leitura ao não passar um ouvinte de grupo de disponibilidade para a Server palavra-chave da cadeia de ligação. Em vez disso, especifique o nome da instância de apenas leitura.

O encaminhamento só de leitura pode demorar mais do que ligar ao primário. Isto acontece porque o encaminhamento apenas de leitura liga-se primeiro ao primário e depois procura o melhor secundário legível disponível. Devido a estes múltiplos passos, deve aumentar o seu login tempo para pelo menos 30 segundos.

OLE DB

O Driver OLE DB para SQL Server suporta tanto as palavras-chave ApplicationIntent como MultiSubnetFailover .

As duas palavras-chave de string de ligação do OLE DB foram adicionadas para suportar grupos de disponibilidade Always On no OLE DB Driver para SQL Server:

  • Intenção do aplicativo
  • MultiSubnetFailover

Para mais informações sobre palavras-chave de string de ligação no OLE DB Driver for SQL Server, consulte Utilização de Palavras-chave de String de Ligação com o Driver OLE DB para SQL Server.

Intenção do aplicativo

As propriedades equivalentes de ligação são:

  • SSPROP_INIT_APPLICATIONINTENT

  • DBPROP_INIT_PROVIDERSTRING

Um Driver OLE DB para aplicação SQL Server pode usar um dos métodos para especificar a intenção da aplicação:

  • IDBInitialize::Inicialize
    O IDBInitialize::Initialize utiliza o conjunto de propriedades previamente configurado para inicializar a fonte de dados e criar o objeto fonte de dados. Especifique a intenção da aplicação como propriedade do fornecedor ou como parte da cadeia de propriedades estendidas.

  • IDataInitialize::GetDataSource
    IDataInitialize::GetDataSource recebe uma cadeia de ligação de entrada que pode conter a palavra-chave Application Intent .

  • IDBProperties::SetProperties
    Para definir o valor da propriedade ApplicationIntent , chame IDBProperties::SetProperties passando a propriedade SSPROP_INIT_APPLICATIONINTENT com valor "ReadWrite" ou "ReadOnly" ou DBPROP_INIT_PROVIDERSTRING propriedade com valor contendo "ApplicationIntent=ReadOnly" ou "ApplicationIntent=ReadWrite".

Pode especificar a intenção de aplicação no campo Propriedades de Intenção de Aplicação do separador Todos na caixa de diálogo Propriedades do Enlace de Dados .

Quando as ligações implícitas são estabelecidas, a ligação implícita utilizará a definição de intenção de aplicação da ligação pai. De forma semelhante, múltiplas sessões criadas a partir da mesma fonte de dados herdarão a definição de intenção de aplicação da fonte.

MultiSubnetFailover

As propriedades equivalentes de ligação são:

  • SSPROP_INIT_MULTISUBNETFAILOVER

  • DBPROP_INIT_PROVIDERSTRING

Um Driver OLE DB para aplicação SQL Server pode usar um dos seguintes métodos para definir a opção MultiSubnetFailover:

  • IDBInitialize::Inicialize
    O IDBInitialize::Initialize utiliza o conjunto de propriedades previamente configurado para inicializar a fonte de dados e criar o objeto fonte de dados. Especifique a intenção da aplicação como propriedade do fornecedor ou como parte da cadeia de propriedades estendidas.

  • IDataInitialize::GetDataSource
    IDataInitialize::GetDataSource recebe uma cadeia de ligação de entrada que pode conter a palavra-chave MultiSubnetFailover .

  • IDBProperties::SetProperties
    Para definir o valor da propriedade MultiSubnetFailover , chame IDBProperties::SetProperties passando a propriedade SSPROP_INIT_MULTISUBNETFAILOVER com valor VARIANT_TRUE ou VARIANT_FALSE ou propriedade DBPROP_INIT_PROVIDERSTRING com valor contendo "MultiSubnetFailover=Yes" ou "MultiSubnetFailover=No".

Example

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);

Ver também

Driver OLE DB para Funcionalidades do SQL Server
Usando palavras-chave de cadeia de conexão com o driver OLE DB para SQL Server