为什么我的 AWS DMS 任务中的源筛选条件未能正常运作?

3 分钟阅读
0

我已经在 AWS Database Migration Service(AWS DMS)任务上配置源筛选条件,但它们未正常运作。如何排查 AWS DMS 任务上的源筛选条件问题?

简短描述

有多种原因可能导致 AWS DMS 任务上的源筛选条件无法如预期运作。例如,您正在使用的引擎可能不支持使用源筛选条件。或者,您可能受该功能的一或多项限制影响。

解决方法

检查您的引擎是否支持源筛选功能

尽管大多数 AWS DMS 源都支持源筛选,但有些源(例如 MongoDB 或 Amazon DocumentDB)不支持此功能。查看有关数据迁移源的 AWS DMS 文档,以确认您使用的源引擎是否存在限制。

查看 AWS DMS 源筛选限制

与源筛选有关的限制有多种。查看这些限制,以确定您是否正确地使用该功能:

  • 筛选条件不会计算从右到左语言的列。
  • 筛选条件无法应用到大型对象(LOB)列上。
  • 筛选条件可被应用到创建后不会更新的不可变列。如果您将源筛选应用到创建后可更新的可变列,则源筛选可能无法如预期运作。

排查筛选在满负载时停止运作的问题

如果问题依然存在,请检查源筛选会在哪个阶段停止运作。

若筛选在满负载时不正常运作,请执行以下步骤:

1.    确认映射规则中任何字母的大小写(区分大小写)与源引擎匹配。例如,默认情况下,Oracle 和 DB2 中的对象名称均为大写。类似地,PostgreSQL 中的对象名称都是小写。确保您在筛选条件中使用的列符合您的源引擎的任何大小写要求。

2.    当使用日期数据类型进行筛选时,检查您正在使用 AWS DMS 所要求的格式。例如,AWS DMS 使用 YYYY-MM-DD 日期格式和 YYYY-MM-DD HH:MM:SS 时间格式进行筛选。

3.    在 SOURCE_UNLOAD 的首次日志记录级别重现问题。然后,获取 AWS DMS 为上传数据而在源上运行的查询。这是源 Oracle 表筛选问题的示例。

表详情如下:

CREATE TABLE DMS.FILTERS
( ID NUMBER(10) NOT NULL,
  ENTRY_DATE DATE,
  CONSTRAINT FILTERS_PK PRIMARY KEY (ID)
);

SQL> SELECT * FROM FILTERS;
  ID       ENTRY_DATE
---------- ---------
         1 01-JAN-22
         2 01-JUN-22
         3 01-JAN-21
         4 01-JUN-21
         5 01-JAN-20
         6 01-JUN-20

使用仅复制 ENTRY_DATE 大于或等于 01/01/2022 的行的映射规则创建的 AWS DMS 任务:

{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "893662253",
      "rule-name": "893662253",
      "object-locator": {
        "schema-name": "DMS",
        "table-name": "FILTERS"
      },
      "rule-action": "include",
      "filters": [
        {
          "filter-type": "source",
          "column-name": "ENTRY_DATE",
          "filter-conditions": [
            {
              "filter-operator": "gte",
              "value": "01/01/2022"
            }
          ]
        }
      ]
    }
  ]
}

因此,不会复制任何记录,而且任务日志显示这些错误:

01786264: 2022-06-22T10:36:53 [SOURCE_UNLOAD   ]E:  ORA-01843: not a valid month  [1020417]  (oracle_endpoint_unload.c:171)

由于已为 SOURCE_UNLOAD 开启调试日志,任务日志显示 AWS DMS 在源数据库上运行的确切的查询:

1786264: 2022-06-22T10:36:53 [SOURCE_UNLOAD   ]D:  Select statement for UNLOAD is 'SELECT "ID","ENTRY_DATE"  FROM "DMS"."FILTERS" WHERE ((("ENTRY_DATE" >= TO_DATE('0000-00-00','YYYY-MM-DD'))))'  (oracle_endpoint_utils.c:1979)

在日志输出中,您可以看到 AWS DMS 在源数据库上运行此查询:

