Наше приложение выполняет запись в несколько баз данных Sql Server в рамках распределенной транзакции. Ребята из Ops говорят, что это нарушает их план аварийного восстановления, потому что хотя транзакции в живых таблицах могут фиксироваться одновременно, доставка журналов в отдельные базы данных происходит в несколько разное время. Таким образом, в случае аварийного восстановления будет несколько частичных транзакций.
Есть ли способ поддерживать отдельные, но синхронизированные базы данных в DR? Или нам нужно изменить дизайн на относительно независимые базы данных (или единую базу данных)?
Я не уверен, каков ваш план аварийного восстановления операций, но вы можете выполнить восстановление до определенной транзакции, которая гарантирует, что все базы данных находятся в согласованном состоянии. Для этого вы будете использовать Отмеченные транзакции.
Одним из ограничений этого подхода является то, что вы можете восстановить только отмеченную транзакцию, а не определенный момент времени. Я не уверен, нарушает ли это вашу стратегию или нет.
Исходя из статьи выше, основной подход:
Обратите внимание, что во время двухфазной фиксации для транзакции отметки транзакции другие транзакции будут заблокированы, что может повлиять на производительность.
Использование помеченных транзакций - это, IMO, лучший способ поддерживать логическую целостность приложения через отдельные физические границы в ваших базах данных.
Другой вариант - использовать зеркальное отображение SQL (http://technet.microsoft.com/en-gb/library/cc917680.aspx). Короче говоря, это метод обеспечения завершения транзакций в двух базах данных (одна на основном сайте, одна на сайте аварийного восстановления), прежде чем она будет отмечена как завершенная. Есть очевидное влияние на производительность, и вам нужно будет определить, является ли это проблемой для вашего приложения.