Я настраиваю автоматическое переключение БД на C # с SQL Server 2008, и у меня есть «высокая безопасность с автоматическим зеркалом аварийного переключения» с использованием настройки свидетеля, и моя строка подключения выглядит так
"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"
Во время тестирования, когда я выключаю службу SQL Server на основном сервере, автоматическое переключение на другой работает как шарм, но если я отключаю основной сервер (путем выключения сервера или отключения сетевой карты), автоматическое переключение на другой не работает, и мой сайт просто время ожидания.
я нашел Эта статья где второй последний пост предполагает, что это потому, что мы используем именованные каналы, которые не работают, когда принципал отключается, но мы принудительно вводим TCP в нашу строку подключения.
Что мне не хватает, чтобы эта функция автоматического переключения БД работала?
Проработав неделю с MS, мы выяснили, почему это происходит.
По сути, приложение не выполняет аварийное переключение, потому что оно должно быть уверенным, что база данных аварийно завершила работу, а время ожидания соединения sql истекает до того, как соединение определит, что БД сбой.
Процесс подтверждения сбоя базы данных (со всеми параметрами реестра tcp по умолчанию) заключается в следующем:
Когда принципал не работает, это сообщение занимает около 21 секунды, потому что он:
Итак, если ваше sql-соединение не ждет 21 секунду (возможно, больше в реальности), то его время истечет, прежде чем он закончит этот танец, и он вообще не будет сбой.
Решение - установить для тайм-аута в строке подключения большое значение, на всякий случай мы используем 60 секунд.
Ура
Мне интересно, не соблюдаются ли условия автоматического переключения при отказе во время ваших тестов? В частности, если база данных не синхронизирована с зеркалом (проверьте состояние зеркального отображения из sys.database_mirroring) во время сбоя И / ИЛИ, если свидетель и зеркало не подключены в это время (проверьте через эхо-запросы между участвующими ролями).
У вас также может быть ситуация, когда ваш партнер и зеркало не подключены друг к другу, но партнерская и зеркальная базы данных по-прежнему подключены к свидетелю независимо. В этом случае свидетель не видит ничего плохого (а значит, и переключения при отказе). Но вы упомянули, что отключили сам сервер, поэтому это звучит менее вероятно.
Или вы говорите, что в конечном итоге переключение произойдет, но повторное подключение не удастся? В этом случае время обнаружения и переключения при отказе зависит от того, как отказал принципал, и от общего времени восстановления зеркальной базы данных.