将 Amazon Redshift 数据库作为 AWS Database Migration Service 目标 - AWS 数据库迁移服务

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

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

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

您可以将 Amazon Redshift Serverless 作为 AWS DMS 的目标。有关更多信息,请参阅下面的使用 AWS DMS 并将 Amazon Redshift Serverless 作为目标

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

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

如果使用 AWS CLI 或 DMS API 将数据迁移到 Amazon Redshift,请设置 AWS Identity and Access Management (IAM) 角色以允许 S3 访问。有关创建此 IAM 角色的更多信息,请参阅 创建要与 AWS CLI 和一起使用的IAM角色 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 创建存储桶,控制台使用 IAM 角色 dms-access-for-endpoint。如果使用 AWS CLI 或 DMS API 创建数据库迁移并将 Amazon Redshift 作为目标数据库,则必须创建此 IAM 角色。有关创建此角色的更多信息,请参阅 创建要与 AWS CLI 和一起使用的IAM角色 AWS DMS API

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

  • 将目标元数据任务设置 BatchApplyEnabled 设为 true,以供 AWS DMS 在 CDC 期间处理对 Amazon Redshift 目标表的更改。同时需要源表和目标表的主键。如果没有主键,则会逐条语句应用更改。这会导致目标延迟并影响集群提交队列,从而对 CDC 期间的任务性能产生负面影响。

将 Redshift 作为目标所需的权限

使用 GRANT 命令为用户或用户组定义访问权限。权限包括各种访问选项,例如读取表和视图中的数据、写入数据和创建表的能力。有关为 Amazon Redshift 使用 GRANT 的更多信息,请参阅《Amazon Redshift 数据库开发人员指南》中的 GRANT

以下是授予 Amazon Redshift 表和视图上的表、数据库、架构、函数、过程或语言级权限的语法。

GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES } [,...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...] GRANT { { CREATE | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE db_name [, ...] TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...] GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL PROCEDURES IN SCHEMA schema_name [, ...] } TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...] GRANT USAGE ON LANGUAGE language_name [, ...] TO { username [ WITH GRANT OPTION ] | GROUP group_name | PUBLIC } [, ...]

以下是 Amazon Redshift 表和视图上的列级权限的语法。

GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) } ON { [ TABLE ] table_name [, ...] } TO { username | GROUP group_name | PUBLIC } [, ...]

以下是授予具有指定角色的用户和组的 ASSUMEROLE 权限的语法。

GRANT ASSUMEROLE ON { 'iam_role' [, ...] | ALL } TO { username | GROUP group_name | PUBLIC } [, ...] FOR { ALL | COPY | UNLOAD } [, ...]

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

将 Amazon Redshift 数据库作为目标时,存在以下限制:

  • 不要为用作 Amazon Redshift 目标的中间存储的 S3 存储桶启用版本控制。如果您需要 S3 版本控制,请使用生命周期策略主动删除旧版本。否则,您可能会遇到由于 S3 list-object 调用超时而导致端点测试连接失败的情况。要为 S3 存储桶创建生命周期策略,请参阅管理存储生命周期。要删除 S3 对象的某个版本,请参阅从启用版本控制的存储桶中删除对象版本

  • 不支持以下 DDL:

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

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

  • 当任意主键列名称使用了保留字时,不支持对具有多列主键的表应用 DELETE 语句。转到此处查看 Amazon Redshift 保留词的列表。

  • 如果源系统对源表的主键执行 UPDATE 操作,则可能会遇到性能问题。这些性能问题会在对目标应用更改时出现。这是因为 UPDATE(和 DELETE)操作依赖于主键值来标识目标行。如果您更新源表的主键,则任务日志将包含类似如下的消息:

    Update on table 1 changes PK to a PK that was previously updated in the same bulk update.
  • 在为 Redshift 集群配置端点时,DMS 不支持自定义 DNS 名称,您需要使用 Amazon 提供的 DNS 名称。由于 Amazon Redshift 集群必须与复制实例位于相同的 AWS 账户和区域中,因此如果您使用自定义 DNS 端点,则验证将失败。

  • Amazon Redshift 的默认空闲会话超时时间为 4 小时。当 DMS 复制任务中没有任何活动时,Redshift 会在 4 小时后断开会话连接。由于 DMS 无法连接并可能需要重新启动,因此会导致出现错误。一个临时解决方法是为 DMS 复制用户设置大于 4 小时的会话超时限制。或者,请参阅《Amazon Redshift 数据库开发人员指南》中的 ALTER USER 描述。

  • 当 AWS DMS 在没有主键或唯一键的情况下复制源表数据时,CDC 延迟可能会很高,导致性能水平不可接受。

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

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

