AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
为什么 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。
相关信息
- 语言
- 中文 (简体)
