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

将 Amazon Redshift 数据库作为 AWS Database Migration Service 目标

您可以使用 AWS Database Migration Service 将数据迁移到 Amazon Redshift 数据库。Amazon Redshift 是一个完全托管的 PB 级云中数据仓库服务。使用 Amazon Redshift 数据库作为目标,您可以从所有其他支持的源数据库迁移数据。

Amazon Redshift 集群必须与复制实例处于相同的 AWS 账户和相同的 AWS 区域中。

在将数据库迁移到 Amazon Redshift 期间,AWS DMS 先将数据移动到 Amazon S3 存储桶。文件位于 Amazon S3 存储桶中之后,AWS DMS 随之将其传输到 Amazon Redshift 数据仓库中正确的表。AWS DMS 在与 Amazon Redshift 数据库相同的 AWS 区域中创建 S3 存储桶。AWS DMS 复制实例必须位于同一个区域中。

如果使用 AWS Command Line Interface (AWS CLI) 或 DMS API 将数据迁移到 Amazon Redshift,则必须设置 AWS Identity and Access Management (IAM) 角色以允许 S3 访问。有关创建此 IAM 角色的更多信息,请参阅 创建 IAM 角色以用于 AWS CLI 和 AWS DMS API

Amazon Redshift 终端节点为以下过程提供完全的自动化:

  • 架构生成和数据类型映射

  • 源数据库表的完全加载

  • 增量加载对源表进行的更改

  • 应用对源表的数据定义语言 (DDL) 的架构更改

  • 完全加载和更改数据捕获 (CDC) 流程之间的同步。

AWS Database Migration Service 支持完全加载和更改处理操作。AWS DMS 从源数据库读取数据并创建一系列逗号分隔值 (.csv) 文件。对于完全加载操作,AWS DMS 为每个表创建文件。然后,AWS DMS 将各个表的表文件复制到 Amazon S3 中的单独文件夹中。在文件上传到 Amazon S3 之后,AWS DMS 会发送一条复制命令,将文件中的数据复制到 Amazon Redshift 中。对于更改处理操作,AWS DMS 将净更改复制到 .csv 文件。随后,AWS DMS 将净更改文件上传到 Amazon S3 并将数据复制到 Amazon Redshift。

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

将 Amazon Redshift 数据库作为 AWS Database Migration Service 目标的先决条件

下面的列表介绍将 Amazon Redshift 作为数据迁移目标时所需的先决条件:

  • 使用 AWS 管理控制台启动 Amazon Redshift 集群。您应记录有关您 AWS 账户和 Amazon Redshift 集群的基本信息,例如密码、用户名和数据库名称。在创建 Amazon Redshift 目标终端节点时,您需要这些值。

  • Amazon Redshift 集群必须与复制实例处于相同的 AWS 账户和相同的 AWS 区域中。

  • AWS DMS 复制实例需要到集群所使用的 Amazon Redshift 终端节点(主机名和端口)的网络连接。

  • AWS DMS 使用 Amazon S3 存储桶将数据传输到 Amazon Redshift 数据库。对于 AWS DMS 创建存储桶,DMS 控制台使用 Amazon IAM 角色 dms-access-for-endpoint。如果使用 AWS CLI 或 DMS API 创建数据库迁移并将 Amazon Redshift 作为目标数据库,则必须创建此 IAM 角色。有关创建此角色的更多信息,请参阅 创建 IAM 角色以用于 AWS CLI 和 AWS DMS API

  • AWS DMS 将 BLOB、CLOB 和 NCLOB 转换为目标 Amazon Redshift 实例上的 VARCHAR。Amazon Redshift 不支持大于 64 KB 的 VARCHAR 数据类型,因此,您无法在 Amazon Redshift 上存储传统 LOB。

将 Amazon Redshift 作为 AWS Database Migration Service 目标时的限制

