AWS DMS 작업의 소스 필터 조건이 더 이상 작동하지 않는 이유는 무엇인가요?

5분 분량
0

AWS Database Migration Service(AWS DMS) 작업에서 소스 필터 조건이 제대로 작동하지 않을 때 문제를 해결하고 수정하는 방법을 알아보고 싶습니다.

해결 방법

엔진이 소스 필터링 기능을 지원하는지 확인하기

대부분의 AWS DMS 소스는 소스 필터링을 지원합니다. 그러나 MongoDB 또는 MongoDB 호환성이 있는 Amazon DocumentDB는 소스 필터링 기능을 지원하지 않습니다. 자세한 내용은 데이터 마이그레이션을 위한 소스를 참조하세요.

다음과 같은 제한 사항이 소스 필터링에 영향을 미칠 수 있습니다.

  • 필터는 오른쪽에서 왼쪽으로 쓰는 언어의 열을 계산하지 않습니다.
  • 큰 개체(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 단계에서만 발생합니다. 이 문제는 UPDATES 또는 DELETES와 같은 특정 데이터 조작 언어(DML) 문에서만 발생할 수 있습니다. 소스 테이블에서 충분한 로깅을 설정했는지 확인하세요.

추가 로깅을 할당하려면 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 IDENTITYDEFAULT로 설정하면 프라이머리 키 열의 이전 값을 WAL(미리 쓰기 로그)에 기록합니다. 그러나 프라이머리 키가 아닌 열을 사용하는 경우 기본 로깅 수준으로는 삭제에 충분하지 않을 수 있습니다.

AWS DMS 작업이 다음 속성 중 하나로 설정된 플러그인을 사용하는지 확인하세요.

test_decoding을 사용하는 경우 REPLICA IDENTITYFULL로 설정합니다.

ALTER TABLE tablename REPLICA IDENTITY FULL;

참고: REPLICA IDENTITYFULL로 설정하지 않으면 AWS DMS가 모든 삭제를 대상 테이블로 보낼 수 있습니다.

pglogical를 사용하는 경우 복제 세트에 테이블을 추가한 후 REPLICA IDENTITYFULL로 설정합니다.

ALTER TABLE tablename REPLICA IDENTITY FULL;

참고: REPLICA IDENTITYFULL로 설정하는 경우 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 시스템 변수는 binlog의 행 이미지를 제어합니다. 자세한 내용은 MySQL 웹사이트에서 binlog_row_image를 참조하세요. AWS DMS를 사용하려면 binlog_row_imageFULL로, binlog_formatROW로 설정해야 합니다.

MySQL은 이전 이미지와 이후 이미지의 모든 열을 모두 로깅합니다. 빈로그의 최대 로깅 수준을 확인하려면 binlog_row_imageFULL로 설정해야 합니다.

관련 정보

AWS DMS 작업에서 소스 필터를 사용하려면 어떻게 해야 하나요?

테이블 매핑을 사용하여 작업 설정 지정

소스 필터 사용

AWS 공식
AWS 공식업데이트됨 7달 전