SQL Azure. Синхронизация данных с on-premise SQL Server. BACPAC

Вместо того, чтобы сначала переносить схему, а затем заливать в нее данные, миграцию базы можно выполнить в один прием. Как уже говорилось в предыдущем посте, в DAC 2.0 появилась возможность экспорта/импорта (Export/Import), которая в отличие от извлечения/развертывания (Extract/Deploy) позволяет перетаскивать между SQL Serverами (включая SQL Azure) не только схему базы, но и содержащиеся в ней данные.

Вернемся на Рис.1 предыдущего поста и вместо Extract Data-tier application скажем Export Data-tier application.

 

image

Рис.1

 

image

Рис.2

 

image

Рис.3

 

С точки зрения миграции на SQL Azure экспорт визарда ведет себя интеллектуальней, чем экстракт. Он проверяет экспортируемые объекты на соответствие ограничениям SQL Azure. С другой стороны, эти проверки нельзя отключить, если база переносится не в Облако, а между двумя инстансами обычного SQL Server. Еще одно неудобство в том, что он не позволяет вернуться к предыдущему экрану. Приходится начинать сначала. На Рис.2 я замечаю закладку Advanced

 

image

Рис.4

 

и по наивности полагаю, что если раскликать таблицы, вызвавшие у него недовольство на Рис.3, он оставит их в покое и успешно перенесет остальные. Не тут-то было. Снова возникает та же самая ошибка Рис.3, хотя визард экспорта отдает себе отчет в том, что таблицы, на которые он ругается, выбраны не были:

 

image

Рис.5

 

Самое время почитать документацию: Export a Data-tier Application, How to: Export a Data-tier Application (SQL Azure) - а она, зараза, молчит, как рыба об лед. To specify a subset of tables to export, use the Advanced option. Год назад на вопрос Can these magical bacpac files only include a whole database, or can I just transfer a single table? человеку ответили At this time, the import/export services will retrieve the entire database. We will be adding support for selective exports prior to the final release. Ну, молодцы, - подумал я, - хорошо добавили. И оказался неправ, ибо сие есть не баг, но фича. The resultant BACPAC will contain the full schema definition plus the table data only for the specified tables (с) DAC Guy. Таким образом, галки на Рис.4 отмечают те таблицы, для которых будут перенесены данные, но структуры таблиц она будет переносить (и проверять) тупо все.

 

Не желая корежить многострадальную Northwind на локальном SQL Server, я создам ее копию (backup/restore) под именем Northwind1, откуда удалю таблицы, которые не устраивают SQL Azure и, соответственно, мастер экспорта (Рис.3) по причине отсутствия кластерного ключа. Повторяем процесс экспорта Рис.1-2 для БД Northwind1, и на этот раз он завершается успешно. Устаревшие типы (n)text и image не вызывают у SQL Azure оторжения, как и у SQL Server 2012, хотя здесь сказано, что Common database objects that are not supported in a DAC include: Objects marked for deprecation... BOL в очередной раз предупреждают, что их планируется похоронить, поэтому в новых приложениях надо использовать (n)varchar(max) и varbinary(max), а старые переписывать.

 

image

Рис.6

 

Полученный файл по умолчанию имеет расширение bacpac (в отличие dacpac в результате операции извлечения схемы). Читается как бакпак, а не васрас. Глубинный смысл буквы b, по-видимому, призван символизировать bulk copy или backup. Поскольку в SQL Azure отсутствует возможность классического BACKUP/RESTORE, функциональность bacpac можно отчасти рассматривать как разновидность создания резервной копии облачной базы. Отчасти, потому что это просто снимок состояния схемы + данных без учета находящихся в процессе транзакций, т.е. транзакционная целостность, как в случае классического бэкапа, здесь не поддерживается. Как и dacpac, bacpac-файл представляет собой архив, только в контекстное меню для этого расширения в оболочку не регистрируется пункт Unpack (см. Рис.3 предыдущего поста). Его просто можно открыть архиватором.

 

image

Рис.7

 

Помимо структуры базы в файле model.xml, аналогичного Рис.6 предыдущего поста за вычетом удаленных таблиц Region, CustomerCustomerDemo, CustomerDemographics, EmployeeTerritories, Territories, в архиве bacpac хранятся данные - см. папку Data. Она состоит из подпапок по одной на каждую из отмеченных на Рис.4 таблиц. Каждая папка имеет табличные данные в формате JSON (JavaScript Object Notation) и файлы с расширением .bin, соответствующие бинарным ячейкам. В данном случае таблица Employees имеет поле Photo типа image и 9 записей, поэтому на Рис.8 наблюдается 9 bin-файлов.

