快速入门:将 bacpac 文件导入 Azure SQL 数据库或 Azure SQL 托管实例中的数据库

适用于: Azure SQL 数据库 Azure SQL 托管实例

你可以使用 .bacpac 文件将 SQL Server 数据库导入 Azure SQL 数据库或 SQL 托管实例。 可以从 Azure Blob 存储(仅限标准存储)中存储的 .bacpac 文件或从本地位置中的本地存储导入数据。 若要通过提供更多且更快的资源将导入速度最大化,请在导入过程中将数据库扩展到更高的服务层级和更大的计算大小。 然后,可以在导入成功后进行缩减。

注意

使用专用链接导入和导出目前处于预览版阶段。

使用 Azure 门户

Azure 门户仅支持在 Azure SQL 数据库中创建单个数据库,并且仅根据存储在 Azure Blob 存储中的 .bacpac 文件创建

警告

从 SqlPackage 生成的超过 4GB 的 Bacpac 文件可能无法从 Azure 门户或 Azure PowerShell 导入,并显示一条错误消息,指出 File contains corrupted data.。 这是已知问题的结果,解决方法是使用 SqlPackage 命令行实用工具导入 bacpac 文件。 有关详细信息,请参阅 SqlPackageissue log

若要将数据库从 bacpac 文件迁移到 Azure SQL 托管实例中,请使用 SQL Server Management Studio 或 SQLPackage,当前不支持使用 Azure 门户或 Azure PowerShell。

注意

处理通过 Azure 门户或 PowerShell 提交的导入/导出请求的计算机需要存储 bacpac 文件以及数据层应用程序框架 (DacFX) 生成的临时文件。 相同大小的数据库之间所需的磁盘空间差异很大,所需的磁盘空间最多可能是数据库大小的 3 倍。 运行导入/导出请求的计算机只有 450 GB 的本地磁盘空间。 因此,某些请求可能会失败,并显示错误 There is not enough space on the disk。 在这种情况下,解决方法是在具有足够本地磁盘空间的计算机上运行 SqlPackage。 我们建议使用 SqlPackage 导入/导出大于 150GB 的数据库以避免此问题。

  1. 若要使用 Azure 门户从 bacpac 文件导入新的单个数据库,请打开相应的服务器页面,然后在工具栏上选择“导入数据库”。

    Azure 门户的逻辑服务器概述页的屏幕截图,其中选择了数据库导入。

  2. 选择“选择备份”。 选择托管数据库的存储帐户,然后选择要从中导入的 bacpac 文件。

  3. 指定新数据库大小(通常与源数据库相同)并提供目标 SQL Server 凭据。 有关 Azure SQL 数据库中新数据库的可能值列表,请参阅创建数据库

    Azure 门户的数据库导入页的屏幕截图。

  4. 选择“确定”。

  5. 若要监视导入的进度,请打开数据库的服务器页,然后在“设置”下,选择“导入/导出历史记录”。 成功导入后,状态为“已完成”。

    Azure 门户的服务器概述页的屏幕截图,其中显示了数据库导入状态。

  6. 若要验证数据库在服务器上是否处于活动状态,请选择“SQL 数据库”并验证新数据库是否为“联机”。

使用 SqlPackage

若要使用 SqlPackage 命令行实用程序导入 SQL Server 数据库,请参阅导入参数和属性。 可以下载适用于 Windows、macOS 或 Linux 的最新 SqlPackage

在大多数生产环境中,建议使用 SqlPackage 而不是 Azure 门户来实现缩放和性能。 有关 SQL Server 客户咨询团队使用 BACPAC 文件进行迁移的博客,请参阅使用 BACPAC 文件从 SQL Server 迁移到 Azure SQL 数据库

基于 DTU 的预配模型支持为每个层选择数据库最大大小值。 导入数据库时,请使用其中一种受支持的值

以下 SqlPackage 命令可将 AdventureWorks2008R2 数据库从本地存储导入到名为 mynewserver20170403 的逻辑 SQL 服务器。 它将创建名为 myMigratedDatabase 的新数据库,其中包含“高级”服务层级和 P6 服务目标。 根据你的环境更改这些值。

SqlPackage /a:import /tcs:"Data Source=<serverName>.database.chinacloudapi.cn;Initial Catalog=<migratedDatabase>;User Id=<userId>;Password=<password>" /sf:AdventureWorks2008R2.bacpac /p:DatabaseEdition=Premium /p:DatabaseServiceObjective=P6

重要

若要从公司防火墙后连接到 Azure SQL 数据库,该防火墙必须打开端口 1433。 若要连接到 SQL 托管实例,必须有点到站点连接或快速路由连接。

作为用户名和密码的替代方法,可以使用 Microsoft Entra ID(旧称 Azure Active Directory)。 目前,导入/导出服务在需要 MFA 时不支持 Microsoft Entra ID 身份验证。 将 /ua:true/tid:"yourdomain.partner.onmschina.cn" 替换为用户名和密码参数。 本示例演示如何使用 SqlPackage 和 Microsoft Entra 身份验证导入数据库:

SqlPackage /a:Import /sf:testExport.bacpac /tdn:NewDacFX /tsn:apptestserver.database.chinacloudapi.cn /ua:True /tid:"apptest.partner.onmschina.cn"

Azure Data Studio

