Как импортировать транзакционно-несогласованный bacpac

Это хорошо известно, что создание bacpac в SQL Azure не гарантирует согласованности транзакций при экспорте действующей изменяющейся базы данных.

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

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

Впрочем, мой вопрос не об этом. Мой вопрос заключается в следующем: если для меня приемлемо иметь транзакционно несогласованный bacpac, есть ли способ его фактического восстановления (т.е. импорта)? Проблема проста — из-за того, что некоторые ограничения больше не выполняются, импорт завершается неудачей (скажем, с исключением FK). Хотя восстановление bacpac представляет собой не что иное, как повторное создание БД из схемы с последующим массовым импортом, весь процесс полностью непрозрачен, и пользователю предоставляется мало контроля. Однако, поскольку инструменты Azure SQL постоянно находятся в движении, я не удивлюсь, если это станет возможным.

Итак, резюмируя, вопрос: учитывая потенциально несогласованный bacpac (т. е. некоторые константы не будут выполняться), есть ли способ (без написания тонны кода) импортировать его в локальную базу данных? >


person David Airapetyan    schedule 16.07.2015    source источник
comment
Примечание. Согласно недавнему сообщению в блоге (azure.microsoft.com/blog/2015/04/15/), импорт/экспорт нельзя полностью заменить встроенными резервными копиями. Импорт/экспорт вместе с клиентскими инструментами, такими как SSDT и SSMS, по-прежнему рекомендуется для переноса данных в базу данных SQL Azure и из нее. так что моя проблема все еще актуальна даже с новыми уровнями.   -  person David Airapetyan    schedule 17.07.2015


Ответы (1)


Попробуйте использовать BCP.exe для импорта данных.

  1. bacpac — это zip-файл. Вы можете открыть bacpac, изменив расширение файла на .zip. Все данные фиксируются в формате файла .bcp в папке «Данные».
  2. Переместите папку Data из zip-файла и сохраните ее для шага 4 ниже.
  3. Измените расширение .zip обратно на .bacpac и импортируйте его. Он создает базу данных только со схемой.
  4. С помощью bcp.exe импортируйте файлы .bcp в таблицы базы данных. https://msdn.microsoft.com/en-us/library/ms162802.aspx
  5. Устраните неполадки и устраните несоответствие данных.

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

person Eric Kang    schedule 21.07.2015
comment
Спасибо. Было бы полезно, если бы вы включили в свой ответ пример вызова инструмента bcp из командной строки (для шага № 4). Обратите внимание, что перед выполнением шага 4, вероятно, потребуется отключить ограничения, а на шаге 5 добавить контрольные ограничения dbcc. - person David Airapetyan; 22.07.2015
comment
@DavidAirapetyan вот еще один вариант, надеюсь, поможет. - person Shaiju T; 20.02.2017