image

Рис.8

 

Для импорта bacpac на другой сервер следует подобно Рис.7 предыдущего поста пойти в SSMS -> Object Explorer -> Databases, вызвать контекстное меню, только выбрать не Deploy Data-tier Application, как в прошлый раз, а Import Data-tier Application.

 

image

Рис.9

 

image

Рис.10

 

image

Рис.11

 

image

Рис.12

 

image

Рис.13

 

База успешно создается на сервере SQL Azure, на основе model.xml (Рис.7) в составе bacpac выполняются скрипты создания объектов, из json- и bin-файлов (Рис.8) в созданные таблицы заливаются данные. Таким образом, в отличие от dacpac, который переносит только метаданные и таблицы после деплоймента остаются пустые (см. Рис.13 предыдущего поста), операция экспорта/импорта Data-tier application переносит как схемы объектов БД, так и сами данные:

 

image

Рис.14

 

Примечания.

· Dacpac можно открыть в SSDT, поработать с базой, а потом применить сделанные изменения на сервере, сказав базе upgrade - см.Рис.16 - 23 предыдущего поста. Bacpac так делать не умеет - BACPAC Import operations are limited to new or empty databases. Апгрейд-визард не воспринимает bacpac и настойчиво требует dacpac:

 

image

Рис.15

 

· Если база, которую мы собираемся импортировать из bacpac на SQL Server, существует, выдается очень витиеватое сообщение:

 

image

Рис.16

 

· Как мы проходили в посте Работа с базой из портала, SQL Azure не сиюминутно реагирует на изменения, сделанные с базой, что позволило нам ее "перегреть", выйдя за отведенные ей лимиты. Прошло несколько минут, прежде чем он прочухался и стал ругаться. Потом пришлось еще несколько минут подождать, пока он сообразил, что лишние данные удалены и размер базы вернулся в законопослушные рамки. Точно так же до него не сразу доходит drop database. Если сразу после удаления БД сделать импорт bacpac с тем же именем базы, получится ошибка Рис.16.

· Из Рис.2 можно видеть, что экспортить в bacpac можно не только на диск, но и в Blob service в Windows Azure Storage Service. Рис.11 - соответственно, импорт. Чтобы воспользоваться эти альтернативным местоположением, должен иметься storage account, как описано здесь. Импорт/экспорт облачной базы можно делать не только в SSMS, но и непосредственно из Azure Management Portal

image

               Рис.17

· У меня не получилось сделать экспорт со стороны SQL Azure по той же причине, что и сгенерировать из SSMS скрипты объектов облачной базы:

 

image

Рис.18

 

Тенденция однако. Extract (dacpac) из SQL Azure работает нормально.

 

Нам осталось разобрать еще одну возможность переноса - Deploy Database to SQL Azure - см. Рис.1 предыдущего поста. Она использует только что рассмотренный bacpac. Вместо того, чтобы сначала экспортировать базу в bacpac, а потом импортировать его на Azure, здесь вызывается экспорт и сразу за ним незамедлительный импорт:

 

image

Рис.19

 

image

Рис.20

 

image

Рис.21

 

В завершение сжато в виде шпаргалки повторим сказанное.

 

DACPAC - схема базы. Получается в SSMS -> Object Explorer как БД -> Tasks -> Extract Data-tier Application. Обратное действие: Databases -> Deploy Data-tier Application.

Dacpac можно открывать в SSDT: новый SQL Server Database Project -> Solution Explorer -> проект -> Import -> Data-tier Application (*.dacpac). Обратное действие - проект -> Snapshot Project.

Поддерживается in-place upgrade сделанных изменений в базу на SQL Server (SQL Azure): БД -> Tasks -> Upgrade Data-tier Application, подсунуть модифицированный dacpac.

 

BACPAC - схема вместе с данными. БД -> Tasks -> Export Data-tier Application. Обратное действие: Databases -> Import Data-tier Application. Апгрейд базы не поддерживается.

 

Deploy Database to SQL Azure - экспорт и импорт в одном флаконе.

 

Все это вместе называется словом DAC. Описанные действия можно выполнять программно с помощью библиотеки DAC Fx. DAC ориентирован на перенос в SQL Azure небольших по объему и несложных по логике баз. Он имеет ограничения при работе с Service Broker, зеркалированием, лог шиппингом и некоторой другой не поддерживаемой в SQL Azure функциональностью.

 

Продолжение следует.

 Алексей Шуленин