使用 Amazon Redshift 数据库作为目标时,AWS DMS 不支持以下内容:

  • 不支持以下 DDL:

    ALTER TABLE <table name> MODIFY COLUMN <column name> <data type>;
  • AWS DMS 无法迁移或复制对名称以下划线 (_) 开头的架构所做的更改。如果您具有名称以下划线开头的架构,请使用映射转换重命名目标上的架构。

  • Amazon Redshift 不支持大于 64 KB 的 VARCHAR。传统数据库中的 LOB 不能存储在 Amazon Redshift 中。

将 Amazon Redshift 数据库配置为 AWS Database Migration Service 目标

AWS Database Migration Service 必须配置为使用 Amazon Redshift 实例。下表列出了可用于 Amazon Redshift 终端节点的配置属性。

属性

描述

server

所使用的 Amazon Redshift 集群的名称。

port (远程调试端口)

Amazon Redshift 的端口号。默认值是 5439。

username

已注册用户的 Amazon Redshift 用户名。

密码

在 username 属性中指定的用户的密码。

database

所使用的 Amazon Redshift 数据仓库(服务)的名称。

如果要添加额外的连接字符串属性到 Amazon Redshift 终端节点,可以指定 maxFileSizefileTransferUploadStreams 属性。有关这些属性的更多信息,请参阅将 Amazon Redshift 作为 AWS DMS 目标时的额外连接属性

将 Amazon Redshift 作为 AWS Database Migration Service 目标时使用增强型 VPC 路由

如果您将增强型 VPC 路由用于 Amazon Redshift 目标,则您的 Amazon Redshift 集群和数据存储库之间的所有 COPY 流量将流经您的 VPC。由于增强型 VPC 路由会影响 Amazon Redshift 访问其他资源的方式,因此,如果未正确配置 VPC,则 COPY 命令可能会失败。

AWS DMS 使用 COPY 命令将 S3 中的数据移动到 Amazon Redshift 集群,因此可能会受此行为的影响。

AWS DMS 将数据加载到 Amazon Redshift 目标时采用的步骤如下:

  1. AWS DMS 将数据从源复制到复制服务器上的 .csv 文件。

  2. AWS DMS 使用 AWS 开发工具包将 .csv 文件复制到您账户上的 S3 存储桶中。

  3. 然后,AWS DMS 在 Amazon Redshift 中使用 COPY 命令将数据从 S3 中的 .csv 文件复制到 Amazon Redshift 中的相应表。

如果未启用增强型 VPC 路由,则 Amazon Redshift 会通过 Internet 路由流量,包括至 AWS 网络中的其他服务的流量。如果未启用该功能,您不必配置网络路径。如果启用此功能,您必须专门创建您群集的 VPC 与数据源之间的网络路径。有关所需配置的更多信息,请参阅 Amazon Redshift 文档中的增强型 VPC 路由

创建 AWS KMS 密钥并使用该密钥对 Amazon Redshift 目标数据进行加密

您可以先加密推送到 Amazon S3 的目标数据,然后再将其复制到 Amazon Redshift。为此,您可以创建并使用自定义 AWS Key Management Service (AWS KMS) 密钥。您可以在创建 Amazon Redshift 目标终端节点时使用所创建的密钥通过下列机制之一加密目标数据:

要使用 KMS 密钥加密 Amazon Redshift 目标数据,您需要一个有权访问 Amazon Redshift 数据的 AWS Identity and Access Management (IAM) 角色。随后,在附加到您创建的加密密钥的策略(密钥策略)中访问此 IAM 角色。您可以通过创建以下项来在 IAM 控制台中来执行此操作:

  • 一个带 Amazon 托管策略的 IAM 角色。

  • 一个带引用此角色的密钥策略的 KMS 加密密钥。

以下过程介绍了如何执行此操作。

