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

AWS Database Migration Service 的最佳实践

要想尽可能高效地使用 AWS Database Migration Service (AWS DMS),请参阅此部分中有关以最有效方式迁移数据的建议。

改进 AWS DMS 迁移的性能

AWS DMS 迁移的性能受多种因素影响:

  • 源上的资源可用性

  • 可用的网络吞吐量

  • 复制服务器的资源容量

  • 目标接收更改的能力

  • 源数据的类型和分布

  • 要迁移的对象数量

在我们的测试中,使用单个 AWS DMS 任务时,在理想条件下,迁移 1 TB 数据大约需要 12 到 13 个小时。这些理想的条件包括使用在 Amazon EC2 上运行的源数据库,目标数据库位于 Amazon RDS 上,这些数据库均在同一可用区中。我们的源数据库颇具代表性,其中包含相对均匀分布的数据,只有少量大型表,包含最多 250 GB 数据。源数据不包含复杂数据类型,例如 LOB 数据。

可以使用下面所述的部分或全部最佳实践来改进性能。是否使用这些实践之一在很大程度上取决于您的特定使用案例。我们会相应地说明限制。

并行加载多个表

默认情况下,AWS DMS 一次加载八个表。在使用非常大的复制服务器时,例如 dms.c4.xlarge 或更大的实例,您可以稍微提升此值来实现一些性能改进。但是,某些时候增加此并行度会降低性能。如果您的复制服务器相对较小,例如 dms.t2.medium,则建议您减少并行加载的表数量。

要在 AWS 管理控制台中更改此数量,请打开控制台,选择 Tasks (任务),再选择创建或修改任务,然后选择 Advanced Settings (高级设置)。在 Tuning Settings (优化设置) 下,更改 Maximum number of tables to load in parallel (并行加载的最大表数) 选项。

要使用 AWS CLI 更改此数,请更改 TaskSettings 下的 MaxFullLoadSubTasks 参数。

使用索引、触发器和引用完整性约束

索引、触发器和引用完整性约束可能会影响您的迁移性能,并导致迁移失败。它们具体如何影响迁移取决于您的复制任务是完全加载任务还是持续复制 (CDC) 任务。

对于完全加载任务,建议您删除主键索引、二级索引、引用完整性约束和数据操作语言 (DML) 触发器。或者,您也可以将其创建延迟到完全加载任务完成之后。完全加载任务期间不需要索引,如果存在索引,则会导致维护开销。由于完整加载任务一次加载一组表,这会违反引用完整性约束。同样,插入、更新和删除触发器会导致错误,例如,以前批量加载的表会触发行插入。由于增加了处理量,其他类型的触发器也会影响性能。

如果数据量相对较小并且不担心额外增加的迁移时间,您可以在完全加载任务之前生成主键和二级索引。引用完整性约束和触发器应始终禁用。

对于完全加载 + CDC 任务,建议您在 CDC 阶段之前添加二级索引。由于 AWS DMS 使用逻辑复制,应该采用支持 DML 操作的二级索引来防止全表扫描。您可以在 CDC 阶段之前暂停复制任务以构建索引、创建触发器和创建引用完整性约束,然后重新启动任务。

禁用备份和事务日志记录

迁移到 Amazon RDS 数据库时,在您准备好切换之前,最好禁用目标上的备份和多可用区。类似地,迁移到非 Amazon RDS 系统时,通常最好禁用目标上的任何日志记录,直到完成切换。

使用多个任务

有时候,为单个迁移使用多个任务可以提升性能。如果您有一组不参与到通用事务的表,也许可将迁移拆分为多个任务。 在一个任务中将维护事务一致性,因此独立任务中的表不参与到通用事务中非常重要。此外,每个任务独立读取事务流,因此请注意,不要对源数据库施加过多压力。

您可以使用多个任务创建多个单独的复制流,对源上的读取、复制实例上的流程以及目标数据库的写入实现并行处理。

优化更改处理

默认情况下,AWS DMS 在事务模式下处理更改,这可保护事务完整性。如果您可以承受事务完整性的临时失效,可以改为使用批量优化应用 选项。该选项有效分组事务并批量应用,以实现提高效率的目的。使用批量优化应用选项几乎总是会违反某些引用完整性约束,因此在迁移期间,您应禁用这些约束,在切换过程中重新启用。

选择复制实例的最优大小

如何选择合适的复制实例取决于与您的使用案例相关的多种因素。为帮助您了解如何使用复制实例资源,请参阅以下讨论。其中涵盖了完全加载 + CDC 任务的常见场景。

在完整的加载任务中,AWS DMS 逐个加载表。默认情况下,一次加载八个表。AWS DMS 在完整加载任务期间捕获对源的持续更改,因此以后可在目标终端节点上应用更改。更改缓存在内存中;如果可用内存用完,则将更改缓存到磁盘上。表的完全加载任务完成后,AWS DMS 立即将缓存的更改应用到目标表。

