Создание базы данных SQL Azure с помощью импорта bacpac не выполняется

Мы тестируем миграцию с локальной базы данных SQL Server 2008R2 на Azure, но столкнулись с трудностями.

Далее последовал процесс, основанный на статьях SO:

  • Установленные клиентские инструменты SQL Server 2012
  • Измененная база данных для удаления индексов с указанным коэффициентом заполнения, а также недопустимых представлений и процедур (это было определено с помощью инструмента экспорта данных уровня данных для SSMS до тех пор, пока не будет успешно создан файл bacpac)
  • загрузил успешно созданный файл BACPAC в Azure
  • Пройдены шаги по созданию новой базы данных с использованием метода импорта
  • Файл bacpac извлекается из состояния хранилища BLOB-объектов, но затем возникает следующая ошибка

BadRequest; Ошибка запроса; Код состояния ошибки: ‹/B› 'BadRequest' ‹/P› ‹P› ‹B› Подробнее: ‹/B› Ошибка при работе службы. ; Исключение Microsoft.SqlServer.Management.Dac.Services.ServiceException: невозможно аутентифицировать запрос; ‹/P› ‹/DIV› ‹/BODY› ‹/html›

Примечание: текст ошибки выше был обрезан, чтобы исключить URL-адреса, так как у меня недостаточно очков.

Кажется, я не могу найти никакой информации об этой ошибке или о том, где могут быть какие-либо дополнительные данные журнала, чтобы помочь определить, почему она не будет импортирована.

Поскольку в ошибке упоминается невозможность аутентификации, мы также попытались сделать следующее:

  • Создал нового пользователя и пароль в локальной БД
  • Использовал того же нового пользователя и пароль для определения новой БД в Azure.

Это не имело никакого значения.

Был бы признателен, если бы кто-нибудь мог указать нам правильное направление, чтобы это работало, так как нам нужно будет повторить этот процесс довольно много раз.

Спасибо.


person moretolearn    schedule 22.11.2013    source источник


Ответы (2)


Нам нужно то же самое. Вот некоторые шаги, которые мы сделали, и результаты:

1) Экспорт с помощью средства миграции базы данных SQL, созданного ghuey. Вы можете скачать здесь: https://sqlazuremw.codeplex.com/ Это отличный инструмент, и я очень рекомендую вам сначала попробовать его. В зависимости от сложности вашей базы данных, она будет работать нормально. У нас, к сожалению, не сработало. Итак, вы перешли к следующему шагу.

2) Пакет DAC. В 2008 году есть возможность сгенерировать DACPAC, который создает структуру базы данных в Azure, а затем вы можете выполнить развертывание в Azure, ссылаясь на соединение в 2008 Studio Managament. Щелкните правой кнопкой мыши на Azure. Сервер, развертывание ... подробнее см. Здесь: http://world.episerver.com/documentation/Items/Upgrading/EPiserver-Commerce/8/Migrating-Commerce-databases-to-Azure/ Что ж, если это сработает для вас, ПОПРОБУЙТЕ ЭТО. Так проще. У нас, к сожалению, не сработало. Итак, вы перешли к следующему шагу.

3) Использование сервера 2012 для экспорта BACPAC и последующего импорта в Azure. Для этого необходимо выполнить несколько действий. Вот:

а. Создайте резервную копию в 2008 и переместите файл на сервер 2012;

б. Восстановить резервную копию в 2012 году;

c. Сделайте SQL, который:

c1. Установить всех владельцев СХЕМ на DBO. Вы можете использовать SQL для перемещения схемы следующим образом: ALTER AUTHORIZATION ON SCHEMA :: [db_datareader] TO [dbo]

c2. Удалите всех созданных вами пользователей;

c3. Удалите все MS_Description (Расширить свойства) всех столбцов и таблиц

c4. Отбросьте все ограничения (совет: сгенерируйте полный скрипт базы данных с включенной опцией drop and create и скопируйте часть «drop constraint»

c5. Нам нужно удалить параметры коэффициента заполнения индексов вашей базы данных. Вы можете сделать это повторно, создав индекс (включая PK, с которым связан кластерный индекс). Отбросить каждый кластер PK - не так просто, но с небольшой помощью Google вы сможете найти сценарий, который поможет вам создавать и удалять. Вот сценарий:

    DECLARE @object_id int;
    DECLARE @parent_object_id int;
    DECLARE @TSQL NVARCHAR( 4000);
    DECLARE @COLUMN_NAME SYSNAME;
    DECLARE @is_descending_key bit;
    DECLARE @col1 BIT;
    DECLARE @action CHAR( 6);

    SET @action = 'DROP';
    --SET @action = 'CREATE';

    DECLARE PKcursor CURSOR FOR
    select kc.object_id , kc .parent_object_id
    from sys.key_constraints kc
    inner join sys .objects o
    on kc.parent_object_id = o.object_id
    where kc.type = 'PK' and o. type = 'U'
    and o.name not in ( 'dtproperties','sysdiagrams' )  -- not true user tables
    order by QUOTENAME (OBJECT_SCHEMA_NAME( kc.parent_object_id ))
            ,QUOTENAME( OBJECT_NAME(kc .parent_object_id));

    OPEN PKcursor ;
    FETCH NEXT FROM PKcursor INTO @object_id, @parent_object_id;

    WHILE @@FETCH_STATUS = 0
    BEGIN
    IF @action = 'DROP'
        SET @TSQL = 'ALTER TABLE '
                    + QUOTENAME (OBJECT_SCHEMA_NAME( @parent_object_id))
                    + '.' + QUOTENAME(OBJECT_NAME (@parent_object_id))
                    + ' DROP CONSTRAINT ' + QUOTENAME(OBJECT_NAME (@object_id))
    ELSE
        BEGIN
        SET @TSQL = 'ALTER TABLE '
                    + QUOTENAME (OBJECT_SCHEMA_NAME( @parent_object_id))
                    + '.' + QUOTENAME(OBJECT_NAME (@parent_object_id))
                    + ' ADD CONSTRAINT ' + QUOTENAME(OBJECT_NAME (@object_id))
                    + ' PRIMARY KEY'
                    + CASE INDEXPROPERTY( @parent_object_id
                                        ,OBJECT_NAME( @object_id),'IsClustered' )
                        WHEN 1 THEN ' CLUSTERED'
                        ELSE ' NONCLUSTERED'
                    END
                    + ' (' ;

        DECLARE ColumnCursor CURSOR FOR
            select COL_NAME (@parent_object_id, ic.column_id ), ic .is_descending_key
            from sys .indexes i
            inner join sys. index_columns ic
            on i .object_id = ic .object_id and i .index_id = ic .index_id
            where i .object_id = @parent_object_id
            and i .name = OBJECT_NAME (@object_id)
            order by ic. key_ordinal;

        OPEN ColumnCursor ;

        SET @col1 = 1 ;

        FETCH NEXT FROM ColumnCursor INTO @COLUMN_NAME, @is_descending_key;
        WHILE @@FETCH_STATUS = 0
        BEGIN
            IF (@col1 = 1 )
                SET @col1 = 0
            ELSE
                SET @TSQL = @TSQL + ',';

            SET @TSQL = @TSQL + QUOTENAME( @COLUMN_NAME)
                        + ' '
                        + CASE @is_descending_key
                            WHEN 0 THEN 'ASC'
                            ELSE 'DESC'
                        END;

            FETCH NEXT FROM ColumnCursor INTO @COLUMN_NAME, @is_descending_key;
        END;

        CLOSE ColumnCursor ;
        DEALLOCATE ColumnCursor ;

        SET @TSQL = @TSQL + ');';

        END;

    PRINT @TSQL;

    FETCH NEXT FROM PKcursor INTO @object_id , @parent_object_id ;
    END;

    CLOSE PKcursor ;
    DEALLOCATE PKcursor ;

c6. Восстановите FK

c7. Удалить все индексы

c8. Повторно создать все индексы (без параметров коэффициента заполнения)

d. Теперь щелкните правой кнопкой мыши базу данных 2012 года и экспортируйте уровень данных в хранилище Azure в формате BACPAC. После завершения импортируйте в Azure. Должно работать :-)

person Charles    schedule 02.04.2015
comment
Привет, Чарльз. Теперь, когда Azure SQL DB V12 переходит на глобальную версию GA, было бы неплохо обновить ответ. Подключения к БД V12 не будут выполнены, если у вас не будет более новой версии DacFx при выполнении этого рабочего процесса. Для справки вам необходимо установить SSMS для SQL Server 2014 и обновить до последней версии DacFx (ссылка на странице пакета функций microsoft.com/en-us/download/details.aspx?id=42295). Большим преимуществом является то, что V12 поддерживает гораздо большую площадь поверхности - расширенные свойства и многие другие ваши блокировщики больше не должны блокировать вам экспорт. - person Kevin Cunnane; 06.04.2015

Для всех, кто может наткнуться на это, мы смогли найти проблему, используя файл bacpac для создания новой базы данных на локальном сервере 2008R2 с помощью инструментов клиента 2012.

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

Надеюсь, это поможет другим с ошибками импорта в SQL Azure.

person moretolearn    schedule 04.12.2013