65.9K
CodeProject 正在变化。 阅读更多。
Home

将数据从 SQL Server 迁移到 Azure Cosmos DB

2018年11月8日

CPOL

6分钟阅读

viewsIcon

17263

将文档从 SQL Server 导入到 Azure Cosmos DB。

引言

本文将为您提供有关将文档从 SQL Server 导入 Azure Cosmos DB 的信息。

背景

本文面向已经对 Azure Cosmos DB 有基本了解的开发人员和架构师。我想将本文作为我即将发布的关于 Azure Cosmos DB 文档/集合的 CRUD 操作的系列文章的基础。为了执行 CRUD 操作,我需要数据。因此,我开始探索一些开源工具。其中,我开始使用 Microsoft 的 Azure Cosmos DB 数据迁移工具。

本文提供了有关使用 Azure Cosmos DB 数据迁移工具的说明,该工具可将数据从各种数据源导入 Azure Cosmos DB。

本文的重点是将数据从 SQL Server 迁移到 Azure Cosmos DB。

必备组件

  1. Azure Cosmos DB 模拟器:我推荐使用它,因为它免费,并且具有与 Azure 门户中的 Azure Cosmos DB 相同的功能。Azure Cosmos DB 模拟器提供了一个本地环境,可以模拟 Azure Cosmos DB 服务以供开发使用。使用 Azure Cosmos DB 模拟器,您可以在本地开发和测试应用程序,而无需创建 Azure 订阅或产生任何费用。当您对应用程序在 Azure Cosmos DB 模拟器中的运行情况满意后,就可以切换到使用云中的 Azure Cosmos DB 帐户。Azure Cosmos DB 模拟器可以在 此处找到。
  2. Azure Cosmos DB 数据迁移工具:使用此工具,您可以从 JSON 文件、CSV 文件、SQL、MongoDB、Azure 表存储、Amazon DynamoDB 等导入数据,这些数据可与 Azure Cosmos DB 一起使用。Azure Cosmos DB 迁移工具可以在 此处找到。
  3. SQL Server:我这里使用的是 SQL Server 2017,并在本文中使用了该服务器的连接。

数据迁移/导入

这是一个多步骤过程,让我们一步一步进行。

步骤 1

确定需要导入的实际数据。对于本文,我考虑了 AdventureWorks2017 数据库。我想要所有 employee 及其 department 的数据。为此,我创建了以下查询。

SELECT 
    e.[BusinessEntityID] 
    ,p.[Title] 
    ,p.[FirstName] 
    ,p.[MiddleName] 
    ,p.[LastName] 
    ,p.[Suffix] 
    ,e.[JobTitle]
    ,d.[Name] AS [Department] 
    ,d.[GroupName] 
    ,edh.[StartDate] 
FROM [HumanResources].[Employee] e
    INNER JOIN [Person].[Person] p
    ON p.[BusinessEntityID] = e.[BusinessEntityID]
    INNER JOIN [HumanResources].[EmployeeDepartmentHistory] edh 
    ON e.[BusinessEntityID] = edh.[BusinessEntityID] 
    INNER JOIN [HumanResources].[Department] d 
    ON edh.[DepartmentID] = d.[DepartmentID] 
WHERE edh.EndDate IS NULL

上述查询将返回 290 行(这是根据我数据库中的数据,可能会因您数据库中的数据而异)。

第二步

安装 Azure Cosmos DB 模拟器并运行它。您会看到如下所示的图像。

步骤 3

安装 Azure Cosmos DB 数据迁移工具并打开 dtui.exe。您会看到如下所示的图像。

步骤 4

dtui.exe 中,单击“源信息”,然后在“导入自:”下拉列表中选择“SQL”。在“连接字符串”中,输入您的 SQL Server 盒子的连接字符串。提供连接字符串后,您可以直接输入 SQL 查询或选择 SQL 脚本文件。我选择了提供查询。

