Azure SQL数据库Bacpac本地恢复

133

我使用Azure管理控制台的“导出”选项创建了一个Azure SQL数据库的BACPAC备份。

我已将其下载到本地计算机,但不确定如何将其还原到本地SQL Server实例中。我找到了DacImportExportCli工具,但找不到本地还原的示例。

如果有人编写了一个可以定时执行此操作的脚本,那就太棒了。


8
可能是 SQL Server 2012 的特性,但在 SQL Server Management Studio 中,如果我右键单击本地服务器的数据库文件夹并选择“导入数据层应用程序”,那么会启动一个向导,该向导会读取 BACPAC 文件以生成我的 Azure 数据库的副本。 如果您不想先将文件复制到本地,该向导还可以直接连接到 Blob 存储来获取 BACPAC 文件。 - dumbledad
你最终解决了这个问题吗? - Nate
3
我相信这是 SQL 2012 SSMS 的功能,可以导入数据层应用程序,而 2008R2 只能导出 DACPACs,看不到导入选项。请问需要翻译的内容结束了吗? - jamiebarrow
6个回答

181

这可以通过 SQL Server Management Studio 2012 简单完成。

  1. 右键单击Connection > Databases节点,选择“导入数据层应用程序...
  2. 在介绍步骤上选择“下一步”。
  3. enter image description here
  4. 浏览或连接到备份文件存储的存储帐户。

3
太好了。RedGate工具可能不太稳定。我很高兴看到有一个由Microsoft支持的选项。 - gilly3
2
它能与SQL Express 2012一起使用吗?因为我收到了以下错误消息:

无法从包中加载模式模型。 (Microsoft.SqlServer.Dac)

附加信息: 内部错误。 内部目标平台类型SqlAzureDatabaseSchemaProvider不支持模式文件版本“2.5”。 (文件:C:\ Users \ xxxxx \ Downloads \ dbname-2013-10-10-20-2.bacpac)(Microsoft.Data.Tools.Schema.Sql)
- Antoine Meltzheim
@ElTone 我刚刚使用管理工具,直接从Azure存储还原了一个bacpac到我的本地SQL Server Express 2012数据库。没有看到任何错误,数据似乎都在那里。有人提到安装更新版本的SQL Server数据工具对他们有帮助(但他们并不是指管理工具)。http://social.msdn.microsoft.com/Forums/windowsazure/en-US/36035d1e-fda8-4388-99c4-ba2ff7c5a5e1/new-sql-azure-bacpac-format-not-working-with-sql-2012?forum=ssdsgetstarted - Juha Palomäki
@Juha Palomäki 正确:安装最新版本的 SSDT 解决了问题。现在一切都好了。 - Antoine Meltzheim
4
似乎在管理工具中导入bacpac文件的大小有一定限制。如果遇到OutOfMemory异常,请查看Flea的答案,了解如何使用命令行工具SqlPackage.exe。 - Juha Palomäki
显示剩余3条评论

52

尝试使用 "SqlPackage.exe"

我需要导出一个 SQL Azure 数据库,然后将其导入到本地的 SQL 2008 R2 服务器(注意,我还在使用 Visual Studio 2010)。微软努力使这成为一项痛苦的任务,但是,我能够通过以下步骤完成:

  1. 转到此链接http://msdn.microsoft.com/en-us/jj650014并安装Visual Studio 2010 的 SQL Server 数据工具

  2. 这将安装在您的本地驱动器上。在我的情况下,它放置在这里:C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin

  3. 通过命令行或 PowerShell 浏览到此位置

  4. 您将要执行SqlPackage.exe

  5. 打开此链接以查看 SqlPackage.exe 的所有参数选项列表(http://msdn.microsoft.com/en-us/library/hh550080(v=vs.103).aspx

  6. 这是我需要执行的命令行,将 .bacpac 文件导入我的本地 SQL 2008 R2 服务器:

.\SqlPackage.exe /a:Import /sf:C:\mydatabasefile.bacpac /tdn:NorthWind /tsn:BINGBONG
  • /tdn 是你想要还原 bacpac 文件到的数据库名称。
  • /tsn 是你的 SQL 服务器名称。

你可以在第五个链接中看到所有这些参数的描述。


如果您已经安装了SSMS 2012,那么这个任务会更加容易完成。您可以像@Josiah上面所描述的那样使用向导,即使是在2008 R2服务器上也可以。 - DanO
2
我花了很多时间寻找这个解决方案,期间我甚至下载了整个2014管理工具。 - Santhos
SqlPackage 在“更新数据库”步骤上一直卡住,直到我完全删除了目标数据库。 - michael_hook

10

该工具应支持将bacpac导入本地数据库。例如,使用Windows Auth将bacpac导入数据库的操作如下所示:“DacCli -S myserver -E -D nw_restored -F northwind.bacpac -I”。然而,Codeplex所列出的必需程序集已经过时 - 没有一个链接能够正常工作,因此该工具无法运行(它对某些SQL 2012 CTP组件有先决条件)。 - David Airapetyan
我已经在我的机器上安装了所有组件,所以我尝试使用DacCli导入bacpac - 它成功了(请参见我之前评论中的命令行)。100MB的bacpac大约需要20分钟。 - David Airapetyan

7

几个问题:
  1. SQL Azure Backup 的活跃开发目前已经停止(当您运行最新版本的工具时,会显示此提示)
  2. 当直接从 Azure 备份到本地 SQL 时,似乎不会通过 bacpac,而是实现了某种自制模式/数据复制。根据我的经验,这非常缓慢。
  3. 基于上述观点,该机制存在漏洞 - 我曾多次遇到表格传输失败的情况,因为该工具无法检测到唯一键。
- David Airapetyan
2
这个答案应该被更新,或者不再被接受作为正确答案。链接的工具已经成为了“云”解决方案,不再支持本地备份。 - Timothy Strimple
2
备份工具仍可从http://www.red-gate.com/products/dba/sql-azure-backup/Discontinued获取。 - Ben Foster

6
如果您正在使用SSMS 2012,只需在对象资源管理器下服务器的数据库文件夹上右键单击,然后选择“导入数据层应用程序...”即可轻松完成。
需要注意一点:截至2013年3月26日(当时我自己需要找出如何操作),从Azure导出.bacpac时,它将被下载为.zip文件,而不是.bacpac文件,并且导入向导中由浏览按钮打开的文件对话框只会显示.bacpac或.*作为文件过滤器,意味着不支持.zip。但是,如果您将过滤器更改为.*,选择下载的.zip文件,然后单击下一步,向导将正常运行。

2
这是正确的答案。您现在可以安装免费的SSMS 2016独立版本,并提供所有这些功能。 - Aaron

3
这是一段同时还原多个bacpac文件的脚本: 批量还原本地bacpac文件
cd [FOLDERPATH]
$goodlist = dir
cd 'C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin'
foreach($i in $goodlist){
    $name = $i.Name;
    $namer = $i.Name.Substring(0, $i.Name.length - 7);
    .\SqlPackage.exe /a:Import /sf:[FOLDERPATH]\$name /tdn:$namer /tsn:[SERVERNAME]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接