将 Amazon DocumentDB 作为的目标AmazonDatabase Migration Service - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 Amazon DocumentDB 作为的目标AmazonDatabase Migration Service

您可以使用Amazon DMS将数据从以下任一源数据引擎迁移到 Amazon DocumentDB(与 MongoDB 兼容性)。Amazon DMS支持。源引擎可以在Amazon-托管服务,例如 Amazon RDS、Aurora 或 Amazon S3。或者,引擎可以位于自管理数据库(如在 Amazon EC2 或本地运行的 MongoDB)上。

您可以使用Amazon DMS将源数据复制到 Amazon DocumentDB 数据库、集合或文档。

注意

如果您的源端点是 MongoDB 或 Amazon DocumentDB,请在中运行迁移文档模式.

MongoDB 以二进制 JSON 格式 (BSON) 存储数据。Amazon DMS支持 Amazon DocumentDB 支持的所有 BSON 数据类型。有关这些数据类型的列表,请参阅支持的 MongoDB API、操作和数据类型Amazon DocumentDB 开发人员指南。

如果源终端节点是关系数据库,Amazon DMS如下所示将数据库对象映射到 Amazon DocumentDB:

  • 关系数据库或数据库架构映射到 Amazon DocumentDB数据库.

  • 关系数据库中的表映射到集合在 Amazon DocumentDB 中。

  • 关系表中的记录映射到文件在 Amazon DocumentDB 中。每个文档均由源记录中的数据构成。

如果源终端节点是 Amazon S3,则生成的 Amazon DocumentDB 对象对应于Amazon DMSAmazon S3 的映射规则。例如,考虑以下 URI。

s3://mybucket/hr/employee

在这种情况下,Amazon DMS映射中的对象mybucket如下所示到 Amazon DocumentDB:

  • 顶层 URI 部分 (hr) 映射到 Amazon DocumentDB 数据库。

  • 下一个 URI 部分 (employee) 映射到 Amazon DocumentDB 收藏夹。

  • 中的每个对象employee映射到 Amazon DocumentDB 中的文档。

有关 Amazon S3 映射规则的更多信息,请参阅使用 Amazon S3 作为源Amazon DMS.

有关将 Amazon DocumentDB 作为目标的其他详细信息Amazon DMS,请参阅以下章节:

注意

有关迁移过程的分步演练,请参阅从 MongoDB 迁移到 Amazon DocumentDB中的Amazon Database Migration Service分步迁移指南。

将数据从源映射到 Amazon DocumentDB 目标

Amazon DMS 从源终端节点读取记录,并基于它所读取的数据来构建 JSON 文档。对于每个 JSON 文档,Amazon DMS 必须确定一个 _id 字段以充当唯一标识符。然后,Amazon DocumentDB 使用_id字段作为主键。

单列源数据

如果源数据包含单个列,则数据必须是字符串类型。(根据源引擎,实际数据类型可能是 VARCHAR、NVARCHAR、TEXT、LOB、CLOB 或类似类型。)Amazon DMS假设数据是有效的 JSON 文档,并按原样将数据复制到 Amazon DocumentDB。

如果生成的 JSON 文档包含名为的字段_id,则该字段被用作唯一_id在 Amazon DocumentDB 中。

如果 JSON 不包含_id字段,然后 Amazon DocumentDB 生成_id自动值。

多列源数据

如果源数据包含多个列,则 Amazon DMS 根据所有这些列来构建 JSON 文档。要确定文档的 _id 字段,Amazon DMS 按如下方式继续:

  • 如果其中一个列被命名为 _id,则该列中的数据将用作目标 _id

  • 如果没有 _id 列,但源数据包含主键或唯一索引,则 Amazon DMS 使用该键或索引值作为 _id 值。主键或唯一索引中的数据也在 JSON 文档中显示为显式字段。

  • 如果没有_id列,而不提供主键或唯一索引,则 Amazon DocumentDB 会生成_id自动值。

在目标终端节点强制转换数据类型

Amazon DMS可以在数据写入到 Amazon DocumentDB 目标终端节点时修改数据结构。可以通过在源终端节点重命名列和表,或者通过提供运行任务时所应用的转换规则来请求这些更改。

使用嵌套 JSON 文档(json_ 前缀)

要强制转换数据类型,可以手动或使用转换的方式在源列名称中加上前缀 json_(即 json_columnName)。在这种情况下,该列作为目标文档中的嵌套 JSON 文档(而不是作为字符串字段)而创建。

