如何排查在执行 AWS DMS 任务期间因批量操作失败而导致 Amazon Redshift 切换到逐一模式的原因?

上次更新时间:2019 年 10 月 2 日

我有一个 AWS Database Migration Service (AWS DMS) 任务正在将数据迁移到作为目标的 Amazon Redshift。但是,由于批量操作失败,我的任务更改为逐一模式。如何解决此问题?

简短描述

在任务的变更数据捕获 (CDC) 阶段期间,AWS DMS 使用单线程从源读取变更数据并将变更应用到目标。由于该线程每次只能处理特定数量的事务,因此根据源上的变更速率,有时线程可能无法使目标与源保持同步。这种情况更常出现在 Amazon Redshift 是 AWS DMS 的目标时,因为在 OLAP 引擎中执行提交的代价高昂。默认情况下,AWS DMS 使用批量应用模式成批地处理变更。当使用批量应用模式时,AWS DMS 将执行以下操作:

  1. 批量应用设置控制的批次中收集变更。
  2. 创建包含该批次中对目标实例做出的所有变更的净变更表。 
  3. 利用算法将事务分组,并将其批量应用于目标。

如果将数据复制到 Amazon Redshift 的迁移任务在应用批处理时遇到问题,AWS DMS 不会使整个批处理失败。AWS DMS 将会拆分批次,然后切换到逐一模式以应用事务处理。当 AWS DMS 遇到导致批处理失败的事务时,AWS DMS 会将该事务记录到 Amazon Redshift 目标上的 awsdms_apply_exceptions 表中。然后,AWS DMS 逐一应用批次中的其他事务,直到该批次中的所有事务都应用于目标。最后,AWS DMS 切换回批量应用模式处理新批次,并继续使用批量应用,除非又有批处理失败。

解决方法

您可以检查 AWS DMS 任务日志,以了解批处理是否失败以及 AWS DMS 是否使用逐一模式。每次批处理失败且 AWS DMS 切换到逐一模式时,您将会看到以下日志条目:

消息
[TARGET_APPLY ]I: Bulk apply operation failed.Trying to execute bulk statements in 'one-by-one' mode (bulk_apply.c:2175)

发生这种情况时,AWS DMS 按顺序在目标上应用事务,直到 AWS DMS 遇到批处理中的任何事务发生问题。如果 AWS DMS 遇到问题,则将该事务记录在日志中,您会看到与下面类似的日志条目:

消息
[TARGET_APPLY ]W: Source changes that would have had no impact were not applied to the target database.Refer to the 'awsdms_apply_exceptions' table for details. (endpointshell.c:5984)

注意:默认情况下,awsdms_apply_exceptions 表在公共架构中创建,除非您在 AWS DMS 任务的任务设置中指定了控制表架构

AWS DMS 将事务记录到日志后,即完成了该批次中的所有事务的应用。然后,AWS DMS 再次切换到批量应用,您会在日志中看到与下面类似的消息:

消息
[TARGET_APPLY ]I: Switch back to bulk apply mode (bulk_apply.c:4751)

Amazon Redshift 是经过优化以运行复杂分析查询的 OLAP 数据仓库。但是,从 OLTP 数据库运行事务变更时,Amazon Redshift 性能可能会受到影响。因此,当批量应用失败且 AWS DMS 切换到逐一模式时,您可以看到 AWS DMS 在逐一模式中运行事务的持续时间的目标延迟增加。当 AWS DMS 切换回批量应用后,目标延迟减少。

要解决此问题,请连接到 Amazon Redshift 目标。然后,从 awsdms_apply_exceptions 表获取输出以识别导致批处理失败的查询:

select * from public.awsdms_apply_exceptions order by 4 desc;

找到导致批处理失败的查询(例如,更新冲突或违反约束)后,您可以解决这些冲突以防止任务迁移到逐一模式。