如何将 SQL Azure 数据库复制到本地开发服务器?

229

有人知道我如何将 SQL Azure 数据库复制到我的开发机器吗?我希望停止支付云端开发数据库的费用,但这是获取生产数据的最佳方式。我将生产数据库复制到新的开发数据库,但我希望本地有同样的数据库。

有任何建议吗?


8
这变得极为简单。请看下面的Atom回答(2018年2月),解释如何在SSMS中使用“任务=>部署数据库…”。 - Jon Crowell
24个回答

147
有多种方法可以实现此操作:
  1. 使用 SSIS(SQL Server Integration Services)。它只导入表中的数据,列属性、约束、键、索引、存储过程、触发器、安全设置、用户、登录等不会被转移。但这是一个非常简单的过程,可以通过 SQL Server Management Studio 中的向导轻松完成。
  2. 使用 SSIS 和 DB 创建脚本的组合。这将为您提供数据和所有由 SSIS 未传输的缺失元数据。这也非常简单。首先使用 SSIS 转移数据(请参见下面的说明),然后从 SQL Azure 数据库创建 DB 创建脚本,并在本地数据库上重新播放它。
  3. 最后,您可以使用 SQL Azure 中的导入/导出服务。这将将数据(带有架构对象)转移到 Azure Blob 存储中作为 BACPAC。您需要一个 Azure 存储帐户,并在 Azure Web 门户中执行此操作。在选择要导出的数据库时,在 Azure Web 门户中按“导出”按钮就像按一下按钮一样简单。缺点是它只是手动程序,我不知道是否有办法通过工具或脚本自动化此过程--至少第一部分需要在网页上点击。

使用方法1(使用 SSIS)的手动操作如下:

  • 在 Sql Server Management Studio(SSMS)中,在本地 SQL 实例上创建新的空数据库。
  • 从上下文菜单中选择导入数据(右键单击数据库->任务->导入数据...)
  • 输入源(SQL Azure)的连接参数。选择“.Net Framework Data Provider for SqlServer”作为提供程序。
  • 选择现有的空本地数据库作为目标。
  • 按照向导进行操作--您将能够选择要复制的数据表。您可以选择跳过任何不需要的表。例如,如果您在数据库中保留应用程序日志,则可能不需要备份它。

您可以创建SSIS包并在需要重新导入数据时重新执行它,以自动化此过程。请注意,您只能使用SSIS导入到一个干净的数据库,一旦您已经完成了一次导入,就无法对本地数据库进行增量更新。

方法#2(SSID数据加上架构对象)非常简单。首先按照上述步骤进行操作,然后创建DB创建脚本(在SSMS中右键单击数据库,选择“生成脚本”->“数据库创建”)。然后将此脚本重新运行在您的本地数据库上。

方法#3 在这里的博客中有描述:http://dacguy.wordpress.com/2012/01/24/sql-azure-importexport-service-has-hit-production/。其中有一个视频剪辑,展示了将DB内容传输到Azure Blob存储作为BACPAC的过程。之后,您可以将文件复制到本地并将其导入到SQL实例。将BACPAC导入到“Data-Tier application”的过程在这里描述:http://msdn.microsoft.com/en-us/library/hh710052.aspx