例如,假设您要从 MongoDB 源终端节点迁移以下文档。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": "{"Home": {"Address": "Boston","Phone": "1111111"},"Work": { "Address": "Boston", "Phone": "2222222222"}}" }

如果不强制转换任何源数据类型,则嵌入的 ContactDetails 文档将作为字符串进行迁移。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": "{\"Home\": {\"Address\": \"Boston\",\"Phone\": \"1111111\"},\"Work\": { \"Address\": \"Boston\", \"Phone\": \"2222222222\"}}" }

但是,可以添加一个转换规则,以将 ContactDetails 强制转换为 JSON 对象。例如,假设原始源列名称为 ContactDetails。另外,假设重命名的源列为 json_ContactDetails。Amazon DMS 复制 ContactDetails 字段作为嵌套 JSON,如下所示。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactDetails": { "Home": { "Address": "Boston", "Phone": "1111111111" }, "Work": { "Address": "Boston", "Phone": "2222222222" } } }

使用 JSON 数组(array_ 前缀)

要强制转换数据类型,可以手动或使用转换的方式在列名称中加上前缀 array_(即 array_columnName)。在这种情况下,Amazon DMS 将该列视为 JSON 数组,并在目标文档中以这种方式创建它。

假设您要从 MongoDB 源终端节点迁移以下文档。

{ "_id" : "1", "FirstName": "John", "LastName": "Doe",
 "ContactAddresses": ["Boston", "New York"],
 "ContactPhoneNumbers": ["1111111111", "2222222222"] }

如果不强制转换任何源数据类型,则嵌入的 ContactDetails 文档将作为字符串进行迁移。

{ "_id": "1", "FirstName": "John", "LastName": "Doe",
 "ContactAddresses": "[\"Boston\", \"New York\"]",
 "ContactPhoneNumbers": "[\"1111111111\", \"2222222222\"]"
 }

但是,您可以添加转换规则,以将 ContactAddressContactPhoneNumbers 强制转换为 JSON 数组,如下表所示。

原始源列名称 重命名的源列
ContactAddress array_ContactAddress
ContactPhoneNumbers array_ContactPhoneNumbers

Amazon DMS 复制 ContactAddressContactPhoneNumbers,如下所示。

{ "_id": "1", "FirstName": "John", "LastName": "Doe", "ContactAddresses": [ "Boston", "New York" ], "ContactPhoneNumbers": [ "1111111111", "2222222222" ] }

使用 TLS 连接到 Amazon DocumentDB

默认情况下,新创建的 Amazon DocumentDB 集群仅接受使用传输层安全性 (TLS) 的安全连接。当 TLS 启用时,到 Amazon DocumentDB 的每个到 Amazon DocumentDB 的连接都需要公有密钥。

您可以通过下载文件来检索 Amazon DocumentDB 的公钥,rds-combined-ca-bundle.pem,来自Amazon-托管 Amazon S3 存储桶。有关下载此文件的更多信息,请参阅使用 TLS 加密连接中的Amazon DocumentDB 开发人员指南

下载此 .pem 文件后,您可以将该文件包含的公有密钥导入到 Amazon DMS 中,如下所述。

Amazon Web Services Management Console