创建带所需 Amazon 托管策略的 IAM 角色

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 RolesRoles (角色) 页面随即打开。

  3. 选择创建角色Create role (创建角色) 页面随即打开。

  4. 选择 AWS service (AWS 服务) 作为可信实体后,选择 DMS 作为要使用该角色的服务。

  5. 选择 Next: Permissions (下一步:权限)。此时将显示 Attach permissions policies (附加权限策略) 页面。

  6. 查找并选择 AmazonDMSRedshiftS3Role 策略。

  7. 选择下一步: 标签。此时将显示 Add tags (添加标签) 页面。您可以在此处添加所需的任何标签。

  8. 选择 Next: Review (下一步: 审核) 并检查您的结果。

  9. 如果这些设置是您所需的,请输入角色的名称(例如,DMS-Redshift-endpoint-access-role)及任何其他描述,然后选择 Create role (创建角色)Roles (角色) 页面随即打开,并显示一条指示您的角色已创建的消息。

现在,您已创建新角色来访问 S3 资源,以便使用指定的名称(例如 DMS-Redshift-endpoint-access-role)进行加密。

创建带引用您的 IAM 角色的密钥策略的 KMS 加密密钥

  1. 在 IAM 控制台上,在导航窗格中选择 Encryption keys (加密密钥)

    如果这是您首次访问此选项,则将显示 AWS Key Management Service 的简介,并且您可以选择 Get Started Now (立即开始使用) 以开始。否则,Encryption keys (加密密钥) 页面将打开。

  2. 选择 Create keyCreate Alias and Description (创建别名和描述) 页面随即打开。

  3. 输入密钥的别名(例如,DMS-Redshift-endpoint-encryption-key)及任何其他描述。

  4. 选择 Advanced Options。在 Advanced Options (高级选项) 部分中,确保为 Key Material Origin (密钥材料来源) 选中 KMS,然后选择 Next Step (下一步)Add tags (添加标签) 页面随即打开。

  5. 添加要用于帮助标识密钥并跟踪其使用情况的任何标签,然后选择 Next Step (下一步)Define Key Administrative Permissions (定义密钥管理权限) 页面随即打开,并显示可供选择的用户和角色的列表。

  6. 添加要管理密钥的用户和角色。确保这些用户和角色具有管理密钥所需的权限。

  7. 选择密钥管理员是否能删除密钥,然后选择 Next Step (下一步)Define Key Usage Permissions (定义密钥使用权限) 页面随即打开,并显示可供选择的用户和角色的附加列表。

  8. 选择您之前在 Roles (角色) 中创建的角色以启用对加密 Amazon Redshift 目标数据的访问,例如 DMS-Redshift-endpoint-access-role。然后选择 Next Step

    Preview Key Policy (预览密钥策略) 页面随即打开,并显示可查看的密钥策略的 JSON。在此处,您可以看到密钥策略引用您在上一步中选择的角色的位置。您还可以查看不同的委托人(用户和角色)所允许的不同的密钥操作,如以下示例所示。

    { "Id": "key-consolepolicy-3", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::944454115380:root" ] }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::944454115380:role/Admin" ] }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::944454115380:role/DMS-Redshift-endpoint-access-role" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }, { "Sid": "Allow attachment of persistent resources", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::944454115380:role/DMS-Redshift-endpoint-access-role" ] }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": true } } } ] }
  9. 选择 FinishEncryption keys (加密密钥) 页面随即打开,并显示一条指示您的主加密密钥已创建的消息。

现在,您已创建一个具有指定别名(例如,DMS-Redshift-endpoint-encryption-key)的新 KMS 密钥。此密钥启用 AWS DMS 以加密 Amazon Redshift 目标数据。

注意

您还可以结合使用 AWS Key Management Service 与 IAM 角色和策略来创建和管理 KMS 密钥。有关更多信息,请参阅 Key Management Service (KMS):开发人员指南

使用 Amazon Redshift 作为 AWS DMS 的目标时的终端节点设置

您可以使用终端节点设置来配置 Amazon Redshift 目标。您可以在 AWS CLI 中使用 create-endpoint 命令创建目标终端节点时通过 --redshift-settings "json-settings-object" 选项指定这些设置。此处,json-settings-object 是包含用于指定设置的参数的 JSON 对象。

KMS 密钥设置

