Поддержка высокого уровня доступности и аварийного восстановления в драйвере OLE DB для SQL Server

Относится к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureAzure Synapse AnalyticsСистема аналитической платформы (PDW)SQL база данных в Microsoft Fabric

Скачать драйвер OLE DB

В этой статье рассматривается поддержка OLE DB Driver for SQL Server для групп доступности AlwaysOn. Дополнительные сведения о Группы доступности Always On см. в разделах Прослушиватели групп доступности, возможность подключения клиентов и отработка отказа приложений (SQL Server), Создание и настройка групп доступности (SQL Server), Отказоустойчивая кластеризация и группы доступности Always On (SQL Server) и Активные вторичные реплики. Доступ только для чтения ко вторичным репликам (группы доступности Always On).

Прослушиватель для заданной группы доступности можно задать в строке подключения. Если приложение драйвера OLE DB для SQL Server подключено к базе данных в группе доступности, которая выполняет переход на другой ресурс, то исходное соединение разрывается, а приложение должно установить новое соединение, чтобы продолжить работу после отработки отказа.

Если вы не подключаетесь к прослушивателю группы доступности, а с именем узла связано множество IP-адресов, то драйвер OLE DB для SQL Server последовательно переберет все IP-адреса, связанные с записью DNS. Это может занять много времени, если первый IP-адрес, возвращенный DNS-сервером, не привязан ни к одной из сетевых интерфейсных плат. При подключении к прослушивателю группы доступности драйвер OLE DB для SQL Server пытается установить подключение ко всем IP-адресам параллельно, и если одна из попыток окажется успешной, драйвер отменит остальные ожидающие попытки подключения.

Примечание.

Увеличение времени ожидания соединения и реализация логики повторного соединения позволяют повысить вероятность соединения приложения с группой доступности. Кроме того, в связи с возможностью неудачного подключения при отработке отказа группы доступности следует реализовать логику повторного соединения, обеспечивающую неограниченное число попыток соединения до достижения успеха.

Подключение с MultiSubnetFailover

Всегда указывайте MultiSubnetFailover=Да, если цель — База данных SQL Azure, Управляемый экземпляр SQL Azure, SQL база данных в Microsoft Fabric, слушатель группы доступности Always On или SQL Server Failover Cluster Instance.

Когда имя сервера в вашей строка подключения разрешается на более чем один IP-адрес, MultiSubnetFailover=Yes сообщает OLE DB Driver for SQL Server открывать соединения со всеми этими адресами одновременно и использовать первый, который отвечает. Без него водитель пробует по адресам по одному. Адрес, который не отвечает, зависает до истечения тайм-аута подключения TCP операционной системы, что может истечь его до того, как драйвер достигнет ответного адреса. После переключения на отказ адрес, который драйвер пытается первым, может быть таким, который больше не обслуживает базу данных, поэтому соединение, которое успешно работает с другим адресом, терпит сбой с тайм-аутом.

MultiSubnetFailover=Да меняет скорость поиска репликой, обслуживающей базу данных. Это не меняет времени, которое требуется серверу для отказа.

MultiSubnetFailover=Да безопасен на целях с одним IP. Когда DNS разрешается на один адрес, драйвер делает одну попытку подключения, поэтому настройка не стоит ничего, когда она не нужна.

Дополнительные сведения о ключевых словах строки подключения см. в статье Использование ключевых слов строки подключения с драйвером OLE DB для SQL Server.