导入公有密钥 (.pem) 文件

  1. 打开 Amazon DMS 控制台 (https://console.aws.amazon.com/dms)。

  2. 在导航窗格中,选择证书

  3. 选择 Import certificate (导入证书),然后执行以下操作:

    • 对于 Certificate identifier (证书标识符),请输入证书的唯一名称,例如 docdb-cert

    • 对于 Import file (导入文件),请导航到要将 .pem 文件保存到的位置。

    根据需要设置完毕后,选择 Add new CA certificate (添加新的 CA 证书)

Amazon CLI

使用 aws dms import-certificate 命令,如以下示例所示。

aws dms import-certificate \ --certificate-identifier docdb-cert \ --certificate-pem file://./rds-combined-ca-bundle.pem

创建 Amazon DMS 目标终端节点时,请提供证书标识符(例如 docdb-cert)。另外,请将 SSL 模式参数设置为 verify-full

将 Amazon DocumentDB 作为目标持续复制

如果启用正在进行的复制,Amazon DMS确保 Amazon DocumentDB 中的文档与源保持同步。创建或更新源记录后,Amazon DMS必须首先通过执行以下操作来确定哪个 Amazon DocumentDB 记录受到影响:

  • 如果源记录有名称为的列_id中,该列的值将确定相应的_id在 Amazon DocumentDB 集合中。

  • 如果没有_id列,但源数据有主键或唯一索引,则Amazon DMS使用该键或索引值作为_id用于 Amazon DocumentDB 集合。

  • 如果源记录没有_id然后,列、主键或唯一索引,Amazon DMS将所有源列与 Amazon DocumentDB 集合中的相应字段匹配。

创建新的源记录后,Amazon DMS将相应的文档写入 Amazon DocumentDB。如果更新了现有的源记录,Amazon DMS更新 Amazon DocumentDB 中的目标文档中的相应字段。目标文档中存在而源记录中不存在的任何字段均保持不变。

删除源记录后,Amazon DMS从 Amazon DocumentDB 中删除相应的文档。

源位置的结构变更 (DDL)

通过持续复制,对源数据结构(如表、列等)的任何更改都将传播到 Amazon DocumentDB 中的对应项。在关系数据库中,通过使用数据定义语言 (DDL) 语句启动这些更改。你能看到怎么样Amazon DMS将这些更改传播到下表中的 Amazon DocumentDB。

源位置的 DDL 对 Amazon DocumentDB 目标的影响
CREATE TABLE 创建一个空集合。
重命名表的语句(RENAME TABLEALTER TABLE...RENAME 及类似语句) 重命名集合。
TRUNCATE TABLE 从集合中删除所有文档,但前提是 HandleSourceTableTruncatedtrue。有关更多信息,请参阅更改处理 DDL 处理的任务设置
DROP TABLE 删除集合,但前提是 HandleSourceTableDroppedtrue。有关更多信息,请参阅更改处理 DDL 处理的任务设置
向表中添加一列的语句(ALTER TABLE...ADD 及类似语句) 将忽略 DDL 语句,并发出警告。在源位置执行第一个 INSERT 时,新字段将添加到目标文档。
ALTER TABLE...RENAME COLUMN 将忽略 DDL 语句,并发出警告。在源位置执行第一个 INSERT 时,新命名的字段将添加到目标文档。
ALTER TABLE...DROP COLUMN 将忽略 DDL 语句,并发出警告。
更改列数据类型的语句(ALTER COLUMN...MODIFY 及类似语句) 将忽略 DDL 语句,并发出警告。使用新数据类型在源位置执行第一个 INSERT 时,将创建包含该新数据类型的字段的目标文档。

将 Amazon DocumentDB 作为目标的限制

将 Amazon DocumentDB 作为的目标时存在以下限制:Amazon DMS:

  • 在 Amazon DocumentDB 中,集合名称不能包含美元符号 ($)。此外,数据库名称不能包含任何 Unicode 字符。

  • Amazon DMS不支持将多个源表合并到单个 Amazon DocumentDB 集合。

  • 当 Amazon DMS 处理没有主键的源表中的更改时,将忽略该表中的任何 LOB 列。

  • 如果 Change table (更改表) 选项处于启用状态,并且 Amazon DMS 发现名为“_id”的源列,则该列将在更改表中显示为“__id”(两条下划线)。

  • 如果选择 Oracle 作为源终端节点,则 Oracle 源必须启用完整补充日志记录。否则,如果源位置有未更改的列,则数据将作为 Null 值加载到 Amazon DocumentDB。

  • 复制任务设置,TargetTablePrepMode:TRUNCATE_BEFORE_LOAD不支持用于 DocumentDB 目标终端节点。

Amazon DocumentDB 的目标数据类型

在下表中,您可以找到使用时支持的 Amazon DocumentDB 目标数据类型。AmazonDMS,以及来自的默认映射AmazonDMS 数据类型。有关 的更多信息AmazonDMS 数据类型,请参阅的数据类型AmazonDatabase Migration Service.

AmazonDMS 数据类型

Amazon DocumentDB 数据类型

BOOLEAN

Boolean

BYTES

二进制数据

DATE

日期

TIME

字符串 (UTF8)

DATETIME

日期

INT1

32 位整数

INT2

32 位整数

INT4

32 位整数

INT8

64 位整数

NUMERIC

字符串 (UTF8)

REAL4

Double

REAL8

Double

STRING

如果数据被识别为 JSON,则Amazon DMS将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

UINT1

32 位整数

UINT2

32 位整数

UINT4

64 位整数

UINT8

字符串 (UTF8)

WSTRING

如果数据被识别为 JSON,则Amazon DMS将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

BLOB

Binary

CLOB

如果数据被识别为 JSON,则Amazon DMS将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

NCLOB

如果数据被识别为 JSON,则Amazon DMS将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。