在应用表的所有未完成的缓存更改后,目标终端节点将处于事务一致状态。此时,目标与源终端节点就最后的缓存更改而言同步。然后,AWS DMS 开始在源和目标之间进行持续复制。为此,AWS DMS 从源事务日志获取更改操作,并按照事务一致的方式将其应用到目标 (假设未选择批量优化应用)。如果可能,AWS DMS 会通过复制实例上的内存流式传输持续更改。否则,AWS DMS 会将更改写入到复制实例上的磁盘,直至可在目标上应用。

您对复制实例如何应对更改处理以及在该流程中如何使用内存有一定的控制能力。有关如何优化更改处理的更多信息,请参阅更改处理优化设置

从上面的说明中,您可以看到可用内存总量是一个关键考虑事项。如果复制实例具有足够的内存,使 AWS DMS 可以流式处理缓存的更改和持续更改,而无需写入磁盘中,则会大幅提升迁移性能。类似地,为复制实例配置足够的磁盘空间来容纳更改缓存和日志存储也可提高性能。可能的最大 IOPs 取决于选定的磁盘大小。

选择复制实例类和可用磁盘存储时,需要考虑以下因素:

  • 表大小 – 大型表加载所需的时间较长,因此这些表上的事务必须缓存到表加载之后。表加载之后将立即应用这些缓存的事务,不再保存在磁盘上。

  • 数据操控语言 (DML) 活动 – 忙碌的数据库会生成更多事务。这些事务必须缓存直至表加载。在加载表之后,单独表的事务将在所有表加载之后应用。

  • 事务大小 – 长时间运行的事务会生成大量的更改。如果 AWS DMS 在事务模式中应用更改,则必须有足够的内存可用于流式处理事务中的所有更改,以实现最佳性能。

  • 迁移的总大小 – 大型迁移用时较长,并且相应地生成大量的日志文件。

  • 任务数 – 任务越多,所需的缓存也越多,生成的日志文件也越多。

  • 大型对象 – 具有 LOB 的表需要更长时间来加载。

经验证据表明,在 AWS DMS 所需的空间中,日志文件占了大部分。默认存储配置通常便已足够。

但是,运行多个任务的复制实例可能需要更多磁盘空间。此外,如果您的数据库包括大型活动表,在完全加载任务期间,您需要考虑为缓存到磁盘的事务增加磁盘空间。例如,如果您的加载用时 24 小时,每小时会生成 2GB 的事务,您可能要确保有 48GB 的空间来容纳缓存的事务。此外,向复制实例分配的存储空间越多,获得的 IOPS 就越高。

前面的准则并未涵盖所有可能的场景。在确定复制实例的大小时,考虑特定使用案例的具体细节非常重要。开始运行迁移之后,请监控 CPU、可释放内存、空闲存储以及复制实例的 IOPS。根据您收集的数据,您可以视根据增加或减小复制实例的大小。

减少源数据库上的工作负载

AWS DMS 使用源数据库上的一些资源。在完整加载任务期间,AWS DMS 对并行处理的每个表执行源表的完整表扫描。此外,您在迁移中创建的各个任务会在 CDC 过程中查询源中的更改。要使 AWS DMS 对一些源 (例如 Oracle) 执行 CDC,您可能需要增加写入到数据库更改日志中的数据量。

如果您发现对源数据库造成的负担过重,可以减少迁移中的任务数或每个任务的表数量。每个任务独立获取源更改,因此整合任务可以减少更改捕获工作负载。

使用任务日志以排除迁移问题

在某些情况下,AWS DMS 会遇到一些仅在任务日志中显示警告或错误消息的问题。具体而言,数据截断问题或者外键违规造成的行拒绝仅会写入任务日志。因此,在迁移数据库时务必要查看任务日志。要允许查看任务日志,请在创建任务过程中配置 Amazon CloudWatch。

转换架构

AWS DMS 不执行架构或代码转换。如果要将现有架构转换为不同的数据库引擎,您可以使用 AWS Schema Conversion Tool (AWS SCT)。AWS SCT 将源对象、表、索引、视图、触发器和其他系统对象转换为目标数据定义语言 (DDL) 格式。您还可以使用 AWS SCT 将大部分应用程序代码 (例如 PL/SQL 或 TSQL) 转换为对等的目标语言。

您可以通过从 AWS 免费下载来获取 AWS SCT。有关 AWS SCT 的更多信息,请参阅 AWS Schema Conversion Tool 用户指南

如果您的源和目标终端节点位于同一数据库引擎上,则可以使用 Oracle SQL Developer、MySQL Workbench 或 PgAdmin4 等工具来移动架构。

迁移大型二进制对象 (LOB)

通常,AWS DMS 分两个阶段迁移 LOB 数据。

  1. AWS DMS 会在目标表中创建一个新行,并用除相关 LOB 值之外的所有数据来填充该行。

  2. AWS DMS 使用 LOB 数据更新目标表中的行。