Следуйте приведенным ниже рекомендациям для подключения к серверу в группе доступности или экземпляру отказоустойчивого кластера.

  • Установите свойство подключения MultiSubnetFailover на Да.

  • Чтобы установить соединение с группой доступности, указывайте ее прослушиватель в строке подключения вместо сервера.

  • Вы не можете использовать MultiSubnetFailover поверх протокола, отличного от TCP.

  • Подключение к экземпляру SQL Server, настроенному с более чем 64 IP-адресами, приводит к сбою соединения.

  • Нельзя использовать MultiSubnetFailover с зеркалированием базы данных. Драйвер возвращает ошибку, когда сервер сообщает, что база данных зеркалирована. Зеркалирование базы данных устарело во всех поддерживаемых версиях SQL Server. Вместо этого используйте группы доступности AlwaysOn.

  • Тип аутентификации — SQL Server Authentication, Kerberos Authentication или Windows Authentication — не влияет на поведение приложения, использующего свойство подключения MultiSubnetFailover.

  • Вы можете увеличить значение Connect Timeout , чтобы учесть время отказа и сократить попытки повторного подключения приложений. Значение по умолчанию составляет 15 секунд. Та же настройка называется Timeout , когда вы задаёте её через IDBInitialize::Initialize, и она отображается на свойство DBPROP_INIT_TIMEOUT . Для База данных SQL Azure serverless с включенной автопаузой используйте тайм-аут Connect не менее 60 секунд. Автоматически приостановленная база данных возобновляется при первой попытке подключения, и эта попытка может провалиться из-за ошибки 40613 во время возобновления базы данных, поэтому приложение должно попробовать снова. Для получения дополнительной информации смотрите разделы «Автопауза и автовозобновление».

  • Распределенные транзакции не поддерживаются.

Если маршрутизация только для чтения неактивна, подключение к расположению вторичной реплики в группе доступности завершится ошибкой в следующих случаях:

  1. Если расположение вторичных реплик не настроено на приём подключений.
  2. Если приложение использует ApplicationIntent=ReadWrite , а вторичная реплика настроена для доступа только для чтения.

Соединение не выходит из строя, если основная реплика настроена на отклонение нагрузок только для чтения, а строка подключения содержит ApplicationIntent=ReadOnly.

Обновление от зеркалирования базы данных

Ошибка соединения возникает, если строка подключения содержит как ключевые слова MultiSubnetFailover, так и Failover_Partner. Ошибка также возникает, если вы используете MultiSubnetFailover, и SQL Server возвращает ответ партнера по отказу, указывающий, что это часть пары зеркалирования базы данных.

Если вы обновляете OLE DB Driver for SQL Server-приложение, которое сейчас использует зеркалирование базы данных, до многосетевого сценария, удалите свойство Failover_Partner соединения и замените его на MultiSubnetFailover с режимом «Да». Замените имя сервера в строке подключения на прослушиватель группы доступности. Если строка подключения использует Failover_Partner и MultiSubnetFailover=Да, драйвер генерирует ошибку. Однако если строка подключения использует Failover_Partner и MultiSubnetFailover=No (или ApplicationIntent=ReadWrite), приложение использует зеркалирование базы данных.

Драйвер возвращает ошибку, если вы используете зеркалирование базы данных на основной реплике в группе доступности, а также при использовании MultiSubnetFailover=Yes в строка подключения, которая подключается к основной реплике, а не к слушателю группы доступности.

Установка MultiSubnetFailover программно

Эквивалентными свойствами соединения являются следующие:

  • SSPROP_INIT_MULTISUBNETFAILOVER
  • DBPROP_INIT_PROVIDERSTRING

Драйвер OLE DB Driver for SQL Server может использовать один из следующих методов для настройки опции MultiSubnetFailover:

  • IDBInitialize::Initialize
    Использует ранее настроенный набор свойств для инициализации источника данных и создания объекта источника данных. Укажите MultiSubnetFailover как свойство провайдера или как часть строки расширенных свойств.
  • IDataInitialize::GetDataSource
    Берет входную строка подключения, которая может содержать ключевое слово MultiSubnetFailover.
  • IDBProperties::SetProperties
    Чтобы установить значение свойства MultiSubnetFailover , вызовите IDBProperties::SetProperties , передавая свойство SSPROP_INIT_MULTISUBNETFAILOVER со значением VARIANT_TRUE или VARIANT_FALSE, или свойство DBPROP_INIT_PROVIDERSTRING со значением MultiSubnetFailover=Yes или MultiSubnetFailover=No.