您的屏幕应如下所示。

  • Id 是可选的。当我们迁移数据到 Azure Cosmos DB 时,文档会自动创建具有 GUID 的 Id。我们可以通过自己添加来控制它,但我们需要确保它们是唯一的。我在 SQL 中进行了说明,因为我知道 BusinessEntity 是唯一的,所以我将其添加到了查询中。
  • 请记住,Id 属性在 Azure Cosmos DB 中始终是 string 类型的值。
  • 请注意,上面图片中的查询与步骤 1 中的查询不同。由于 Azure Cosmos DB 中的文档表示为 json,因此我们需要将 SQL 查询结构化为输出 json。
  • 将句点 (.) 作为嵌套分隔符。这将把 SQL 查询结构化为有效的 json 结构。
  • 我只是想包含 employee 以及除加入日期以外的所有详细信息,以展示我们在迁移时如何构建自己的数据。

步骤 5

在提供完步骤 4 中的每个项目后,单击“下一步”。您将进入“目标信息”屏幕。

  1. 在“导出到:”下拉列表中,保留默认值(DocumentDB - 顺序记录导入(分区集合))。
  2. 在“连接字符串”中,复制 Azure 模拟器的“主连接字符串”。如果您想使用 Azure 门户,也可以复制相同的主连接字符串。完成后,附加 Database=<some value>。我提供了 Database=EmployeesDB。
  3. 在“集合”中,输入 EmployeesWithDepartment。
  4. 在“分区键”中输入 /employee/department/name
  5. 将“集合吞吐量”保留原样。
  6. 将“Id 字段”留空。
  7. 展开“高级选项”。保留所有选项不变,然后在“索引策略”上右键单击并选择“范围”。

您的屏幕应如下所示。

  • 分区集合是另一个话题,我将在下一篇关于 Azure Cosmos DB 文档/集合 CRUD 操作的文章中进行介绍。
  • Azure Cosmos DB 中的集合是所有文档的集合。每个文档都是一组在创建文档时定义的 json 结构。
  • 如果选择了除 id 以外的其他标识符名称,则提供 Id 字段。
  • 索引策略将在我下一篇关于 Azure Cosmos DB 文档/集合 CRUD 操作的文章中进行讨论。

步骤 6

如果您想生成错误日志文件,可以指定它,或者跳过此步骤。

步骤 7

您将获得步骤 4 至步骤 6 的摘要。一旦您对详细信息满意,请单击“导入”。如果导入成功,您将看到下面的屏幕截图。否则,所有错误都会显示在“错误”选项卡中。如步骤 1 中所述,已将 290 行导入到 Azure Cosmos DB。

步骤 8

转到 Azure Cosmos DB 模拟器,然后单击左侧面板中的“资源管理器”。您会找到如下所示的数据库和文档屏幕截图。

步骤 9

要查询 Azure Cosmos DB 中的文档,我们可以使用类似 SQL 的查询。

To List all the documents: SELECT * FROM c

其中 c 是集合。

To fetch document with id equals 1: SELECT * FROM c WHERE c.id = "1"

To fetch document with department name as Tool Design: 
SELECT * FROM c WHERE c.employee.department.name = "Tool Design" 

SELECT * FROM EmployeeWithDepartment e WHERE e.employee.department.name = "Tool Design"

关注点

  • Azure Cosmos DB 资源模型
    • Azure 帐户
      • 数据库
        • 集合
          • Documents
            • resource/data
            • 附件(可选)
  • 索引策略有三种类型:哈希索引、范围索引和空间索引。
  • 当您从集合中获取数据时找到的资源属性列出如下:
    • id:用户定义的唯一标识符。它必须是 string
    • _rid:自动生成的资源 id。
    • _ts:自动生成的 epoch 值时间戳(上次更新)。
    • _etag:自动生成的 GUID。用于乐观并发。
    • _self:资源的自动生成的 URI 路径。在使用 Azure Cosmos DB 的 SQL API 时,此项非常有用。
    • _attachments:资源附件的 URI 路径后缀。

结论

Azure Cosmos DB 不仅限于创建集合和 SQL 查询,我们还可以利用

  • 存储过程
  • 触发器
  • 用户定义函数
© . All rights reserved.