LOB 的这种迁移过程要求,在迁移期间,目标表上的所有 LOB 列都必须可为空。即使源表上的 LOB 列不可为空,也是如此。如果 AWS DMS 创建目标表,默认情况下会将 LOB 列设置为可为空值。如果您使用其他机制创建目标表,例如导入或导出,则在启动迁移任务之前,必须确保 LOB 列可为空值。

此要求有一个例外情况。假设您执行从 Oracle 源到 Oracle 目标的同类迁移,并且您选择 Limited Lob mode (受限 LOB 模式)。在这种情况下,将一次填充整行,包括任何 LOB 值。对于此类情况,如果需要,AWS DMS 可以使用不可为空的约束创建目标表 LOB 列。

使用受限 LOB 模式

当迁移包含 LOB 值时,AWS DMS 使用两种方法来平衡性能与简便性。

  • Limited LOB mode (受限 LOB 模式) 迁移所有最大为用户指定的大小限制 (默认为 32 KB) 的 LOB 值。大于此大小限制的 LOB 值必须手动迁移。Limited LOB mode (受限 LOB 模式) 是所有迁移任务的默认值,通常提供最佳性能。不过,您需要确保 Max LOB size (最大 LOB 大小) 参数设置正确。该参数应设置为所有表的最大 LOB 大小。

  • Full LOB mode (完整 LOB 模式) 迁移表中的所有 LOB 数据,而不受大小限制。Full LOB mode (完整 LOB 模式) 提供了移动表中所有 LOB 数据的便利性,不过该过程对性能可能会有显著影响。

对于某些数据库引擎(如 PostgreSQL),AWS DMS 处理 JSON 数据类型的方式类似于 LOB。确保如果您选择了 Limited Lob mode (受限 LOB 模式),则将 Max LOB size (最大 LOB 大小) 选项设置为不会导致 JSON 数据被截断的值。

AWS DMS 完全支持使用大对象数据类型 (BLOB、CLOB 和 NCLOB)。以下源终端节点具有完整的 LOB 支持:

  • Oracle

  • Microsoft SQL Server

  • ODBC

以下目标终端节点具有完整的 LOB 支持:

  • Oracle

  • Microsoft SQL Server

以下目标终端节点具有有限的 LOB 支持。对于此目标终端节点,您不能使用无限制的 LOB 大小。

  • Amazon Redshift

对于具有完整 LOB 支持的终端节点,您还可以为 LOB 数据类型设置大小限制。

持续复制

AWS DMS 提供数据的持续复制,确保源数据库与目标数据库的同步。它只复制有限数量的数据定义语言 (DDL)。AWS DMS 不传播索引、用户、权限、存储过程和其他不直接关联到表数据的数据库更改等项目。

如果您计划使用持续复制,则应在创建复制实例时启用 Multi-AZ (多可用区) 选项。通过选择 Multi-AZ (多可用区) 选项可为复制实例提供高可用性和故障转移支持。但是,此选项可能会影响性能。

为 Oracle 目标更改用户和架构

将 Oracle 用作目标时,AWS DMS 假定数据应迁移到连接目标所用的架构和用户。如果您要将数据迁移到其他架构,请使用架构转换来完成此操作。Oracle 中的架构会连接到终端节点连接中使用的用户名。为了从 X 架构中读取并写入目标中的 X 架构,我们需要重命名 X 架构 (从源中读取) 并指示 AWS DMS 将数据写入目标中的 X 架构。

例如,如果您要从用户源架构 PERFDATA 向目标数据 PERFDATA 迁移数据,则需要创建如下所示的转换:

{ "rule-type": "transformation", "rule-id": "2", "rule-name": "2", "rule-action": "rename", "rule-target": "schema", "object-locator": { "schema-name": "PERFDATA" }, "value": "PERFDATA" }

有关转换的更多信息,请参阅 使用 JSON 按表映射指定表选择和转换

提高迁移大型表时的性能

如果希望在迁移大型表时改进性能,您可将迁移过程分解为多个任务。要通过行筛选将迁移分解为多个任务,您可以使用键或分区键。例如,如果您有一个整数主键 ID,范围从 1 到 8000000,您可以使用行筛选创建 8 个任务,每个任务迁移 100 万条记录。

要在 AWS 管理控制台中应用行筛选,请打开控制台,选择 Tasks (任务),然后创建新任务。在 Table mappings (表映射) 部分中,为 Selection Rule (选择规则) 添加一个值。然后可以使用小于或等于、大于或等于、等于或范围条件 (介于两个值之间) 添加列筛选。有关列筛选的更多信息,请参阅 通过控制台按表映射指定表选择和转换

此外,如果您有按照日期分区的大型分区表,您可以根据日期来迁移数据。例如,假设您有一个按月分区的表,并且只更新当前月份的数据。在此情况下,您可以为每个静态的每月分区创建一个完全加载任务,并为当前已更新的分区创建一个完全加载 + CDC 任务。