Поделиться через


Установка первоначального соединения с сеансом зеркального отображения базы данных

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

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

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

После получения строки соединения поставщик доступа к данным сохраняет имя изначального участника и имя участника, являющегося резервным сервером (если оно приведено) в кэше в энергозависимой памяти (для управляемого кода кэш содержится в домене приложения). После кэширования имя изначального участника поставщиком доступа к данным не обновляется. Если клиент предоставляет имя участника, являющегося резервным сервером, то в случае, если поставщик доступа к данным не может подключиться с использованием имени изначального участника, поставщик также сохраняет имя участника, являющегося резервным сервером.

Сеанс зеркального отображения базы данных не обеспечивает защиты от проблем, связанных с доступом клиента к серверам, например если компьютер клиента испытывает проблемы во взаимодействии с сетью. Попытка соединения с отображаемой базой может завершиться неудачно по множеству причин, не относящихся к поставщику доступа к данным, например попытка соединения может оказаться неудачной, если экземпляр основного сервера неактивен; это происходит, когда выполняется переход на другую базу данных, или по причине ошибки в сети.

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

ПримечаниеПримечание

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

Если попытка завершилась неудачей, поставщик доступа к данным пытается подключиться с помощью имени участника, являющегося резервным сервером, если оно доступно. Если имя другого участника правильно идентифицирует текущий основной сервер, то поставщику доступа к данным обычно удается открыть первоначальное соединение. После завершения данного соединения поставщик доступа к данным загружает имя экземпляра текущего зеркального сервера. Это имя сохраняется в кэше как имя участника, являющегося резервным сервером; при этом предоставленное клиентом имя участника, являющегося резервным сервером, если оно существует, перезаписывается. После этого поставщик данных .NET Framework Data Provider для SQL Server не обновляет имя участника, являющегося резервным сервером. Однако, собственный клиент SQL Server обновляет кэш каждый раз, когда последующее соединение или переустановка соединения возвращает другое имя участника.

На приведенной ниже схеме показано соединение клиента с изначальным участником Участник А для отображаемой базы данных Db_1. Схема иллюстрирует случай, когда имя изначального участника, предоставленное клиентом, верно идентифицирует текущий основной сервер Участник А. Первоначально соединение завершается успешно, и поставщик доступа к данным сохраняет имя текущего зеркального сервера (Участник Б) в локальном кэше в качестве имени участника, являющегося резервным сервером. Наконец, клиент подключается к основной копии базы данных Db_1.

Клиентское соединение для случая, если начальный участник является основным сервером

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

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

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

  • Для протокола TCP/IP — в случае, если на клиенте выполняется операционная система Microsoft Windows XP или более поздняя версия — попытки подключения регулируются алгоритмом повторения подключений, специфичным для зеркального отображения базы данных. Алгоритм повторения подключений задает максимальное время (время повторений), отведенное для открытия соединения в рамках данной попытки соединения. Дополнительные сведения см. в разделе Использование ключевых слов строки соединения с собственным клиентом SQL Server.

  • Для других сетевых протоколов и для клиентов, на которых исполняется операционная система, отличная от Microsoft Windows XP или более поздней версии

    В случае ошибки или в случае, когда изначальный участник недоступен, попытки первоначального подключения продолжаются до тех пор, пока не истечет время ожидания подключения к сети, или не истечет время ожидания входа на поставщике доступа к данным. Обычно это время ожидания составляет примерно 20—30 секунд. После этого, если время ожидания поставщика доступа к данным не истекло, то поставщик пытается подключиться к участнику, являющемуся резервным сервером. Если время ожидания соединения истекло до успешного завершения подключения, или участник, являющийся резервным сервером, недоступен, попытка подключения завершается неудачно. Если до окончания времени ожидания входа участник, являющийся резервным сервером, доступен и в данный момент является основным сервером, попытка соединения обычно завершается успешно.

Строки соединения с зеркальной базой данных

Сообщаемая клиентом строка соединения содержит сведения, используемые поставщиком доступа к данным для подключения к базе данных. В этом разделе описаны ключевые слова, относящиеся к соединению с отображаемой базой данных с помощью драйвера ODBC для собственного клиента SQL Server. Дополнительные сведения обо всех ключевых словах строки соединения см. в разделе Использование ключевых слов строки соединения с собственным клиентом SQL Server.

Атрибут Network

