为什么 AWS DMS 任务中的源筛选条件不再运作?

3 分钟阅读
0

我想了解如何在 AWS Database Migration Service (AWS DMS) 任务中的源筛选条件无法正常运作时进行故障排查和修复问题。

解决方法

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

大多数 AWS DMS 源都支持源筛选。但是,兼容 MongoDB 的 MongoDBAmazon DocumentDB 不支持源筛选功能。有关更多信息,请参阅 Sources for data migration

以下限制可能会影响源筛选:

  • 筛选器不计算从右到左的语言的列。
  • 无法对大型对象 (LOB) 列应用筛选器。
  • 只能将筛选器应用于创建后无法更新的固定列。如果将源筛选器应用于可以在创建后更新的固定列,则源筛选器可能不起作用。

对满负荷时无法正常工作的筛选器进行故障排查

确定源过滤不起作用的阶段。

如果源代码筛选在满负荷期间不起作用,请执行以下步骤:

  • 确认映射规则中的字母大小写与源引擎相匹配。
  • 筛选日期数据类型时,使用 AWS DMS 要求的格式。
  • 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) 语句上,例如 UPDATESDELETES。确保在源表上充分开启日志记录。

要分配额外的日志记录,请使用 Oracle、PostgreSQL 或 Microsoft SQL Server 中的一个。

Oracle

Oracle 使用补充日志记录在表列上添加其他日志。如果筛选的列不是主键列,请激活该列和主键列的补充日志记录。

以下示例复制了一个名为 TEST.LOGGING 的表,该表具有主键 ID,NAME 上有一个筛选器。要创建日志组补充日志记录,请运行以下命令:

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 设置为 DEFAULT 时,PostgreSQL 会在预写日志 (WAL) 中记录主键列的旧值。但是,使用非主键列时,默认的日志记录级别可能不足以进行删除。

确保 AWS DMS 任务使用的插件已设置为以下一种属性:

如果使用 test_decoding,请将 REPLICA IDENTITY 设置为 FULL

ALTER TABLE tablename REPLICA IDENTITY FULL;

**注意:**如果未将 REPLICA IDENTITY 设置为 FULL,则 AWS DMS 可能会将所有删除内容发送到目标表。

如果使用 pglogical,请先将表添加到复制集,再将 REPLICA IDENTITY 设置为 FULL

ALTER TABLE tablename REPLICA IDENTITY FULL;

**注意:**将 REPLICA IDENTITY 设置为 FULL 时,pglogical 会包含一个限制,因此无法向复制集添加表。还可以增加在源数据库上生成的 WAL 日志的数量。当 WAL 日志数量增加时,所有列都将被记录至到 WAL。

Microsoft SQL Server

检查是否满足以下开启 MS-CDC 需满足的 AWS DMS CDC 日志记录要求。

对于每个有主键的表,运行以下查询:

exec sys.sp_cdc_enable_table
@source_schema = N'schema_name',
@source_name = N'table_name',
@role_name = NULL,
@supports_net_changes = 1
GO

**注意:**上述查询是基于云的源所必需的。

对于每个具有唯一键但没有主键的表,运行以下查询:

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-Replication,则无需运行前面的查询。

对于每个没有主键或唯一键的表,运行以下查询:

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 系统变量会控制二进制日志中的行映像。有关更多信息,请参阅 MySQL 网站上的 binlog_row_image。根据 AWS DMS 的要求,请将 binlog_row_image 设置为 FULL,将 binlog_format 设置为 ROW

MySQL 会记录前映像和后映像中的所有列。要确认二进制日志中的最大日志记录级别,必须在源数据库上将 binlog_row_image 设置为 FULL

相关信息

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

Using table mapping to specify task settings

Using source filters

AWS 官方
AWS 官方已更新 10 个月前