2012-06-11 3 views
0

Я недавно пробовал большое слияние двух баз данных. Мы воссоздали схему из базы данных 2 в базу данных 1 и создали скрипт для переноса всех данных из базы данных 2 в базу данных 1. Этот сценарий занимает около 35 минут, чтобы работать и иметь операцию обработки с:Что происходит с подключениями при использовании SQl Server Database Offline?

BEGIN TRANSACTION 
... 
IF(@@error<>0) 
    COMMIT TRANSACTION 
ELSE 
    ROLLBACK TRANSACTION 

Полный сценарий бит чувствительный, но вот некоторые SQL, которые имеют одинаковую структуру: http://pastebin.com/GWJ3ZnkF

Мы запустили скрипт, и все данные были переданы без ошибок. Мы протестировали системы, работающие с новой комбинированной базой данных (удаленные права доступа к старой базе данных).

Но в качестве последней задачи мы хотели отключить старую базу данных, чтобы убедиться, что никто не использовал эту базу данных. Для этого мы использовали:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE 

Это было плохо. После этой строки кода SQL все данные в объединенной базе данных, которые мы только что скопировали, внезапно исчезли. Я сначала предположил, что он не был действительно закончен, поэтому «Откат немедленный» звучит так, будто он выполнил откат по моей транзакции.

Но почему? Разве сделка не была совершена?

Также я попытался запустить тот же скрипт несколько раз, но после каждой попытки данные не были скопированы, даже если он сказал, что скрипт был успешным. Я понятия не имею, почему ... он каким-то образом помнил мой автономный откат?

Что действительно происходит с моими подключениями?

ответ

1

Похоже, что у вас была незавершенная транзакция незафиксированной, и вы вынудили ее откат, потеряв часть работы. Остальное объясняется тем, как структурированы ваши сценарии. Вряд ли ваш сценарий имеет одну транзакцию от начала до конца. Только последняя транзакция была отброшена назад, поэтому теперь база данных осталась в состоянии, в котором она «скопирована». Вероятно, ваш скрипт выполняет различные проверки, и это промежуточное состояние отправляет скрипт в ветви «ELSE», где он не выполняет правильную работу (т. Е., По-видимому, ничего не делает).

Без письменного разрешения точного сценария, все равно все предположения.

Теперь вам нужно восстановить базу данных в согласованное состояние, которое перед копированием данных. Используйте резервную копию, которую вы взяли перед перемещением данных (вы делали ?). для дополнительного кредита убедитесь, что ваш скрипт idempotent и работает корректно на базе обновленной базы данных.

+0

+1 Хороший совет. –

+0

Спасибо, я подозреваю, что это будет как можно ближе к ответу, который я получу. Да, из. Я сделал резервную копию, но базы данных обслуживают 2 очень активных веб-системы, поэтому базы данных должны быть старыми (всего через несколько часов после загрузки средств обслуживания) для восстановления сейчас, если мы действительно не должны. Я должен попытаться создать сценарий, который может справиться с этим в текущем состоянии. – Swippen

0

С ROLLBACK IMMEDIATE:

Все незавершенные транзакции будут отменены и любые другие подключения к базе данных будет немедленно разорваны.

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

Ref: ALTER DATABASE.

Вместо проверки @@ERROR, осмотрите @@TRANCOUNT.

+0

его немного чувствительный его в основном просто выберите/вставляет: http://pastebin.com/GWJ3ZnkF данные находятся на двух разных связанных серверах. Я могу понять, почему он откатился в первый раз. Но при повторной загрузке старой базы данных и повторной попытке отказался копировать любые данные, даже если он сказал, что скрипт успешно выполнен. – Swippen

0

Я бы дважды проверял, чтобы не было никаких непогашенных транзакций. Пройдите через файл и подсчитайте количество строк BEGIN TRANSACTION vs COMMIT TRANSACTION или добавьте оператор в конец его в SELECT @@TRANCOUNT, чтобы убедиться, что открытых транзакций не осталось.

Если ваши данные были зафиксированы, не должно быть никакого способа потерять его, отсоединив вас.

+0

выдающиеся транзакции звучат как преступник, влияющий на повторные прогоны. –

+0

У меня есть только один Начать и зафиксировать, что я опубликовал в вопросах. Но у меня, вероятно, есть другие подключения, которые не связаны с слиянием, которое я хочу заставить закрыть. Могут ли они повлиять на слияние? Я проверил @@ Transcount – Swippen

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