属性

描述

服务器

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

port

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

username

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

password

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

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

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

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

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

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

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

创建带所需 AWS 托管策略的 IAM 角色
  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

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

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

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

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

  6. 查找并选择 AmazonDMSRedshiftS3Role 策略。

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

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

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

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

创建带引用您的 IAM 角色的密钥政策的 AWS KMS 加密密钥
注意

有关如何将 AWS DMS 与 AWS KMS 加密密钥结合使用的更多信息,请参阅 设置加密密钥并指定 AWS KMS 权限

  1. 登录到 AWS Management Console,然后通过以下网址打开 AWS Key Management Service (AWS KMS) 控制台:https://console.aws.amazon.com/kms

  2. 要更改 AWS 区域,请使用页面右上角的区域选择器。

  3. 在导航窗格中,选择客户托管密钥

  4. 选择 Create key。此时会打开 Configure key (配置密钥) 页面。

  5. 对于 Key type (密钥类型),选择 Symmetric (对称)

    注意

    创建此密钥时,您只能创建对称密钥,因为所有 AWS 服务(如 Amazon Redshift)仅使用对称加密密钥。

  6. 选择 Advanced Options。对于 Key material origin (密钥材料来源),请确保选择了 KMS,然后选择 Next (下一步)。此时会打开 Add labels (添加标签) 页面。

  7. 对于 Create alias and description (创建别名和描述),输入密钥的别名(例如 DMS-Redshift-endpoint-encryption-key)和任何其他描述。

  8. 对于 Tags (标签),添加要用于帮助标识密钥并跟踪其使用情况的任何标签,然后选择 Next (下一步)。此时会打开 Define key administrative permissions (定义密钥管理权限) 页面,其中显示了可供选择的用户和角色的列表。

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

  10. 对于 Key deletion (密钥删除),选择密钥管理员是否能删除密钥,然后选择 Next (下一步)。此时会打开 Define Key Usage Permissions (定义密钥使用权限) 页面,其中显示了可供选择的用户和角色的附加列表。

  11. 对于此账户,选择要对 Amazon Redshift 目标执行加密操作的可用用户。此外,还应选择您之前在角色中创建的角色以启用访问权限来加密 Amazon Redshift 目标对象,例如 DMS-Redshift-endpoint-access-role

  12. 如果要添加未列出的其他账户以获得相同访问权限,请为其他 AWS 账户选择添加其他 AWS 账户,然后选择下一步。此时会打开 Review and edit key policy (查看和编辑密钥策略) 页面,其中显示了密钥策略的 JSON,您可以通过键入到现有 JSON 来查看和编辑该策略。在此处,您可以看到密钥策略引用您在上一步中选择的角色和用户(例如,AdminUser1)的位置。您还可以查看不同的委托人(用户和角色)所允许的不同的密钥操作,如以下示例所示。

    { "Id": "key-consolepolicy-3", "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:root" ] }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333: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::111122223333:role/DMS-Redshift-endpoint-access-role", "arn:aws:iam::111122223333:role/Admin", "arn:aws:iam::111122223333:role/User1" ] }, "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::111122223333:role/DMS-Redshift-endpoint-access-role", "arn:aws:iam::111122223333:role/Admin", "arn:aws:iam::111122223333:role/User1" ] }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": true } } } ]
  13. 选择完成加密密钥页面随即打开,并显示一条指示您的 AWS KMS key 已创建的消息。

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

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

您可以使用端点设置来配置 Amazon Redshift 目标,这与使用额外连接属性类似。您可以在使用 AWS DMS 控制台创建目标端点时指定设置,或者在 AWS CLI 中使用符合 --redshift-settings '{"EndpointSetting": "value", ...}' JSON 语法的 create-endpoint 命令。

