Azure ARM 模板 SQL Azure 数据库 bacpac 导入在第二次部署时失败



我正在使用New-AzureRmResourceGroupDeployment Powershell cmdlet使用Azure Resource Template部署到资源组。这是一个测试环境,因此我想从 .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 仅在这些资源的配置发生更改时创建/更新数据库(和子资源)?

或者,如果有更好的方法来使用资源模板还原数据库,我很想听听。

任何帮助或建议非常感谢!

提前感谢,

如错误消息所述,您只能将数据导入空数据库或在创建新数据库时导入数据。

您是每次都尝试将数据导入

同一数据库,还是每次都尝试将数据导入新数据库?如果是后者,那么我将与更熟悉 ARM 模板的团队成员协调,以帮助修复模板中的错误。

听起来,您希望在每个部署中重新创建相同的测试数据库。 正确?

正如 nnuemah 所说,在导入 bacpac 之前,您必须有一个空数据库或没有数据库。 我们正在研究支持 dacpac 文件的部署(除了导入 bacpac 文件),这可能会解决您的方案,尽管它们更侧重于幂等架构部署,而不是将数据还原作为方案进行测试。同时,您是否能够在部署导入 bapac 的模板之前删除带外数据库?

您可以在此处找到有关 dacpacs 和 bacpacs 及其差异的更多信息:https://msdn.microsoft.com/en-us/library/ee210546.aspx

我还将寻找在此期间可能工作的其他模板选项。

干杯,比尔

不幸的是,正如比尔所说,尚不支持 dacpac 文件的部署,但我们正在研究这个问题。目前 bacpacs 不是幂等的。一旦支持 dacpacs,您应该能够完成您所描述的内容。

我有同样的问题。对我来说,好处是即使数据库部署失败,部署模板中的其他所有内容也会提交。但出现这些错误是令人不安的。

参考Microsoft的柯克·埃文斯(Kirk Evans),这是工程师们意识到的一个已知问题。Se https://blogs.msdn.microsoft.com/kaevans/2016/03/28/deploy-bacpac-to-azure-sql-database-using-arm/#comment-56605

对此的解决方案是使用部分模板引用发出数据库部署部分的 Web 应用程序的可能性。然后,此 Web 应用程序可以查询数据库是否存在,并根据结果发出部分内容。

相关内容

最新更新