导出到 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 文件,请导出到本地存储。

  • 不支持使用本文所述方法将 BACPAC 文件导出到 Azure 高级存储。

  • 目前不支持有防火墙的存储。

  • 存储文件名或 StorageURI 的输入值的长度应少于 128 个字符,并且不能以“.”结尾,也不能包含特殊字符,如空格字符或“<、>、*、%、&、:、,/、?”。

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

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

备注

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

Azure 门户

目前不支持使用 Azure 门户从 Azure SQL 托管实例导出数据库的 BACPAC。 请改用 SQL Server Management Studio 或 SQLPackage。

备注

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

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

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

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

    数据库导出

  3. 单击 “确定”

  4. 若要监视导出操作的进度,请打开包含所导出数据库的服务器的相应页面。 向下滚动到“设置”,并单击“导入/导出历史记录” 。

    导出历史记录

SQLPackage 实用程序

若要使用 SqlPackage 命令行实用工具导出 SQL 数据库中的数据库,请参阅导出参数和属性。 可以使用 SQLPackage 实用工具附带的最新版本的 SQL Server Management StudioSQL Server Data Tools for Visual Studio,也可以直接从 Microsoft 下载中心下载最新版本的 SqlPackage

在大多数生产环境中,建议使用 SQLPackage 实用工具来实现缩放和性能。 如需 SQL Server 客户顾问团队编写的有关使用 BACPAC 文件进行迁移的博客,请参阅 Migrating from SQL Server to Azure SQL Database using BACPAC Files(使用 BACPAC 文件从 SQL Server 迁移到 Azure SQL 数据库)。

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

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

SQL Server Management Studio (SSMS)

在 SQL Server Management Studio 的最新版本中,有向导来指示如何将 Azure SQL 数据库或 SQL 托管实例数据库中的数据库导出到 BACPAC 文件。 请参阅导出数据层应用程序

PowerShell

备注

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

使用 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。 如果在提交请求后立即运行此命令,通常会返回“状态: 正在进行”。 显示“状态: 成功”时,表示导出完毕。

$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

后续步骤