下表显示了将 Amazon Redshift 作为目标时您可以使用的端点设置。

名称 描述

MaxFileSize

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

默认值:32768 KB (32 MB)

有效值:1–1048576

例如:--redshift-settings '{"MaxFileSize": 512}'

FileTransferUploadStreams

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

默认值:10

有效值:1-64

例如:--redshift-settings '{"FileTransferUploadStreams": 20}'

Acceptanydate

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

默认值:false

有效值:true | false

例如:--redshift-settings '{"Acceptanydate": true}'

Dateformat

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

默认值:empty

有效值:“dateformat_string”或 auto

例如:--redshift-settings '{"Dateformat": "auto"}'

Timeformat

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

默认值:10

有效值:"Timeformat_string" | "auto" | "epochsecs" | "epochmillisecs"

例如:--redshift-settings '{"Timeformat": "auto"}'

Emptyasnull

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

默认值:false

有效值:true | false

例如:--redshift-settings '{"Emptyasnull": true}'

TruncateColumns

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

默认值:false

有效值:true | false

例如:--redshift-settings '{"TruncateColumns": true}'

RemoveQuotes

删除传入数据中的字符串周围的引号。将保留引号中的所有字符(包括分隔符)。有关删除对 Amazon Redshift 目标的引用的更多信息,请参阅 Amazon Redshift 数据库开发人员指南

默认值:false

有效值:true | false

例如:--redshift-settings '{"RemoveQuotes": true}'

TrimBlanks

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

默认值:false

有效值:true | false

例如:--redshift-settings '{"TrimBlanks": true}'

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

您也可以使用 CLI modify-endpoint 命令将现有端点的 EncryptionMode 设置值从 SSE_KMS 更改为 SSE_S3。但您不能将 EncryptionMode 值从 SSE_S3 更改为 SSE_KMS

默认值:SSE_S3

有效值:SSE_S3SSE_KMS

例如:--redshift-settings '{"EncryptionMode": "SSE_S3"}'

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

例如:--redshift-settings '{"ServerSideEncryptionKmsKeyId":"arn:aws:kms:us-east-1:111122223333:key/11a1a1a1-aaaa-9999-abab-2bbbbbb222a2"}'

EnableParallelBatchInMemoryCSVFiles EnableParallelBatchInMemoryCSVFiles 设置通过让 DMS 写入磁盘而不是内存来提高大型多线程完全加载任务的性能。默认值为 false
CompressCsvFiles 使用此属性可以压缩迁移期间发送到 Amazon Redshift 目标的数据。默认值为 true,默认情况下压缩处于启用状态。

使用数据加密密钥,并将 Amazon S3 存储桶作为中间存储

您可以使用 Amazon Redshift 目标端点设置来配置以下内容:

  • 自定义 AWS KMS 数据加密密钥。随后,可以使用此密钥来加密推送到 Amazon S3 的数据,然后再将其复制到 Amazon Redshift。

  • 自定义 S3 存储桶作为迁移到 Amazon Redshift 的数据的中间存储。

  • 将布尔值映射为来自 PostgreSQL 源的布尔值。默认情况下,BOOLEAN 类型迁移为 varchar(1)。您可以指定 MapBooleanAsBoolean 让 Redshift 目标将布尔类型迁移为布尔值,如以下示例所示。

    --redshift-settings '{"MapBooleanAsBoolean": true}'

    请注意,您必须在源端点和目标端点上都设置此设置才能使其生效。

用于数据加密的 KMS 密钥设置

以下示例说明如何配置自定义 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:111122223333:key/24c3c5a1-f34a-4519-a85b-2debbef226d1"}'

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

默认情况下,使用 S3 服务器端加密进行 S3 数据加密。对于上一示例中的 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"}'

有关使用 S3 服务器端加密的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用服务器端加密保护数据

注意

您也可以使用 CLI modify-endpoint 命令将现有端点的 EncryptionMode 参数值从 SSE_KMS 更改为 SSE_S3。但您不能将 EncryptionMode 值从 SSE_S3 更改为 SSE_KMS

Amazon S3 存储桶设置

