AWS Database Migration Service
用户指南 (版本 API Version 2016-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 Amazon DocumentDB 用作 AWS Database Migration Service 的目标

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

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

如果源终端节点为 MongoDB,请确保启用以下额外的连接属性:

  • nestingLevel=NONE

  • extractDocID=FALSE

有关更多信息,请参阅将 MongoDB 用作 AWS DMS 源时的额外连接属性

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

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

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

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

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

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

s3://mybucket/hr/employee

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

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

  • 接下来的 URI 部分 (employee) 映射到 Amazon DocumentDB 集合。

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

有关 Amazon S3 的映射规则的更多信息,请参阅将 Amazon Simple Storage Service 作为 AWS DMS 源

有关使用 Amazon DocumentDB 作为 AWS DMS 的目标的其他详细信息,包括迁移过程的演练,请参阅以下各节。

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

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

单列源数据

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

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

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

多列源数据

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

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

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

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

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

AWS 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。AWS 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)。在这种情况下,AWS 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

AWS DMS 复制 ContactAddressContactPhoneNumbers,如下所示。

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

使用 TLS 连接到 Amazon DocumentDB

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

您可以从 AWS 托管的 Amazon S3 存储桶下载 Amazon DocumentDB 的公有密钥作为 rds-combined-ca-bundle.pem 文件。

下载 .pem 文件后,您可以将该文件导入 AWS DMS,如下所述。

AWS 管理控制台

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

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

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

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

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

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

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

AWS CLI

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

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

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

以 Amazon DocumentDB 作为目标的持续复制

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

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

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

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

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

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

源位置的结构变更 (DDL)

通过持续复制,对源数据结构(如表、列等)的任何更改都将传播到其在 Amazon DocumentDB 中的对应项。在关系数据库中,通过使用数据定义语言 (DDL) 语句启动这些更改。可以在下表中查看 AWS 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 作为 AWS DMS 的目标时存在以下限制:

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

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

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

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

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

Amazon DocumentDB 的目标数据类型

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

AWS DMS 数据类型

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,则 AWS DMS 会将其作为文档迁移到 Amazon DocumentDB。否则,数据将映射到“字符串 (UTF8)”。

UINT1

32 位整数

UINT2

32 位整数

UINT4

64 位整数

UINT8

字符串 (UTF8)

WSTRING

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

BLOB

二进制

CLOB

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

NCLOB

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