2
这个可以,只需要一个修正。在服务器导入/导出向导中,数据源应该是“.Net Framework Data Provider for SqlServer”。 - BZink
@l.poellabauer,是的,这就是SSIS的工作方式。它只导入数据。所有列属性、约束、键、索引、存储过程、触发器、安全设置、用户、登录等都不会被转移。解决这个问题的一种方法是生成DB创建脚本,然后在导入的数据上重新执行此脚本。 - seva titov
是的,我按照建议1的方式操作了,复制了表格和数据,但没有包括主键、外键等。最终我尝试使用CodePlex上的SQL Azure工具。 - Mike Gledhill
3
对我来说,关键是在空数据库上开始复制主键/外键/约束条件,然后在导入数据时暂时禁用约束条件。 具体步骤如下:1-手动创建空目标数据库。 2-右键单击源数据库>任务>生成脚本。 3-在空目标数据库上运行脚本文件(现在数据库具有正确的主键/外键/约束条件,但没有数据)。 4-禁用所有约束条件(https://dev59.com/qHVC5IYBdhLWcg3w21Mq#161410)。 5-导入数据(右键单击目标数据库>任务>导入数据)。 6-重新启用约束条件。希望这有所帮助! - Mathieu Frenette
1
@JoSmo,方法1和方法2不需要存储帐户。但是我建议您在与SQL Azure数据库相同的数据中心拥有一个存储帐户。原因是您可以将其用于数据库备份和还原。如果您没有Azure订阅的管理权限,请找到组织中具有足够权限创建新存储帐户并向您提供访问密钥的人员。由于您已经可以访问数据库,因此没有理由拒绝访问存储帐户。 - seva titov
显示剩余16条评论

141
将Azure数据库数据复制到本地数据库: 现在您可以使用SQL Server Management Studio按以下步骤操作:
  • 连接到SQL Azure数据库。
  • 在“对象资源管理器”中右键单击数据库。
  • 选择“任务” / “部署数据库到SQL Azure”选项。
  • 在名为“部署设置”的步骤中,连接到本地SQL Server并创建新数据库。

输入图像描述

“下一步”/“下一步”/“完成”


16
在SSMS中,“将数据库部署到SQL AZURE”有些误导,这并不那么清晰。 - EeKay
26
迄今为止最简单的解决方案,但与此同时使用了最具误导性的菜单名称。谢谢您发帖分享这个信息。 - Kevin Giszewski
1
这是最简单的方法,但缺点是您无法选择要备份哪些表,哪些不需要备份。在我的公司中,我们有一个包含各种附件(图片等)的附件表。通常情况下,我们不希望备份此表,因为它需要很长时间才能完成复制。使用此方法无法排除此表。 - Rosdi Kasim

54
在SQL Server 2016 Management Studio中,将Azure数据库导入到本地机器的过程已经变得更加简化。
右键单击要导入的数据库,点击任务(Tasks) > 导出数据层应用程序(Export data-tier application),将数据库导出为本地的.dacpac文件。
在本地目标SQL Server实例中,可以右键单击数据库(Databases) > 导入数据层应用程序(Import data-tier application),一旦它被本地化,就可以执行诸如备份和恢复数据库之类的操作。

8
这就是它。注意,“导出数据层”包括数据,“提取数据层”仅提供定义。 - Colin
太棒了,无缝的...运行得非常好! - David A Stumpf

37

我只想添加一个简化版本的dumbledad的答案,因为它是正确的。

  1. 在blob存储上将Azure SQL数据库导出为BACPAC文件。
  2. 在SQL Management Studio内,右键单击您的数据库,单击“导入数据层应用程序”。
  3. 你将被提示输入信息以访问Azure blob存储上的BACPAC文件。
  4. 按几次下一步... 完成!

4
我遇到了一个错误,提示目标不能是SQL Azure V12? - Zapnologica
2
请确保您拥有可以导入该BACPAC的SSMS版本:https://msdn.microsoft.com/zh-cn/library/mt238290.aspx - Paul Bullivant
即使使用这个版本的SSMS,我仍然因为目标Azure SQL数据库12而遇到错误。 - Preza8

22

我认为现在要简单得多了。

  1. 启动SQL管理工作室。
  2. 右键单击 "数据库",选择 "导入数据级应用程序..."。
  3. 向导将引导您连接到Azure帐户,创建一个BACPAC文件并创建您的数据库。

此外,我使用 Sql Backup and FTP (https://sqlbackupandftp.com/) 每天备份到一个安全的FTP服务器。 我只需从那里拉取最近的BACPAC文件,并在同一对话框中导入它,这样更快捷、便于创建本地数据库。


9
您也可以在Windows Azure管理门户中查看SQL Azure数据同步。它允许您在SQL Azure和SQL Server之间检索和还原整个数据库,包括架构和数据。

2
SQL数据同步不应作为备份策略的一部分,因为存在几个限制。它不支持版本控制,只能备份数据而不能备份其他对象。有关更多信息,请参阅SQL数据同步FAQ主题。(http://msdn.microsoft.com/en-us/library/windowsazure/jj650016.aspx) - Shaun Luttin
1
数据同步非常糟糕 - 即使在今天(几年后的今天),仍然存在大量的错误,它可能会真正破坏您的数据库 - 它仍然有很多限制。 - William

7

使用 msdeploy.exe

提示: msdeploy.exe 无法自动创建目标数据库,因此您需要先手动创建它。

  1. Copy the connection string on the database properties page. Adjust it so that it contains a correct password. database properties page
  2. Get the connection string for the destination DB.
  3. Run msdeploy.exe like this:

    "c:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -verb:sync -dest:dbDacFx="destination_DB_connection_string",dropDestinationDatabase=true -source:dbDacFx="azure_DB_connection_string",includeData=true -verbose
    

Using SqlPackage.exe

  1. Export the azure DB to a bacpac package.

    "c:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /a:Export /ssn:"azure_db_server" /sdn:"azure_db_name" /su:"user_name" /sp:"password" /tf:"file.bacpac"
    
  2. Import the package to a local DB.

    "c:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /a:Import /SourceFile:"file.bacpac" /TargetServerName:".\SQLEXPRESS" /TargetDatabaseName:CopyOfAzureDb
    

5
在SQL Server管理工具中,右键单击要导入的数据库,选择“任务”>“导出数据层应用程序”,将数据库导出为本地.dacpac文件。
在本地目标SQL服务器实例中,您可以右键单击“数据库”>“导入数据层应用程序”,一旦本地化,您可以执行诸如备份和恢复数据库之类的操作。

5
这很容易。对我来说,通过以下步骤可以将Azure SQL数据库下载到本地计算机:
1. 打开SQL管理工具并连接到Azure SQL服务器。 2. 选择要下载到本地计算机的数据库,右键单击...选择“生成脚本”。按提示操作... 但是,请注意,如果您还需要数据以及脚本,请务必在开始生成之前检查高级选项...向下滚动到“要编写脚本的数据类型”,确保您已经选择了“模式和数据”...或者适合您的任何其他选项。
它会给您一个漂亮的SQL脚本文件,然后可以在本地计算机上运行它,并创建数据库以及填充所有数据。
请注意,在我的情况下,我没有FK或其他约束...而且数据不多。
一般情况下,我不建议使用此方法作为备份机制...

3
我必须说,这个过程非常顺利,没有任何麻烦;外键完美地重新创建了。生成的SQL脚本太大了,在SSMS以及很多文本编辑器中无法打开,但我能够使用命令行sqlcmd /S <server> /d <database> -E -i <azure_dump.sql> - perlyking

3
使用SSMS v18.9+,您可以使用“将数据库部署到Microsoft Azure SQL Database”功能。
虽然这不是很直观,但向导允许您选择本地数据库,即使任务名称是“将数据库部署到Microsoft Azure SQL Database”。
1. 使用SSMS连接到Azure数据库。 2. 右键单击数据库,选择“任务 > 将数据库部署到Microsoft Azure SQL Database”。 enter image description here 3. 选择本地SQL服务器作为目标连接。 enter image description here 4. 按照附加步骤操作即可。

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