当您将数据迁移到 Amazon Redshift 目标端点时,在将迁移的数据复制到 Amazon Redshift 之前使用默认 Amazon S3 存储桶作为中间任务存储。例如,给出的有关使用 AWS KMS 数据加密密钥创建 Amazon Redshift 目标端点的示例使用此默认 S3 存储桶(请参阅用于数据加密的 KMS 密钥设置)。

您可以通过在 AWS CLI create-endpoint 命令的 --redshift-settings 选项值中包含以下参数来为此中间存储指定自定义 S3 存储桶:

  • BucketName – 代表您指定的 S3 存储桶存储名称的字符串。如果您的服务访问角色基于 AmazonDMSRedshiftS3Role 策略,则此值的前缀必须为 dms-,例如 dms-my-bucket-name

  • BucketFolder –(可选)代表指定 S3 存储桶中存储文件夹名称的字符串。

  • ServiceAccessRoleArn – 允许对 S3 存储桶进行管理访问的 IAM 角色的 ARN。通常,您将根据 AmazonDMSRedshiftS3Role 策略创建此角色。有关示例,请参阅 创建 AWS KMS 密钥并使用该密钥对 Amazon Redshift 目标数据进行加密 中关于创建具有所需 AWS 托管策略的 IAM 角色的过程。

    注意

    如果您使用 create-endpoint 命令的 --service-access-role-arn 选项指定其他 IAM 角色的 ARN,则此 IAM 角色选项优先。

以下示例显示了如何使用这些参数通过使用 AWS CLI 在以下 create-endpoint 调用中指定自定义 Amazon S3 存储桶。

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 '{"ServiceAccessRoleArn": "your-service-access-ARN", "BucketName": "your-bucket-name", "BucketFolder": "your-bucket-folder-name"}'

Amazon Redshift 的多线程任务设置

您可以使用多线程任务设置提高 Amazon Redshift 目标端点的完全加载和更改数据捕获 (CDC) 任务的性能。为此,您可以指定并发线程的数量和要存储在缓冲区中的记录数。

Amazon Redshift 的多线程完全加载任务设置

要提高完全加载性能,您可以使用以下 ParallelLoad* 任务设置:

  • ParallelLoadThreads – 指定 DMS 在完全加载期间用于将数据记录推送到 Amazon Redshift 目标端点的并发线程数。默认值为零 (0),最大值为 32。有关更多信息,请参阅完全加载任务设置

    使用 ParallelLoadThreads 任务设置时,可以使用设置为 falseenableParallelBatchInMemoryCSVFiles 属性。该属性通过让 DMS 写入磁盘而不是内存来提高大型多线程完全加载任务的性能。默认值为 true

  • ParallelLoadBufferSize – 指定使用以 Redshift 为目标且使用并行加载线程时的最大数据记录请求量。默认值是 100,最大值是 1,000。建议您在 ParallelLoadThreads > 1(大于 1)时使用此选项。

注意

在 AWS DMS 版本 3.4.5 及更高版本中,支持在完全加载到 Amazon Redshift 目标端点期间使用 ParallelLoad* 任务设置。

不支持在更改数据捕获 (CDC) 期间或启用并行加载的完全加载迁移任务期间使用 ReplaceInvalidChars Redshift 端点设置。如果未启用并行加载,则支持完全加载迁移。有关更多信息,请参阅《AWS Database Migration Service API 参考》中的 RedshiftSettings

Amazon Redshift 的 CDC 任务设置

要提高 CDC 性能,您可以使用以下 ParallelApply* 任务设置:

  • ParallelApplyThreads – 指定 AWS DMS 在 CDC 加载期间用于将数据记录推送到 Amazon Redshift 目标端点的并发线程数。默认值为零 (0),最大值为 32。建议的最小值等于集群中的切片数。

  • ParallelApplyBufferSize – 指定使用以 Redshift 为目标的并行应用线程时的最大数据记录请求量。默认值是 100,最大值是 1,000。建议您在 ParallelApplyThreads > 1(大于 1)时使用此选项。

    为了在将 Redshift 作为目标时获得最大收益,我们建议 ParallelApplyBufferSize 的值至少为 ParallelApplyThreads 数量的两倍(乘以二或更多)。

注意

在 AWS DMS 版本 3.4.3 及更高版本中,支持在 CDC 到 Amazon Redshift 目标端点期间使用 ParallelApply* 任务设置。