Azure Data Studio 是一款免费的开源工具,可用于 Windows、macOS 和 Linux。 “SQL Server dacpac”扩展为包括导出和导入在内的 SqlPackage 操作提供向导接口。 有关安装和使用该扩展的详细信息,请参阅 SQL Server dacpac 扩展文档

使用 PowerShell

注意

Azure SQL 托管实例当前不支持使用 Azure PowerShell 从 bacpac 文件将数据库迁移到实例数据库。 若要导入 SQL 托管实例,请使用 SQL Server Management Studio 或 SQLPackage。

注意

处理通过门户或 PowerShell 提交的导入/导出请求的计算机需要存储 bacpac 文件以及数据层应用程序框架 (DacFX) 生成的临时文件。 所需的磁盘空间在具有相同大小的 DB 之间存在显著差异,并且最多可占数据库大小的三倍。 运行导入/导出请求的计算机只有 450 GB 的本地磁盘空间。 因此,某些请求可能会失败,出现“磁盘空间不足”错误。 在这种情况下,解决方法是在具有足够本地磁盘空间的计算机上运行 SqlPackage。 导入/导出大于 150GB 的数据库时,请使用 SqlPackage 来避免此问题。

重要

仍然支持 PowerShell Azure 资源管理器 (RM) 模块,但是所有未来的开发都是针对 Az.Sql 模块。 AzureRM 模块至少在 2020 年 12 月之前将继续接收 bug 修补程序。 Az 模块和 AzureRm 模块中的命令参数大体上是相同的。 若要详细了解其兼容性,请参阅新 Azure PowerShell Az 模块简介

使用 New-AzSqlDatabaseImport cmdlet 向 Azure 提交导入数据库请求。 根据数据库大小,导入操作可能需要一些时间才能完成。 基于 DTU 的预配模型支持为每个层选择数据库最大大小值。 导入数据库时,请使用其中一种受支持的值

$importRequest = New-AzSqlDatabaseImport -ResourceGroupName "<resourceGroupName>" `
    -ServerName "<serverName>" -DatabaseName "<databaseName>" `
    -DatabaseMaxSizeBytes "<databaseSizeInBytes>" -StorageKeyType "StorageAccessKey" `
    -StorageKey $(Get-AzStorageAccountKey `
        -ResourceGroupName "<resourceGroupName>" -StorageAccountName "<storageAccountName>").Value[0] `
        -StorageUri "https://myStorageAccount.blob.core.chinacloudapi.cn/importsample/sample.bacpac" `
        -Edition "Premium" -ServiceObjectiveName "P6" `
        -AdministratorLogin "<userId>" `
        -AdministratorLoginPassword $(ConvertTo-SecureString -String "<password>" -AsPlainText -Force)

可以使用 Get-AzSqlDatabaseImportExportStatus cmdlet 检查导入的进度。 如果在提交请求后立即运行此 cmdlet,通常会返回 Status: InProgress。 当看到 Status: Succeeded 时,导入已完成。

$importStatus = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $importRequest.OperationStatusLink

[Console]::Write("Importing")
while ($importStatus.Status -eq "InProgress") {
    $importStatus = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $importRequest.OperationStatusLink
    [Console]::Write(".")
    Start-Sleep -s 10
}

[Console]::WriteLine("")
$importStatus

提示

有关另一个脚本示例,请参阅从 BACPAC 文件导入数据库

取消导入请求

使用数据库操作 - 取消 APIStop-AzSqlDatabaseActivity PowerShell 命令,如下例所示:

Stop-AzSqlDatabaseActivity -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $DatabaseName -OperationId $Operation.OperationId

取消导入所需的权限

若要取消导入操作,需要是以下角色之一的成员:

新数据库的兼容级别

  • 导入的数据库的兼容性级别基于源数据库的兼容性级别。
  • 导入数据库后,可选择以当前兼容级别或更高级别操作数据库。 有关在特定兼容级别操作数据库的影响和选项的详细信息,请参阅 ALTER DATABASE Compatibility Level(更改数据库兼容级别)。 有关与兼容级别相关的其他数据库级别设置的信息,另请参阅 ALTER DATABASE SCOPED CONFIGURATION(更改数据库范围的配置)。

限制

  • 不支持导入到弹性池中的数据库。 可以将数据导入到单一数据库,然后将数据库移到弹性池。
  • 当“允许访问 Azure 服务”设置为“关闭”时,导入/导出服务无法正常工作。 不过,可通过以下方式解决此问题:在 Azure VM 中手动运行 SqlPackage,或者直接在代码中使用 DacFx API 执行导出。
  • 导入操作不支持在创建新数据库时指定备份存储冗余,而是会使用默认异地冗余备份存储冗余创建新数据库。 若要解决此问题,请首先使用 Azure 门户或 PowerShell 和所需的备份存储冗余创建一个空数据库,然后将 bacpac 导入此空数据库。
  • 目前不支持有防火墙的存储。
  • 在导入过程中,请勿创建具有相同名称的数据库。 导入过程会创建具有指定名称的新数据库。
  • 目前,导入/导出服务在需要 MFA 时不支持 Microsoft Entra ID 身份验证。
  • 导入/导出服务仅支持 SQL 身份验证和 Microsoft Entra ID。 导入/导出与 Microsoft 标识应用程序注册不兼容。

其他工具

还可以使用以下向导。