2009-11-16 5 views
2

В SQL Server 2008 у меня есть родительская таблица в одной базе данных, а дочерняя таблица - в другой базе данных, причем отношения FK поддерживаются триггерами. Я не могу изменить его, не могу переместить обе таблицы в одну БД и иметь регулярное ограничение FK. Когда я восстановил обе базы данных из полных резервных копий, у меня были сироты в моей дочерней таблице, потому что полные резервные копии не были приняты одновременно. У меня также есть журналы транзакций. В случае аварийного восстановления можно ли восстановить обе базы данных точно в тот же момент, чтобы две базы данных были согласованы?Восстановление двух баз данных в одно и то же время

ответ

2

Восстановление в тот же момент времени возможно, если базы данных находятся в режиме полного восстановления и выполняются регулярные резервные копии журнала. See How to: Restore to a Point in Time (Transact-SQL).

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

Последовательность операций по восстановлению является самым большим препятствием при использовании приложения между различными базами данных.

+0

Remus, Даже если я вернусь к точному времени с точностью 3 мс, можно сделать много данных за один миллисекунду. Я думаю, что все еще могут быть сироты. –

+0

@SQL это тоже моя точка зрения: вы не можете надежно восстановить, если база данных разделена. Межсетевые транзакции помогают уменьшить его, но не могут обеспечить его соблюдение. –

+0

Remus, спасибо за решение! –

0

Я не вижу полного решения вашей проблемы, но вы можете использовать полные резервные копии с резервными копиями журнала транзакций. во-первых, вы восстанавливаете полные резервные копии на основе оснований с опцией NORECOVERY, а затем восстанавливаете резервные копии журналов транзакций с STOPAT = 'xxxxxxxx' на обеих базах. Таким образом, вы можете восстановить обе базы данных в тот же момент времени.

0

Лучший способ сделать это - исправить его в том месте, где вы делаете резервное копирование. Большинство приложений с несколькими базами данных делают это:

Перед резервным копированием выполните команду для записи отмеченной транзакции в журнале транзакций каждой используемой базы данных. (НАЧАТЬ СДЕЛКУ С МАРКАМИ) Затем выполните резервное копирование.

Таким образом, вы можете позже выполнить ВОССТАНОВЛЕНИЕ С STOPAT MARK, чтобы довести их до одного и того же момента времени. Это не идеально, но много ближе, чем другие методы.

+0

Greg, Как узнать, когда отмечать? Мне нужно восстановить после катастрофы с минимальной потерей данных. Должен ли я отмечать часто, как каждые 5 секунд? –

+0

Приложения с несколькими базами данных могут сделать это непосредственно перед началом резервного копирования. У вас есть работа, которая делает это для каждой базы данных. Затем запустите резервные копии. –

Смежные вопросы