导出到 BACPAC 文件 - Azure SQL 数据库和 Azure SQL 托管实例

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

如果需要为存档或移动到其他平台而导出数据库,可将数据库架构和数据导出到 BACPAC 文件。 BACPAC 文件是一个扩展名为 BACPAC 的 ZIP 文件,它包含来自数据库的元数据和数据。 可将 BACPAC 文件存储在 Azure Blob 存储中或本地位置的本地存储中,之后可导入回 Azure SQL 数据库Azure SQL 托管实例SQL Server 实例

注意事项

  • 为保证导出的事务处理方式一致,必须确保导出期间未发生写入活动,或者正在从数据库的事务处理方式一致性副本中导出。

  • 如果是导出到 Blob 存储,则 BACPAC 文件的最大大小为 200 GB。 若要存档更大的 BACPAC 文件,请使用 SqlPackage 导出到本地存储。

  • Azure 存储文件名不能以 . 结尾,并且不能包含空格字符或 <>*%&:\/? 等特殊字符。 文件名的长度应该少于 128 个字符。

  • 如果导出操作超过 20 个小时,可能会取消操作。 为提高导出过程中的性能,可以进行如下操作:

    • 暂时提高计算大小。
    • 在导出期间终止所有读取和写入活动。
    • 对所有大型表上的非 null 值使用聚集索引。 如果不使用聚集索引,当时间超过 6-12 个小时时,导出可能会失败。 这是因为导出服务需要完成表格扫描,才能尝试导出整个表格。 确认表是否针对导出进行优化的一个好方法是,运行 DBCC SHOW_STATISTICS 并确保 RANGE_HI_KEY 不是 null 并且值分布良好。 有关详细信息,请参阅 DBCC SHOW_STATISTICS
  • 对于较大的数据库,BACPAC 导出/导入可能需要很长时间,并且可能会因各种原因失败。

注意

BACPAC 不能用于备份和还原操作。 Azure 会自动为每个用户数据库创建备份。 有关详细信息,请参阅业务连续性概述Azure SQL 数据库中的自动备份Azure SQL 托管实例中的自动备份

注意

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

Azure 门户

目前不支持使用 Azure 门户从 Azure SQL 托管实例导出数据库的 BACPAC。 请参阅注意事项

注意

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

  1. 若要使用 Azure 门户导出数据库,请打开数据库页,并在工具栏上选择“导出”。

    突出显示“导出”按钮的屏幕截图。

  2. 指定 BACPAC 文件名,为导出选择现有的 Azure 存储帐户和容器,然后提供用于访问源数据库的相应凭据。 即使你是 Azure 管理员,此处也需要 SQL Server 管理员登录名,因为是 Azure 管理员并不等同于在 Azure SQL 数据库或 Azure SQL 托管实例中拥有管理员权限。

    屏幕截图显示了“导出数据库”页,其中指定了用户名和密码。

  3. 选择“确定”

  4. 若要监视导出操作的进度,请打开包含所导出数据库的服务器的相应页面。 在“数据管理”下,选择“导入/导出历史记录”。

SQLPackage 实用程序

在大多数生产环境中,建议使用 SQLPackage 实用工具来实现缩放和性能。 可以针对表的子集并行运行多个 SqlPackage 命令,以加速导入/导出操作。

若要使用 SqlPackage 命令行实用程序导出 SQL 数据库中的数据库,请参阅导出参数和属性SQLPackage 实用工具适用于 Windows、macOS 和 Linux。

此示例演示如何通过 Active Directory 通用身份验证,使用 SqlPackage 来导出数据库:

SqlPackage /a:Export /tf:testExport.BACPAC /scs:"Data Source=apptestserver.database.chinacloudapi.cn;Initial Catalog=MyDB;" /ua:True /tid:"apptest.partner.onmschina.cn"

Azure Data Studio

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

SQL Server Management Studio (SSMS)

SQL Server Management Studio 提供了一个向导,用于将 Azure SQL 数据库或 SQL 托管实例数据库中的数据库导出到 BACPAC 文件。 请参阅导出数据层应用程序

PowerShell

不支持使用 PowerShell 从 Azure SQL 托管实例导出数据库的 BACPAC。 请参阅注意事项

使用 New-AzSqlDatabaseExport cmdlet 向 Azure SQL 数据库服务提交导出数据库请求。 根据数据库的大小,导出操作可能需要一些时间才能完成。

$exportRequest = New-AzSqlDatabaseExport -ResourceGroupName $ResourceGroupName -ServerName $ServerName `
  -DatabaseName $DatabaseName -StorageKeytype $StorageKeytype -StorageKey $StorageKey -StorageUri $BacpacUri `
  -AdministratorLogin $creds.UserName -AdministratorLoginPassword $creds.Password

若要检查导出请求的状态,请使用 Get-AzSqlDatabaseImportExportStatus cmdlet。 如果在提交请求后立即运行此 cmdlet,通常会返回“状态: 正在进行”。 显示“状态: 成功”时,表示导出完毕。

$exportStatus = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
[Console]::Write("Exporting")
while ($exportStatus.Status -eq "InProgress")
{
    Start-Sleep -s 10
    $exportStatus = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
    [Console]::Write(".")
}
[Console]::WriteLine("")
$exportStatus

取消导出请求

使用数据库操作 - 取消 API 或 Powershell Stop-AzSqlDatabaseActivity 命令取消导出请求。 以下是 PowerShell 命令的示例:

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

注意

若要取消导出操作,需要具有以下角色之一:

限制

  • 不支持使用本文所述方法将 BACPAC 文件导出到 Azure 高级存储。
  • 目前不支持有防火墙的存储。
  • 目前不支持不可变存储。
  • Azure SQL 托管实例当前不支持使用 Azure 门户或 Azure PowerShell 将数据库导出到 BACPAC 文件。 若要将托管实例导出到 BACPAC 文件,请使用 SQL Server Management Studio (SSMS) 或 SQLPackage
  • 目前,导入/导出服务在需要 MFA 时不支持 Microsoft Entra ID 身份验证。
  • 导入/导出服务仅支持 SQL 身份验证和 Microsoft Entra ID。 导入/导出与 Microsoft 标识应用程序注册不兼容。