您可以使用 Amazon Redshift 目标终端节点设置来配置自定义 AWS KMS 密钥。随后,可以使用此密钥来加密推送到 Amazon S3 的数据,然后再将其复制到 Amazon Redshift。

以下示例说明如何配置自定义 KMS 密钥以加密推送到 S3 的数据。要开始,您可在 AWS CLI 中进行以下 create-endpoint 调用。

aws dms create-endpoint --endpoint-identifier redshift-target-endpoint --endpoint-type target --engine-name redshift --username your-username --password your-password --server-name your-server-name --port 5439 --database-name your-db-name --redshift-settings '{"EncryptionMode": "SSE_KMS", "ServerSideEncryptionKmsKeyId": "arn:aws:kms:us-east-1:944454115380:key/24c3c5a1-f34a-4519-a85b-2debbef226d1"}'

此处,--redshift-settings 选项所指定的 JSON 对象定义了两个参数。一个是带值 SSE_KMSEncryptionMode 参数。另一个是带值 arn:aws:kms:us-east-1:944454115380:key/24c3c5a1-f34a-4519-a85b-2debbef226d1ServerSideEncryptionKmsKeyId 参数。此值是自定义 KMS 密钥的 Amazon 资源名称 (ARN)。

默认情况下,S3 数据加密是使用默认账户 KMS 密钥进行的。对于上一示例中的 Amazon Redshift 目标,这也等同于指定其终端节点设置,如以下示例所示。

aws dms create-endpoint --endpoint-identifier redshift-target-endpoint --endpoint-type target --engine-name redshift --username your-username --password your-password --server-name your-server-name --port 5439 --database-name your-db-name --redshift-settings '{"EncryptionMode": "SSE_S3"}'

有关使用默认账户 KMS 密钥的更多信息,请参阅设置加密密钥和指定 KMS 权限

将 Amazon Redshift 作为 AWS DMS 目标时的额外连接属性

您可以使用额外的连接属性配置 Amazon Redshift 目标。在创建目标终端节点时,您可以指定这些设置。如果您具有多个连接属性设置,请用分号将它们彼此分开,并且不需要额外的空格。

下表列出了在目标为 Amazon Redshift 时的可用额外连接属性。

名称 描述

maxFileSize

指定用于将数据传输到 Amazon Redshift 的任何 .csv 文件的最大大小(以 KB 为单位)。

默认值:32768 KB (32 MB)

有效值:1 - 1048576

示例:maxFileSize=512

fileTransferUploadStreams

指定用于上传单个文件的线程的数目。

调整渲染效果的缩放。

有效值:1 – 64

示例:fileTransferUploadStreams=20

acceptanydate

指定是否接受任何日期格式,包括无效和日期格式,如 0000-00-00。布尔值。

默认值:false

有效值:true | false

示例:acceptanydate=true

dateformat

指定日期格式。默认情况下,这是一个字符串输入且为空。默认格式为 YYYY-MM-DD,但您可以将其更改为 DD-MM-YYYY。如果您的日期或时间值使用不同的格式,请结合使用 auto 参数与 dateformat 参数。auto 参数将识别使用 dateformat 字符串时不受支持的一些格式。auto 关键字区分大小写。

默认值:empty

有效值:'dateformat_string' 或 auto

示例:dateformat=auto

timeformat

指定时间格式。默认情况下,这是一个字符串输入且为空。auto 参数将识别使用 timeformat 字符串时不受支持的一些格式。如果您的日期和时间值使用各不相同的格式,请结合使用 auto 参数与 timeformat 参数。

调整渲染效果的缩放。

有效值:'timeformat_string' | 'auto' | 'epochsecs' | 'epochmillisecs'

示例:timeformat=auto

emptyasnull

指定 AWS DMS 是否应迁移作为 null 的空 CHAR 和 VARCHAR 字段。值 true 可将空的 CHAR 和 VARCHAR 字段设置为 null。

默认值:false

有效值:true | false

示例:emptyasnull=true

truncateColumns

