Назад | Перейти на главную страницу

Совместимы ли MSDTC и аварийное восстановление?

Наше приложение выполняет запись в несколько баз данных Sql Server в рамках распределенной транзакции. Ребята из Ops говорят, что это нарушает их план аварийного восстановления, потому что хотя транзакции в живых таблицах могут фиксироваться одновременно, доставка журналов в отдельные базы данных происходит в несколько разное время. Таким образом, в случае аварийного восстановления будет несколько частичных транзакций.

Есть ли способ поддерживать отдельные, но синхронизированные базы данных в DR? Или нам нужно изменить дизайн на относительно независимые базы данных (или единую базу данных)?

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

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

Исходя из статьи выше, основной подход:

  1. Создайте полную или дифференциальную резервную копию каждой из связанных баз данных.
  2. Отметьте блок транзакции во всех базах данных.
  3. Создайте резервную копию журнала транзакций для всех баз данных.
  4. Восстанавливайте резервные копии базы данных С помощью NORECOVERY.
  5. Восстановите журналы с помощью STOPATMARK.

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

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

Другой вариант - использовать зеркальное отображение SQL (http://technet.microsoft.com/en-gb/library/cc917680.aspx). Короче говоря, это метод обеспечения завершения транзакций в двух базах данных (одна на основном сайте, одна на сайте аварийного восстановления), прежде чем она будет отмечена как завершенная. Есть очевидное влияние на производительность, и вам нужно будет определить, является ли это проблемой для вашего приложения.