SELECT "ID","ENTRY_DATE"  FROM "DMS"."FILTERS" WHERE ((("ENTRY_DATE" >= TO_DATE('0000-00-00','YYYY-MM-DD'))));

AWS DMS 不识别映射规则中提供的日期,因为它与 AWS DMS 预期的日期格式不匹配。所以,要修改映射规则来匹配预期的日期格式:

{
                            "filter-operator": "gte",
                            "value": "2022-01-01"
                        }

排查筛选在 CDC 时停止运作的问题

**注意:**仅将筛选条件应用到创建后不会更新的不可变列。添加筛选到可变列可能会导致意外结果。

如果在筛选中使用不可变列,您可能注意到筛选问题仅在 CDC 阶段发生。而且,这些问题可能只发生在特定 DML 语句上,如 UPDATES 或 DELETES。在这种情况下,确保您已在源表上启用充分日志记录。根据您正在使用的引擎,按以下操作分配更多日志记录:

Oracle

Oracle 使用补充日志记录在表列上添加更多日志。如果您筛选的列不是主键列,请确保为该列和主键列激活补充日志记录。

此示例会复制名为 TEST.LOGGING,而且在 NAME 列上有主键 ID 和筛选的表。运行与下列命令类似的命令来创建日志组补充日志记录:

ALTER TABLE TEST.LOGGING ADD SUPPLEMENTAL LOG GROUP TEST_LOG_GROUP (ID, NAME) ALWAYS;

如果补充日志记录已添加到表的所有列上(如此例),则您不需要添加更多日志记录。

ALTER TABLE TableName ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

PostgreSQL

PostgreSQL 使用 REPLICA IDENTITY 属性来配置表的日志记录级别。当 REPLICA IDENTITY 被设置为默认值时,PostgreSQL 会记录 WAL 日志中主键列的旧值。但是,如果您在筛选中使用非主键列,默认的日志记录级别可能对 DELETES 来说并不充分。在这种情况下,根据 AWS DMS 任务使用的插件执行以下步骤:如果使用 test_decoding:

在表上将 REPLICA IDENTITY 设置为 full。如果您未完成此步骤,则 AWS DMS 可能向目标表发送所有 deletes:

ALTER TABLE tablename REPLICA IDENTITY FULL;

如果使用 pglogical:

添加表到复制集以后,将 REPLICA IDENTITY 设置为 full。这是因为 pglogical 有限制,会防止当 REPLICA IDENTITY 设置为 full 时表被添加到复制集。

ALTER TABLE tablename REPLICA IDENTITY FULL;

**注意:**在表上将 REPLICA IDENTITY 设置为 full 会增加在源数据库上生成的 WAL 日志的数量。发生这种情况的原因是,所有列会在之后记录到 WAL。

SQL Server

如果您使用 SQL Server,请检查是否满足所有 AWS DMS CDC 先决条件,特别是以下日志记录要求:

  • 对于有主键的每个表,运行此查询以启用 MS-CDC: 注意:如果 MS-Replication 已被用于本地源,则跳过此步骤。此步骤对于基于云的源是必需的。
exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@role_name = NULL,
@supports_net_changes = 1
GO
  • 运行此查询,为有唯一键,但没有主键的每个表开启 MS-CDC。注意:本地和基于云的源均要求执行此步骤。
exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@index_name = N'unique_index_name',
@role_name = NULL,
@supports_net_changes = 1
GO
  • 运行此查询,为没有主键或唯一键的每个表启用 MS-CDC。 注意:本地和基于云的源均要求执行此步骤。
exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@role_name = NULL
GO

MySQL

在 MySQL 中,二进制日志中的行映像受 binlog_row_image 系统变量控制。AWS DMS 要求 binlog_row_image 被设置为 full,binlog_format 被设置为 ROW。这意味着 MySQL 会记录前映像和后映像中的所有列。因此,请确保在源数据库上将 binlog_row_image 设置为 full,以确认二进制日志中的最大日志记录级别。


相关信息

如何在 AWS DMS 任务中使用源筛选条件?

使用表映射指定任务设置

使用源筛选条件

AWS 官方
AWS 官方已更新 2 年前
没有评论