为什么 AWS DMS 任务中的源筛选条件不再运作?
我想了解如何在 AWS Database Migration Service (AWS DMS) 任务中的源筛选条件无法正常运作时进行故障排查和修复问题。
解决方法
检查引擎是否支持源筛选功能
大多数 AWS DMS 源都支持源筛选。但是,兼容 MongoDB 的 MongoDB 或 Amazon 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) 语句上,例如 UPDATES 或 DELETES。确保在源表上充分开启日志记录。
要分配额外的日志记录,请使用 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 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 2 年前