沈云,资深工程师,微软解决方案专家

如何将本地数据库迁移到 Azure SQL, 一般来说分以下几部分工作:

  • 兼容性测试:验证数据库是否与 SQL 数据库 V12 兼容。
  • 解决兼容性问题(如果有):如果验证失败,必须先解决验证错误。
  • 运行迁移:如果数据库兼容,则可使用一种或多种方法来执行迁移。

1.兼容性测试

兼容性测试微软提供了4种方法

  • SQL Server Data Tools for Visual Studio (SSDT)SSDT 使用最新的兼容性规则来检测 SQL 数据库 V12 不兼容性。如果检测到不兼容,则可以直接在此工具中解决检测到的问题。此方法是目前用于测试和解决 SQL 数据库 V12 兼容性问题的建议方法。
  • SqlPackageSqlPackage 是一个命令行实用程序,用于测试兼容性问题,并生成包含检测到的兼容性问题的报告。如果使用此工具,请确保使用最新版本,以便使用最新的兼容性规则。如果检测到错误,必须使用其他工具来解决任何检测到的兼容性问题 – 议使用 SSDT
  • SQL Server Management Studio 中的“导出数据层”应用程序向导:此向导可以检测错误并在屏幕上报告错误。如果未检测到错误,则可以继续迁移到 SQL 数据库。如果检测到错误,必须使用其他工具来解决任何检测到的兼容性问题 – 议使用 SSDT
  • SQL Azure Migration Wizard (“SAMW”)SQL Azure 迁移向导 (SAMW)):SAMW 是一个 codeplex 工具,使用 Azure SQL 数据库 V11 兼容性规则来检测 Azure SQL 数据库 V12 的不兼容性。如果检测到不兼容,某些问题可直接在此工具中解决。此工具可以发现无需修复的不兼容性。该工具是第一个可以使用的 Azure SQL 数据库迁移协助工具,受到 SQL Server 社区的积极支持。此外,此工具可在工具本身内部完成迁移。

1.1 使用 SQL Server Data Tools for Visual Studio 检测兼容性问题

SSDT 是微软提供的数据库开发和管理工具,最新版本的 SSDT。使用SSDT可以进行兼容性检查。

  1. 打开 SSDT 连接需要进行检查的数据库;

2. 点击数据库,右键创建新项目;

3. 将导入设置配置为“仅导入应用程序范围的对象”。取消选中导入以下项的选项:引用的登录名、权限和数据库设置;

4. 单击“启动导入数据库并创建项目,其中包含数据库中每个对象的 T-SQL 脚本文件。这些脚本文件嵌入到项目内的文件夹中;

5. 在 Visual Studio 解决方案资源管理器中,右键单击数据库项目并选择“属性”。在“项目设置”页中,将“目标平台”配置为“Azure SQL 数据库 V12”;

6. 右键单击项目并选择“生成”以生成项目。

本数据库没有兼容性问题, 只有几个警告,基本可以忽略,也就是可以放心的往 Azure SQL 上迁移。

  1.2 使用 exe 进行兼容性测试

  1. 打开命令提示符并更改包含 sqlpackage.exe 最新版本的目录。此实用程序随 SQL Server Management Studio用于 Visual Studio SQL Server Data Tools 的最新版本提供,也可直接从 Microsoft 下载中心下载 SqlPackage 的最新版本。
  2. 使用你的环境的以下参数执行以下 SqlPackage 命令:

‘sqlpackage.exe /Action:Export /ssn:< server_name > /sdn:< database_name > /tf:< target_file > /p:=< schema_name.table_name > > < output_file > 2>&1’


使用 /P:TableName 参数的原因是:只需测试导出到 Azure SQL 数据库 V12 的数据库兼容性,无需测试从所有表导出数据。遗憾的是,sqlpackage.exe 的导出参数不支持提取零个表。需指定至少一个表,例如一个小型表。< output_file > 包含任何错误的报告。“> 2>&1”字符串将执行命令后生成的标准输出和标准错误传送到指定的输出文件。

3. 打开输出文件并查看兼容性错误(如果有)。

  1.3 使用 SQL Server Management Studio 确定 SQL 数据库的兼容性

  1. 确认你安装了最新版本的 SQL Server Management StudioManagement Studio 的新版本将每月更新一次,以与 Azure 门户的更新保持同步。
  2. 打开 Management Studio 并连接到你在对象资源管理器中的源数据库。
  3. 右键单击对象资源管理器中的源数据库、指向任务,然后单击导出数据层应用程序…”

   4. 在导出向导中,单击下一步,然后在设置选项卡上配置导出,以将 BACPAC 文件保存到本地磁盘位置或 Azure Blob。在没有数据库兼容性问题时,将会保存 BACPAC 文件。如果有兼容性问题,这些问题将显示在控制台上。

   5. 若要跳过导出数据这一步,请单击“高级”选项卡并清除“全选”复选框。此时我们的目标仅是测试兼容性。

   6. 单击“下一步”,然后单击“完成”。在向导验证架构后,将显示数据库兼容性问题(如果有)。

   7. 如果 *.BACPAC 文件已成功生成,则数据库与 SQL 数据库兼容,并可随时进行迁移。

2. 修复数据库迁移的兼容性问题

如果检测到兼容性问题,必须先修复这些兼容性问题,才能继续 SQL Server 数据库迁移。根据源数据库中的 SQL Server 版本以及正在迁移的数据库复杂性,可能会发现各种不同的不兼容性问题。旧版 SQL Server 的兼容性问题更多。除了使用所选搜索引擎的目标 Internet 搜索以外,还可以使用以下资源:

除了搜索 Internet 和使用这些资源,还可以使用 MSDN SQL Server 社区论坛StackOverflow

使用以下数据库迁移工具之一解决检测到的问题:

SSDTSSMSSAMW

  • 使用 SQL Server Data Tools for Visual Studio (SSDT):若要使用 SSDT,请将数据库架构导入 SQL Server Data Tools for Visual Studio (SSDT),然后生成进行 SQL 数据库 V12 部署的项目。然后,在 SSDT 中修复所有检测到的兼容性问题。完成后,将所做的更改同步回源数据库或源数据库的副本。SSDT 是目前用于测试和解决 SQL 数据库 V12 兼容性问题的建议方法。请单击使用 SSDT 进行演练的链接。
  • 使用 SQL Server Management Studio (SSMS):若要使用 SSMS,可以执行 Transact-SQL 命令,修复使用其他工具检测到的错误。此方法主要供高级用户直接在源数据库中修改数据库架构。
  • 使用 SQL Azure 迁移向导 (SAMW):若要使用 SAMW,请从源数据库生成 Transact-SQL 脚本。该向导会尽可能转换脚本,使架构兼容 SQL 数据库 V12。完成后,SAMW 可以连接到 SQL 数据库 V12 以执行脚本。此工具还可分析跟踪文件,确定兼容性问题。生成的脚本可以只包含架构,也可以包含 BCP 格式的数据。

3.将兼容的 SQL Server 数据库迁移到 SQL 数据库

一般来说我们可以通过几种方法来将兼容数据库迁移到云端。

  • 使用SSMS迁移向导
  • 使用BACPAC文件导入导出
  • 事务复制

   3.1 使用SSMS迁移向导

现在将之前测试的无兼容问题的数据库迁移到云端

  1. 右键单击对象资源管理器中的数据库、指向“任务,然后单击将数据库部署到 Azure SQL 数据库…”

2. 在部署向导中,单击“下一步,然后单击连接以配置与 SQL 数据库服务器的连接

3. 为 BACPAC 文件提供以下内容,该文件是此向导在迁移过程中创建的:

  • 新数据库名称
  • Azure SQL 数据库的版本服务层
  • 数据库最大大小
  • 服务目标(性能级别)
  • 临时文件名

4. 完成该向导。根据数据库的大小和复杂度,部署可能需要花费几分钟到几小时。如果此向导检测到兼容性问题,错误将显示到屏幕上,并且迁移将不会继续。

5. 使用对象资源管理器连接到 Azure SQL 数据库服务器中的已迁移数据库。

6. 使用 Azure 门户,查看数据库及其属性。

   3.2 使用BACPAC文件导入导出

其实细心的你会发现在进行上面的数据库导入的时候生成了临时文件。

C:\Users\maxshen\AppData\Local\Temp\HrAdminWebDB-20170319220759.bacpac

也就是说,其实上面的操作也是通过了bacpac文件进行操作的

因此我们如果有一个生成的Bacpac文件,就可以直接导入

  1. 连接到 Azure SQL 数据库服务器、右键单击数据库文件夹,然后单击导入数据层应用程序…”

2. 若要在 Azure SQL 数据库中创建数据库,请从本地磁盘导入 BACPAC 文件,或选择已将 BACPAC 文件上传到其中的 Azure 存储帐户和容器。

Azure Blob 存储导入 BACPAC 时,请使用标准存储。不支持从高级存储导入 BACPAC

3. 为 Azure SQL 数据库中的数据库提供新数据库名称,设置 Azure SQL 数据库的版本(服务层)、最大数据库大小服务目标(性能级别)。

4. 单击“下一步,然后单击完成以将该 BACPAC 文件导入 Azure SQL 数据库服务器中的新数据库。

   3.3 事务复制

另外Azure SQL支持事务复制方式将本地数据库设置为发布服务器,在AzureSQL上进行订阅。这种方式的有点是减少停机时间。

缺点有:

  • 使用本地分发服务器 ,这会对服务器的性能造成影响。

如果对性能的影响不可接受,可以使用另一台服务器,但这又会增大管理的复杂性。

  • 选择快照文件夹时,请确保选择的文件夹足够大,可以保存想要复制的每个表的 BCP。
  • 请注意,快照创建操作在完成之前会锁定关联的表,因此,在计划快照时请记住这一点。
  • Azure SQL 数据库中仅支持推送订阅 ,只能从本地数据库端添加订阅服务器。

基于以上原因, 个人不是特别推荐此种方式。建议将数据库直接搬移到Azure SQL过程更简单。

 4. 总结

  1. Azure SQL v12 版本已经和本地实例高度兼容
  2. SQL 数据库迁移到 Azure SQL 并不复杂
  3. 我们提供了大家熟悉的工具如 data tools SSMS 等几个工具帮助大家迁移,并且操作都很简单。