经典案例

  • 首页 经典案例 AWS DMS 大表移动最佳实践及表并行设置 数据库博客

AWS DMS 大表移动最佳实践及表并行设置 数据库博客

2026-01-27 11:45:53

AWS DMS 大型表格移转最佳实践

主要收获

在本篇文章中,我们将探讨如何透过 AWS DMS 效率地迁移大型表格,并使用表格平行载入设置来加速资料迁移过程。AWS DMS 提供的平行载入功能可以大幅减少迁移期间的时间,并帮助解决在数据迁移过程中可能出现的许多挑战。无论是对于相同类型的数据还是异质数据迁移,本篇文章将展示多种最佳实践方法,适用于处理大型数据表的情境。

AWS 数据库迁移服务AWS DMS是一项托管的迁移和复制服务,能够帮助安全地将资料库迁移到 AWS,并且在此过程中保持最低的停机时间和零数据损失。本服务支持同质性或异质性的迁移,能有效应对从数据大小到结构复杂度、时间限制及人力资源的可用性等各种挑战。

数据迁移通常是整体系统迁移的一部分,并需要相当长的时间来估算工作量、进行数据转换及迁移。AWS DMS 能够降低并解决数据迁移过程中的许多潜在挑战,支援大多数关联数据库管理系统,例如 Oracle、PostgreSQL、MySQL、SQL Server、Sybase 和 Db2。迁移大型表格从数百 GB 到数 TB 的表格所需的时间会很长,主要是由于需要处理的数据量和相应的系统资源需求。

在本篇文章中,我们将说明如何通过使用 AWS DMS 的平行载入选项来加快数据库迁移,从而使选定的关联表、视图及集合的数据加载更为高效。

解决方案概述

为了加快数据迁移并提高其效率,我们可以使用平行载入针对选定的关联表、视图和集合进行操作。默认情况下,AWS DMS 允许最多同时处理 8 张表,最多可达 49 张。

本篇文章专注于如何使用多个平行执行绪来加快单个表格的数据加载速度。以下表格总结了我们提出的 AWS DMS 选项:

使用情境AWS DMS 选项迁移表格数据子集原始数据来源过滤完整迁移带分区的表格自动分区的平行载入迁移带子分区的分区表格自动子分区的平行载入迁移带子分区的选定分区表格分区列表和自动子分区的平行载入迁移选定分区的表格分区列表的平行载入设置迁移未分区的表格使用范围选项的平行载入设置

这篇文章中讨论的解决方案适用于所有支援的资料库;不过,为了便于说明,我们使用 Oracle 数据库作为示范。

AWS DMS 对于处理表格分区的平行进程限制为 49,这意味著在任意时候,它可以同时处理最多 49 个表格分区。您可以在 AWS DMS 控制台的高级任务设置部分进行管理。

另外,您也可以在 JSON 格式的 FullLoadSettings 下使用 MaxFullLoadSubTasks 参数。

AWS DMS 大表移动最佳实践及表并行设置 数据库博客

接下来的几节中,我们将探讨一个迁移大小为 1 TB 的大型表格的案例,并讨论在使用 AWS DMS 进行数据迁移时的选择、挑战和建议。这些选项仅适用于完全加载的迁移。

前置条件

开始之前,您需要以下前提条件:

一个有效的 AWS 帐户一个来源资料库和一个目标资料库一个具有指定来源和目标端点的 AWS DMS 复制实例一个具有 124 个每日分区的表格,每个分区有 256 个子分区

以下文件包含了我们案例中的 Oracle 表格定义。

表格定义

原始数据来源过滤

AWS DMS 提供过滤器选项,可以通过创建 WHERE 子句来限制行并将巨大表格拆分为多个部分。您可以使用 WHERE 子句创建多个任务,这些任务可以独立运行并并行执行。

例如,我们的表格 TESTPART 有 124 个每日分区,每个分区有 256 个子分区。我们需要找出一个高效的过滤器来拆分表格。通常,按相同数量的行进行拆分是个不错的选择。对于 TESTPART 表格,COBDate 符合条件,因为它能够均匀划分行数。

银河加速器

表格资料迁移的状态可以从表格统计中查看。

下图显示了来自 AWS DMS 任务日志的表格日志示例。

原始数据来源过滤只选择了来源表格的一部分数据,并且仅有一个子任务正在进行加载。

截至目前,AWS DMS 的平行处理选项未支持与原始数据来源过滤的结合。如果提供过滤器及平行处理,则将首先执行平行处理,然后才会应用过滤器。这将不会在应用原始过滤器时产生预期结果。