Строка соединения должна содержать атрибут Network, указывающий сетевой протокол. Это гарантирует сохранение указанного сетевого протокола при соединении с разными участниками. Протокол TCP/IP — наилучший протокол для соединения с отображаемой базой данных. Чтобы гарантировать запрос протокола TCP/IP клиентом при каждом подключении к участникам, необходимо включить в строку соединения следующий атрибут:

Network=dbmssocn; 
Важное примечаниеВажно!

Рекомендуется, чтобы протокол TCP/IP был указан в самой верхней строке списка протоколов клиента. Однако, если в строке соединения указан атрибут Network, то он перекрывает порядок элементов списка.

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

Network=dbnmpntw; 
Важное примечаниеВажно!

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

Атрибут Server

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

Самый простой способ идентифицировать экземпляр — это указать его имя, <имя_сервера>[\<имя_экземпляра_SQL_Server>]. Например:

Server=Partner_A;

или

Server=Partner_A\Instance_2;

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

ПримечаниеПримечание

Запрос к обозревателю SQL Server необходим, если в строке соединения указано имя именованного экземпляра, а не порт.

Чтобы указать IP-адрес и порт, атрибут Server нужно записать в следующем виде Server=<ip_адрес>,<порт>, например:

Server=123.34.45.56,4724; 
ПримечаниеПримечание

IP-адрес может иметь версию 4 (IPv4) или 6 (IPv6).

Атрибут Database

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

Например, чтобы явно подключиться к базе данных AdventureWorks на основном сервере Участник А, клиент должен указать следующую строку соединения:

" Server=Partner_A; Database=AdventureWorks "

ПримечаниеПримечание

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

Важное примечаниеВажно!

Указание префикса протокола с атрибутом Server (Server=tcp:<имя_сервера>) не совместимо с атрибутом Network, и указание протокола в двух местах вероятнее всего приведет к ошибке. Поэтому рекомендуется указывать протокол в строке соединения с помощью атрибута Network, а в атрибуте Server указывать только имя сервера "Network=dbmssocn; Server=<имя_сервера>").

Атрибут Failover Partner

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

API-интерфейс

Ключевое слово для атрибута резервного участника

Поставщик OLE DB

FailoverPartner

Драйвер ODBC

Failover_Partner

Объекты ADO

Failover Partner

Дополнительные сведения о ключевых словах этих API-интерфейсов см. в разделе Использование ключевых слов строки соединения с собственным клиентом SQL Server.

Самый простой способ идентифицировать экземпляр сервера — это указать его системное имя, <имя_сервера>[\<имя_экземпляра_SQL_Server>].

Либо атрибут Failover Partner может задавать IP-адрес и номер порта. В случае неудачи первоначальной попытки подключения во время первого соединения с базой данных попытка соединения с участником, являющимся резервным сервером, не будет более зависеть от DNS и обозревателя SQL Server. После того, как соединение установлено, имя участника, являющегося резервным сервером, перезаписывается именем участника, являющегося резервным севером; таким образом, в случае сбоя перенаправленные соединения потребуют DNS и обозреватель SQL Server.

ПримечаниеПримечание

Если указано только имя изначального участника, разработчикам приложения нет необходимости предпринимать какие-либо действия или писать какой-либо код, кроме кода, предназначенного для повторного соединения.

ПримечаниеПримечание

Разработчики приложений с управляемым кодом указывают имя резервного участника в свойстве ConnectionString объекта SqlConnection. Дополнительные сведения об использовании данной строки соединения см. в разделе «Поддержка зеркального отображения баз данных в поставщике данных .NET Framework для SQL Server» документации по ADO.NET, являющейся частью пакета Microsoft .NET Framework SDK.

Пример строки соединения

Например, чтобы явно подключиться к базе данных AdventureWorks с помощью протокола TCP/IP на сервере «Участник А» или «Участник Б», клиентское приложение, использующее драйвер ODBC, должно указать следующую строку соединения:

"Server=Partner_A; Failover_Partner=Partner_B; Database=AdventureWorks; Network=dbmssocn"

Либо клиент может использовать IP-адрес и номер порта, чтобы идентифицировать изначального участника Участник А; например для IP-адреса 250.65.43.21 и номера порта 4734 строка соединения может быть следующей:

"Server=250.65.43.21,4734; Failover_Partner=Partner_B; Database=AdventureWorks; Network=dbmssocn"