将列中的数据截断为合适的字符数以符合列规范。仅适用于具有 VARCHAR 或 CHAR 数据类型的列以及大小为 4 MB 或以下的行。

默认值:false

有效值:true | false

示例:

truncateColumns=true;

removeQuotes

删除传入数据中的字符串周围的引号。将保留引号中的所有字符(包括分隔符)。有关删除 Amazon Redshift 目标的引号的更多信息,请参阅 Amazon Redshift Database Developer Guide

默认值:false

有效值:true | false

示例:

removeQuotes=true;

trimBlanks

删除 VARCHAR 字符串的尾部空格字符。此参数仅适用于具有 VARCHAR 数据类型的列。

默认值:false

有效值:true | false

示例:

trimBlanks=false;

encryptionMode 在将数据复制到 Amazon Redshift 之前要用于将数据推送到 S3 的服务器端加密模式。有效值为 SSE_S3 或 SSE_KMS。如果您选择 SSE_KMS,请将 serverSideEncryptionKmsKeyId 参数设置为要用于加密的 KMS 密钥的 Amazon 资源名称 (ARN)。

默认值:SSE_S3

有效值:SSE_S3 或 SSE_KMS

示例:

encryptionMode=SSE_S3;

serverSideEncryptionKmsKeyId 如果您将 encryptionMode 设置为 SSE_KMS,请将此参数设置为 KMS 密钥的 ARN。您可以通过在为您的账户创建的 KMS 密钥列表中选择密钥别名来查找此 ARN。在创建密钥时,您必须将特定策略和角色与密钥关联。有关更多信息,请参阅创建 AWS KMS 密钥并使用该密钥对 Amazon Redshift 目标数据进行加密

示例:

serverSideEncryptionKmsKeyId=arn:aws:kms:us-east-1:944454115380:key/24c3c5a1-f34a-4519-a85b-2debbef226d1;

Amazon Redshift 的目标数据类型

AWS DMS 的 Amazon Redshift 终端节点支持大多数 Amazon Redshift 数据类型。下表列出了使用 AWS DMS 时支持的 Amazon Redshift 目标数据类型以及来自 AWS DMS 数据类型的默认映射。

有关 AWS DMS 数据类型的其他信息,请参阅AWS Database Migration Service 的数据类型

AWS DMS 数据类型

Amazon Redshift 数据类型

BOOLEAN

BOOL

BYTES

VARCHAR (Length)

DATE

DATE

TIME

VARCHAR(20)

DATETIME

如果小数位数 => 0 且 <= 6,请使用:

TIMESTAMP (s)

如果小数位数 => 7 且 <= 9,请使用:

VARCHAR(37)

INT1

INT2

INT2

INT2

INT4

INT4

INT8

INT8

NUMERIC

如果小数位数 => 0 且 <= 37,请使用:

NUMERIC (p,s)

如果小数位数 => 38 且 <= 127,请使用:

VARCHAR (Length)

REAL4

FLOAT4

REAL8

FLOAT8

STRING

如果长度为 1–65535,请使用 VARCHAR(以字节为单位的长度)

如果长度为 65536–2147483647,请使用 VARCHAR (65535)

UINT1

INT2

UINT2

INT2

UINT4

INT4

UINT8

NUMERIC (20,0)

WSTRING

如果长度为 1–65535,请使用 NVARCHAR(以字节为单位的长度)

如果长度为 65536–2147483647,请使用 NVARCHAR (65535)

BLOB

VARCHAR (最大 LOB 大小 *2)

最大 LOB 大小不能超过 31 KB。Amazon Redshift 不支持大于 64 KB 的 VARCHAR。

NCLOB

NVARCHAR (最大 LOB 大小)

最大 LOB 大小不能超过 63 KB。Amazon Redshift 不支持大于 64 KB 的 VARCHAR。

CLOB

VARCHAR (最大 LOB 大小

最大 LOB 大小不能超过 63 KB。Amazon Redshift 不支持大于 64 KB 的 VARCHAR。