This is a mirror of official site: http://jasper-net.blogspot.com/

SQL Server: миф дня (1/30) - После сбоя, выполнение текущих транзакций будет продолжено

| Monday, May 31, 2010
Всем привет! Сегодня я хочу начать серию постов, в основу которых положены публикации известного и уважаемого человека в мире SQL Server - Пола Рэндала, в которых он описывает 30 наиболее распространённых мифов в работе с SQL Server.  Пол писал по посту каждый день, на протяжении всего апреля. Подобную скорость обеспечить навряд-ли смогу :) но обещаю по мере сил развенчивать новые и новые мифы вместе с Полом. Итак, к делу!

Миф №1 – После сбоя, выполнение текущих транзакций будет продолжено
       После того как на сервере происходит аппаратный либо программный сбой, начинается ряд операций по восстановлению системы после сбоя. И если транзакция не была зафиксирована на сервере до сбоя, то не существует способа автоматически воссоздать контекст транзакции и "воскресить" выполнявшуюся транзакцию на резервном сервере, какой бы способ обеспечения отказоустойчивости вы бы ни избрали: отказоустойчивый кластер, зеркалирование, доставка журналов или SAN репликация.

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

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

       Механизм доставки журналов подразумевает периодическое снятие бэкапа лога транзакций БД первичного сервера, копирования и восстановление на произвольном количестве вторичных серверов. После сбоя администратор баз данных поднимает один из вторичных серверов. При этом он имеет возможность снять резервную копию лога транзакций с первичной БД (уже после отказа БД) и накатить её на вторичную. И опять таки, в этом случае, как часть процесса востановления произойдёт откат всех незафиксированных транзакций.

       В SAN репликации все I/O операции которые просходят на локальном SAN дублируются на удалённом, что позволяет иметь удалённую копию БД. Когда происходит сбой, система соединяется с удалённым SAN, и происходит процесс восстановления после сбоя, точно так же, как и в отказоустойчивом кластере (это упрощенное объяснение, - но идея ясна).

       *Единственный* способ, позволяющий поддерживать непрерывное соединение с БД во время сбоя – использование виртуализации с функцией "live migration", которая подразумевает то, что когда виртуальная машина поднимается, соединения не знают, что они обращаются к другому физическому узлу, на котором находится виртуальная машина.

       Но какой бы механизм вы ни использовали – если *соединение* разорвано, все данные выполняющихся в данный момент транзакций будут потеряны. Поэтому ваше приложение должно разрабатываться с учётом таких ситуаций: корректно обрабатывать разрыв соединения с базой данных и возможно выполнять повторный запуск команд.

Read more: Denis Reznik's blog

Posted via email from jasper22's posterous

0 comments: