译自:http://social.technet.microsoft.com/wiki/contents/articles//overview-of-options-for-migrating-data-and-schema-to-sql-azure.aspx



摘要

这篇文章介绍了几种迁移数据(包括架构信息)到SQL Azure的方法并主要关注与从SQL ServerSQL Azure的数据迁移。如果想要从Microsoft Access, MySQL等非SQL Server数据库迁移数据到SQL Azure,请使用SQL Server Migration Assistant

先决条件

SQL Azure是基于SQL Server 2008的。如果是一个先前版本的数据库,你需要升级到SQL Server 2008以进行测试(至少在开发环境中),之后再迁移到SQL Azure上面。

请注意SQL Azure目前不支持下面的这些特性:

  • Full Text Search
  • SQL Server Agent

本文内容

  • Data-tier Application的导入导出服务
  • Generate Script Wizard
  • SQL Server Integration Services (SSIS)
  • SQL Azure Migration Wizard
  • SQL Server Migration Assistant

Data-tier Application的导入导出服务

Microsoft SQL Server “Denali” Data-tier Application Framework v2.0 Feature Pack CTP 中引入的导入导出服务允许在SQL Azure上部署和抽取数据和架构。这使得你可以在一个操作中保存和接收一个完整的数据库,并且在不同版本的SQL Server中迁移数据。

注意:当前,使用Data-tier Application (DAC) framework来对SQL Azure导入导出数据只在SQL Azure labs中可用。

更多信息,请查看:Data-Tier Application Import and Export with SQL Azure

Generate Script Wizard

迁移本地部署的SQL ServerSQL Azure的一个选择是使用SQL Server Management Studio的中的脚本生成向导 一个通过T-SQL语句产生的bcp命令脚本。本文将告诉你如何做到这些。

生成架构

把一个本地部署的SQL Server数据库迁移到SQL Azure的第一步是生成架构脚本,它被用来在SQL Azure上面建立与SQL Server数据库一致的架构。SQL Server Management Studio 2008 R2新增加了一个高级设置可将SQL Azure设置为目的数据库引擎,它可以被用来轻松的实现生成架构。

下面是具体步骤:

1.       打开SQL Server Management Studio 2008 R2

2.       连接到包含你想要迁移的数据库的SQL Server

3.       右键单击数据库,选择Tasks… | Generate Scripts… 

  

4.       这将启动Generate and Publish Wizard对话框。点击Next来跳过介绍页面。

5.       接下来是Choose Object

 

6.       选择 Script entire database and all database objects 然后点击 Next

7.       接下是Set Scripting Options

 

8.       选择  Save to new query window, 然后点击 Advanced 按钮来弹出 Advanced Scripting Option对话框

 

9.       Script for the database engine type下拉框中选择SQL Azure Database

10.   点击Next

11.   点击Next来跳过摘要页

12.   Generate and Publish Scripts对话框完成对数据库的查询后,你可以点击Finish按钮,之后查询窗口将会弹出

13.   这个新的查询窗口会自动的连接到源数据库所在的SQL Server

14.   在查询窗口内右击,在菜单中选择Connection | Change Connection… 

 

15.   连接到目的数据库所在的SQL Azure服务器,你可以点击Options按钮来选择目的数据库 

 

16.   SQL Server Management Studio中执行生成的脚本来在SQL Azure上创建数据库架构

为了使用 SSIS BCP 将你的 SQL Server 数据传送到SQL Azure, SQL Azure上的数据库架构需要包括聚集索引。上传数据的另一种选择是更改Generate and Publish Scripts页面上的设置来包括数据生成(INSERT语句)。这会增加脚本文件的体积,所以只适用于小数据库。

传输数据

如果你从SQL ServerSQL Azure迁移数据表,最简单的办法是使用bcp工具来将你SQL server中的数据导入到一个文件中,然后将数据从文件移动到 SQL Azure。但是手工来写出所有的bcp工具命令是枯燥乏味的。bcp需要你为每个表执行一个单独的命令来迁移数据。下面的T-SQL脚本会生成一个批处理文件,它包括了所有迁移整个数据库所需的bcp命令。

在运行这个脚本之前:

  • ·         目的SQL Azure数据库中的表应为空,这意味着你不应该在同一个目的数据库上运行bcp批处理文件两次。
  • ·         在执行脚本之前,你需要修改脚本开始部分的变量为你实际的源SQL Server和目的SQL Azure服务器。

这个T-SQL脚本将会使用PRINT语句来输出生成的批处理命令,在执行后,将完整的输出拷贝到一个以.bat为扩展名的文件中。一旦你得到了这个批处理文件,你就可以使用命令行运行这个批处理文件来迁移数据库。

保留主键

在你的数据库中,如果你使用IDENTITY来生成主键值,生成的bcp工具命令会使用 –E 标记来保留这些主键值。但是,外键值在被插入的时候,引用完整性检查将不会被执行。这使得可以数据行插入可以无需考虑依赖关系 -主键值无需在外键值之前插入。

因为没有被重新生成主键值,所以只要源数据库在批处理文件运行的期间没有被写入,那么就不会违反约束。你需要保证源数据库处于只读模式或者没有应用程序在向它写入数据,

因为bcp工具的命令没有被封装在一个大事务中,而且批处理文件执行的时间可能会很长,这时可能会产生数据写入操作。

T-SQL脚本

SET NOCOUNT ON

 

DECLARE @DestServer nvarchar(max)

DECLARE @DestDatabase nvarchar(max)

DECLARE @DestLogin nvarchar(max)

DECLARE @DestPassword nvarchar(max)

 

DECLARE @SrcServer nvarchar(max)

DECLARE @SrcDatabase nvarchar(max)

DECLARE @SrcLogin nvarchar(max)

DECLARE @SrcPassword nvarchar(max)

 

-- SQL Azure Server

SET        @DestServer = 'yourServer.database.windows.net'

SET        @DestDatabase = 'yourDatabase'

SET        @DestLogin = 'yourLogin@yourServer'

SET        @DestPassword = 'yourPassword'

 

-- SQL Server

SET        @SrcServer = 'yourServer'

SET        @SrcDatabase = 'yourDatabase'

SET        @SrcLogin = 'yourLogin'

SET        @SrcPassword = 'yourPassword'

 

PRINT 'echo %DATE% %TIME% > bcp.log'

PRINT ''

 

---------------------------------------------------

 

DECLARE @Schema nvarchar(max)

DECLARE @Table nvarchar(max)

 

DECLARE table_cursor CURSOR FOR

    SELECT TABLE_SCHEMA, TABLE_NAME

    FROM information_schema.tables

    WHERE Table_Type = 'BASE TABLE'

    OPEN table_cursor;

 

-- Perform the first fetch.

FETCH NEXT FROM table_cursor INTO @Schema, @Table;

 

-- Check @@FETCH_STATUS to see if there are any

-- more rows to fetch.

WHILE @@FETCH_STATUS = 0

BEGIN

 

    PRINT 'REM Download ' + @Schema + '.' + @Table

    PRINT 'echo bcp.exe ' + @SrcDatabase + '.' + @Schema + '.' +

        @Table + ' out ' +

        @Schema + '.' + @Table + '.bcp -q -h "TABLOCK" -N -CRAW -S' +

        @SrcServer + ' >> bcp.log'

    PRINT 'bcp.exe ' + @SrcDatabase + '.' + @Schema + '.' + @Table +

        ' out ' + @Schema + '.' + @Table +

        '.bcp -q -h "TABLOCK" -N -CRAW -S' + @SrcServer +

        ' -U' + @SrcLogin + ' -P' + @SrcPassword + ' >> bcp.log'

    PRINT ''

 

    PRINT 'REM Upload ' + @Schema + '.' + @Table

    PRINT 'echo bcp.exe ' + @DestDatabase + '.' + @Schema + '.' +

        @Table + ' in ' + @Schema + '.' + @Table +

        '.bcp -q -h "TABLOCK" -N -E -CRAW -S' + @DestServer +

        ' >> bcp.log'

    PRINT 'bcp.exe ' + @DestDatabase + '.' + @Schema + '.' +

         @Table + ' in ' + @Schema + '.' + @Table +

         '.bcp -q -h "TABLOCK" -N -E -CRAW -S' + @DestServer +

         ' -U' + @DestLogin + ' -P' + @DestPassword + ' >> bcp.log'

    PRINT ''

   

   -- This is executed as long as the previous fetch succeeds.

   FETCH NEXT FROM table_cursor  INTO @Schema, @Table;

END

 

CLOSE table_cursor;

DEALLOCATE table_cursor;

SQL Service Integration Services

你可以使用SQL Server 2008 Integration Services来将本地部署的数据库迁移到SQL Azure上。详细信息请查看:如何运行 SQL Server 导入和导出向导。如果你决定使用SQL Server 2008 Integration Services,你将需要建立自己的数据库关系图来正确的迁移主外键值。

SQL Azure Migration Wizard

SQL Azure Migration Wizard可以帮助你将本地的SQL Server 2005/2008数据库迁移到SQL Azure上。它包括两部分:

  • ·         通过使用SQL Azure Migration Wizard, 你可以选择你想迁移的数据库对象,创建迁移数据到SQL  AzureT-SQL脚本。 SQL Azure Migration Wizard并没捕捉到所有的SQL Server版本间的兼容性问题。
  • ·         SQL Azure Migration Wizard Batch是一个命令行工具,它被用来在目标服务器上运行T-SQL脚本文件(使用bcp来上传数据)。T-SQL脚本文件和bcp文件是由SQL Azure Migration Wizard来生成的。

注意:SQL Azure Migration Wizard是一个开源的工具。

SQL Server Migration Assistant

如果你要从MySQL或者Microsoft Access迁移到SQL Azure, 毫无疑问你应该使用SQL Server Migration Assistant

SSMA for MySQL 1.0 SSMA for Access v4.2 可以直接轻松的将数据从本地的MySQLAccess数据库中迁移到SQL Azure上。SQL Server Migration Assistant工具包旨在解决迁移数据库时客户复杂的手工处理过程。通过使用SQL Server Migration Assistant,客户和合作伙伴减少了手工劳动,因此显著减少了迁移的时间、 成本和风险。