Пример

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

Указание намерения приложения

В строке подключения можно указать ключевое слово ApplicationIntent. Присваиваемые значения: ReadWrite (по умолчанию) или ReadOnly.

Если задано значение ApplicationIntent=ReadOnly, при подключении клиент запрашивает рабочую нагрузку чтения. Сервер принудительно реализует намерение в момент соединения и во время выполнения инструкции USE для базы данных.

Ключевое слово ApplicationIntent не работает с базами данных прежних версий, доступными только для чтения.

Целевые объекты ReadOnly

Если при подключении выбрано значение ReadOnly, подключение назначается любой из следующих специальных конфигураций, которые могут применяться для базы данных:

Если все эти специальные целевые объекты недоступны, выполняется чтение из обычной базы данных.

Ключевое слово ApplicationIntent активирует маршрутизацию только для чтения.

Маршрутизация только для чтения

Маршрутизация только для чтения — это функция, которая способна обеспечить доступность реплики базы данных только для чтения. Чтобы включить маршрутизацию только для чтения, необходимо выполнить следующие условия:

  • Необходимо установить подключение к прослушивателю группы доступности Always On.

  • Ключевое слово ApplicationIntent строки подключения должно быть установлено в значение ReadOnly.

  • Администратор базы данных должен настроить группу доступности на включение маршрутизации только для чтения.

Возможно, не все соединения, для каждого из которых используется маршрутизация только для чтения, будут подключаться к одной и той же реплике только для чтения. Изменения в синхронизации баз данных или в конфигурации маршрутизации сервера могут привести к тому, что клиент будет подключаться к различным репликам только для чтения.

Чтобы гарантировать, что все запросы на подключение только для чтения будут соединяться с одной и той же репликой только для чтения, не указывайте прослушиватель группы доступности в ключевом слове строки подключения Server. Вместо этого укажите имя экземпляра, доступного только для чтения.

Маршрутизация только для чтения может занять больше времени, чем подключение к первичной реплике. Это происходит потому, что при маршрутизации с правом доступа только для чтения выполняется подключение к первичной реплике, а затем выполняется поиск наиболее подходящей вторичной реплики, доступной для чтения. При выполнении этих нескольких действий время ожидания для операции login нужно увеличить как минимум на 30 секунд.

ApplicationIntent

Драйвер OLE DB Driver for SQL Server поддерживает ключевое слово ApplicationIntent строка подключения. Дополнительные сведения о ключевых словах строки подключения см. в статье Использование ключевых слов строки подключения с драйвером OLE DB для SQL Server.

Программно настроить ApplicationIntent

Эквивалентными свойствами соединения являются следующие:

  • SSPROP_INIT_APPLICATIONINTENT
  • DBPROP_INIT_PROVIDERSTRING

Приложение OLE DB Driver for SQL Server может использовать один из следующих методов для указания намерения приложения:

  • IDBInitialize::Initialize
    Использует ранее настроенный набор свойств для инициализации источника данных и создания объекта источника данных. Укажите назначение приложения в качестве свойства поставщика или в виде расширенной строки свойств.
  • IDataInitialize::GetDataSource
    Берет входную строка подключения, которая может содержать ключевое слово Application Intent.
  • IDBProperties::SetProperties
    Чтобы установить значение свойства ApplicationIntent , вызовите IDBProperties::SetProperties , передавая свойство SSPROP_INIT_APPLICATIONINTENT со значением ReadWrite или ReadOnly, либо свойство DBPROP_INIT_PROVIDERSTRING со значением ApplicationIntent=ReadOnly или ApplicationIntent=ReadWrite.

Вы можете указать намерение приложения в поле «Свойства намерения приложения» на вкладке «Все в диалоговом окне «Свойства связи».

Когда вы устанавливаете неявные связи, неявное соединение использует настройку интента приложения родительского соединения. Аналогично, несколько сессий, созданных из одного и того же источника данных, наследуют настройку приложения intent источника данных.