应用的并行度级别取决于总批量大小与用于传输数据的最大文件大小之间的相关性。将多线程 CDC 任务设置与 Redshift 目标一起使用时,当批量大小相对于最大文件大小而言较大时,可以获得好处。例如,您可以使用以下端点和任务设置组合,进行调整以获得最佳性能。

// Redshift endpoint setting MaxFileSize=250000; // Task settings BatchApplyEnabled=true; BatchSplitSize =8000; BatchApplyTimeoutMax =1800; BatchApplyTimeoutMin =1800; ParallelApplyThreads=32; ParallelApplyBufferSize=100;

通过使用前一个示例中的设置,事务工作负载繁重的客户会通过批处理缓冲区受益,其中包含 8000 条记录、可在 1800 秒内装满、使用 32 个并行线程且最大文件大小为 250 MB。

有关更多信息,请参阅更改处理优化设置

注意

在持续复制到 Redshift 集群期间运行的 DMS 查询可以与正在运行的其他应用程序查询共享相同的 WLM(工作负载管理)队列。因此,请考虑正确配置 WLM 属性,以避免其在持续复制到 Redshift 目标期间影响性能。例如,如果正在运行其他并行 ETL 查询,则 DMS 的运行速度会变慢,就会失去性能增益。

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,则视 Redshift 目标列类型而定,为以下之一:

TIMESTAMP (s)

TIMESTAMPTZ (s) – 如果源时间戳包含时区偏移(例如在 SQL Server 或 Oracle 中),则它会在插入/更新时转换为 UTC。如果它不包含偏移量,则时间已经以 UTC 为单位考虑。

如果小数位数 => 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–65,535,请使用 VARCHAR(以字节为单位的长度)

如果长度为 65,536–2,147,483,647,请使用 VARCHAR (65535)

UINT1

INT2

UINT2

INT2

UINT4

INT4

UINT8

NUMERIC (20,0)

WSTRING

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

如果长度为 65,536–2,147,483,647,请使用 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。

使用 AWS DMS 并将 Amazon Redshift Serverless 作为目标

AWS DMS 支持使用 Amazon Redshift Serverless 作为目标端点。有关使用 Amazon Redshift Serverless 的信息,请参阅 Amazon Redshift 管理指南中的 Amazon Redshift Serverless

本主题介绍如何将 Amazon Redshift Serverless 端点与 AWS DMS 配合使用。

注意

创建 Amazon Redshift Serverless 端点时,对于 RedshiftSettings 端点配置的 DatabaseName 字段,使用 Amazon Redshift 数据仓库的名称或工作组端点的名称。对于 ServerName 字段,使用无服务器集群的工作组页面显示的 Endpoint 值(例如,default-workgroup.093291321484.us-east-1.redshift-serverless.amazonaws.com)。有关创建端点的信息,请参阅创建源和目标终端节点。有关工作组端点的信息,请参阅连接到 Amazon Redshift Serverless

以 Amazon Redshift Serverless 作为目标时的信任策略

使用 Amazon Redshift Serverless 作为目标端点时,您必须在信任策略中添加以下突出显示的部分。该信任策略已附加到 dms-access-for-endpoint 角色。

{ "PolicyVersion": { "CreateDate": "2016-05-23T16:29:57Z", "VersionId": "v3", "Document": { "Version": "2012-10-17", "Statement": [ { "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeAvailabilityZones", "ec2:DescribeInternetGateways", "ec2:DescribeSecurityGroups", "ec2:DescribeSubnets", "ec2:DescribeVpcs", "ec2:DeleteNetworkInterface", "ec2:ModifyNetworkInterfaceAttribute" ], "Resource": "arn:aws:service:region:account:resourcetype/id", "Effect": "Allow" }, { "Sid": "", "Effect": "Allow", "Principal": { "Service": "redshift-serverless.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }, "IsDefaultVersion": true } }

有关在 AWS DMS 中使用信任策略的更多信息,请参阅创建要与 AWS CLI 和一起使用的IAM角色 AWS DMS API

将 Amazon Redshift Serverless 作为目标时的限制

使用 Redshift Serverless 作为目标存在以下限制: