Шаблон Azure ARM SQL База данных Azure Bacpac не удается импортировать при втором развертывании

Я использую командлет Powershell New-AzureRmResourceGroupDeployment для развертывания в группе ресурсов с помощью шаблона ресурсов Azure. Это тестовая среда, поэтому я хочу восстановить базу данных из файла .bacpac, чтобы заполнить базу данных реалистичным объемом данных.

Следующий фрагмент кода успешно развертывается при первом развертывании в этой группе ресурсов, поскольку базы данных нет, но не выполняется при любом последующем развертывании.

{
                "name": "[variables('databaseName')]",
                "type": "databases",
                "location": "[resourceGroup().location]",
                "apiVersion": "2014-04-01-preview",
                "dependsOn": [
                    "[variables('databaseServerName')]",
                    "[concat('Microsoft.Sql/servers/', variables('databases.ServerName'))]"
                ],
                "tags": {
                    "displayName": "testDatabase"
                },
                "properties": {
                    "collation": "[variables('databaseCollation')]",
                    "edition": "[variables('databaseEdition')]",
                    "maxSizeBytes": "1073741824",
                    "requestedServiceObjectiveName": "[variables('databaseServicePlan')]"
                },
                "resources": [
                    {
                        "name": "Import",
                        "type": "extensions",
                        "apiVersion": "2014-04-01-preview",
                        "dependsOn": [
                            "[variables('databaseName')]"
                        ],
                        "properties": {
                            "storageKeyType": "[variables('databaseBackupStorageKeyType')]",
                            "storageKey": "[parameters('databaseBackupStorageKey')]",
                            "storageUri": "[concat(parameters('databaseBackupStorageLocation'), '/', parameters('backupFileName'))]",
                            "administratorLogin": "[variables('databaseAdminLogin')]",
                            "administratorLoginPassword": "[variables('databaseAdminPassword')]",
                            "operationMode": "Import"
                        }
                    }
                ]
            }

Ошибка при выходе из строя:

Resource Microsoft.Sql/servers/databases/extensions '[resource-group-name]/[database-name]/Import' failed with message 'The ImportExport operation with Request Id 'b1f54bdd-6c98-4feb-a86f-656a5c6f1cc5' failed due to 'Error encountered during the service operation. 

Data cannot be imported into target because it contains one or more user objects. Import should be performed against a new, empty database.

Возможно, я неправильно понял, как эти шаблоны развертываются - я думал, что ARM исправил среду. Кто-нибудь знает, как я могу сообщить ARM, чтобы он создавал / обновлял базу данных (и подресурсы) только в том случае, если конфигурация этих ресурсов изменилась?

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

Любая помощь или совет приветствуются!

Заранее спасибо,

Роб




Ответы (4)


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

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

person nnuemah    schedule 08.07.2016
comment
В идеале я хотел бы иметь возможность развертывать шаблон много раз в одной и той же группе ресурсов, но импортировать базу данных только в первый раз, иначе ARM распознает, что импорт не может произойти, и пропустит этот шаг. - person Rob; 11.07.2016

судя по звуку, вы хотите воссоздавать одну и ту же тестовую базу данных при каждом развертывании. Верный?

Как говорит nnuemah, перед импортом bacpac у вас должна быть либо пустая база данных, либо ее нет. Мы рассматриваем возможность поддержки развертывания файлов dacpac (в дополнение к импорту файлов bacpac), которые могут решить ваш сценарий, хотя они больше нацелены на развертывание идемпотентной схемы, а не на тестирование. восстановление данных как сценарий. А пока вы можете удалить базу данных по внешнему каналу перед развертыванием шаблона, который импортирует bacpac?

Вы можете узнать больше о DACPAC и BACPAC и различиях здесь: https://msdn.microsoft.com/en-us/library/ee210546.aspx

Я также поищу другие варианты шаблонов, которые могут работать тем временем.

Привет, Билл

person Bill Gibson - MSFT    schedule 08.07.2016
comment
Я хочу создать и импортировать базу данных только при первом развертывании, последующие развертывания используются для исправлений кода (MS Deploy) и исправлений схемы (DbUp). Мы передаем эти среды тестировщикам, поэтому хотели бы сохранить изменения данных, которые они вносят между исправлениями среды. - person Rob; 11.07.2016

К сожалению, как сказал Билл, развертывание файлов dacpac еще не поддерживается, но мы этим занимаемся. И в настоящее время бакпаки не идемпотентны. Как только dacpacs поддерживаются, вы сможете выполнить то, что описываете.

person nnuemah    schedule 22.07.2016

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

Ссылаясь на Кирка Эванса из Microsoft, это известная проблема, о которой знают инженеры. Se https://blogs.msdn.microsoft.com/kaevans/2016/03/28/deploy-bacpac-to-azure-sql-database-using-arm/#comment-56605

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

person Bogi lenvig    schedule 07.10.2016
comment
Спасибо за ссылку + предложение! Кажется, это неплохой способ сделать это, возможно, функция Azure будет подходящим местом для ее размещения! Мое обходное решение включало сценарий PS, который проверяет наличие RG, и, если это так, запускает шаблон с разделами импорта, иначе запускает шаблон без них ... довольно грубо, если подумать :) - person Rob; 19.10.2016