为了检测这一点,让我们试著在子分区上使用过滤器。在以下示例中,我们选择了三个每日分区,每个分区有 256 个子分区:

json{ rules [ { ruletype transformation ruleid 201797580 rulename 201797580 ruletarget schema objectlocator { schemaname SAMPLE } ruleaction rename value TEST2 oldvalue null } { ruletype selection ruleid 1 rulename 1 objectlocator { schemaname SAMPLE tablename TESTPART } ruleaction include filters [ { filtertype source columnname COBDATE filterconditions [ { filteroperator between startvalue 20220816 endvalue 20220818 } ] } ] } { ruletype tablesettings ruleid 2 rulename 2 objectlocator { schemaname SAMPLE tablename TESTPART } parallelload { type subpartitionsauto } } ]}

完成全量加载后,日志显示 49 个子任务已启动,AWS DMS 正在扫描 31744 个段 (124 个分区,每个分区包含 256 个子分区)。

AWS DMS 先扫描每个子分区,然后再应用原始过滤规则,这在加载大型表格时可能会耗费时间。

如需仅迁移数据子集,建议使用原始数据过滤器。

自动分区的平行载入

当您拥有所有分区的数据并希望迁移完整的表格数据时,partitionsauto 选项可能是个不错的选择。AWS DMS 会扫描每个段,并根据 AWS DMS 任务设置 maxfullloadsubtasks 的设置来平行加载 49 个段。请参见以下代码:

json{ rules [ { ruletype transformation ruleid 201797580 rulename 201797580 ruletarget schema objectlocator { schemaname SAMPLE } ruleaction rename value TEST2 oldvalue null } { ruletype selection ruleid 1 rulename 1 objectlocator { schemaname SAMPLE tablename TESTPART } ruleaction include } { ruletype tablesettings ruleid 2 rulename 2 objectlocator { schemaname SAMPLE tablename TESTPART } parallelload { type partitionsauto } } ]}

此选项因为会自动分区并内部使用平行处理,从而提供了性能优势。在下图中,49 条执行绪在 49 个分区上工作,并把数据加载到目标中。

以下截图展示了迁移日志。

当您需要迁移分区位于来源系统的巨大表格数据时,我们建议使用自动分区的平行载入。

自动子分区的平行载入

如果您有有限的分区且每个分区有多个子分区,则 subpartitionsauto 选项可能是个不错的选择。当您仅希望平行迁移特定子分区时,此选项十分适用。在此用例中,AWS DMS 的平行载入设置将平行加载子分区。以下是代码示例:

json{ rules [ { ruletype transformation ruleid 201797580 rulename 201797580 ruletarget schema objectlocator { schemaname SAMPLE } ruleaction rename value TEST2 oldvalue null } { ruletype selection ruleid 1 rulename 1 objectlocator { schemaname SAMPLE tablename TESTPART } ruleaction include } { ruletype tablesettings ruleid 2 rulename 2 objectlocator { schemaname SAMPLE tablename TESTPART } parallelload { type subpartitionsauto } } ]}

AWS DMS 扫描每个子分区 (31744) 并根据我们在 maxfullloadsubtask 中提供的任务设置来平行加载 49 个段。

以下截图显示了我们的日志和表格统计。

当您需要迁移具有有限分区且在来源系统每个分区中有大量子分区的巨大表格数据时,我们建议使用自动子分区的平行载入。

使用 partitionlist 和 subpartitionsauto 的平行载入

您可以使用 partitionlist 和 subpartitionsauto 来迁移特定分区数据,这些分区中包含有大量子分区。当您仅希望平行迁移仅选择的子分区时,此选项十分适用。在这种情况下,AWS DMS 的平行载入设置将平行加载子分区。在以下代码示例中,您可以使用以下查询来查找子分区名称:

sqlSELECT subpartitionname FROM dbatabsubpartitions WHERE tablename=TESTPART AND tableowner=SAMPLE AND PARTITIONNAME=P20220816

将查询的输出放入表格映射的 subpartitions 部分,以下范例中基于我们的案例包含了 256 个 subpartitions:

json{ rules [ { ruletype transformation ruleid 201797580 rulename 201797580 ruletarget schema objectlocator { schemaname SAMPLE } ruleaction rename value TEST2 oldvalue null } { ruletype selection ruleid 1 rulename 1 objectlocator { schemaname SAMPLE tablename TESTPART } ruleaction include filters [] } {