Oracle을 소스로 사용하는 AWS DMS CDC 태스크가 '시퀀스가 존재하지 않음' 메시지가 표시되며 실패하는 이유는 무엇입니까?

최종 업데이트 날짜: 2022년 9월 8일

AWS Database Migration Service(AWS DMS)를 사용하여 온프레미스 또는 Oracle 데이터베이스용 Amazon Relational Database Service(RDS)에서 데이터를 마이그레이션하려고 합니다. AWS DMS 변경 데이터 캡처(CDC) 태스크가 예상대로 실행되지만 다음과 유사한 오류가 표시되며 실패합니다.

'Oracle CDC 최대 재시도 카운터를 초과했습니다(아카이브 로그 시퀀스가 존재하지 않음).'

이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

Oracle 데이터베이스를 마이그레이션 태스크의 소스로 사용하는 경우 AWS DMS는 전체 로드 단계 중에 테이블에서 데이터를 가져옵니다. CDC 단계에서 AWS DMS는 아카이브된 재실행 로그에서 읽습니다. 그런 다음 AWS DMS는 소스 Oracle 데이터베이스에서 재실행 로그를 캡처하고 커밋된 변경 사항만 대상 데이터베이스에 적용합니다.

다음과 같은 시퀀스 로그 오류가 표시될 수 있습니다.

"03980512: 2022-05-23T12:33:11 [SOURCE_CAPTURE ]E: 시퀀스 232488이 있는 아카이브된 재실행 로그가 존재하지 않음, 스레드 1 [1022318] (oradcdc_thread.c:624"

이 오류를 해결하려면 다음 단계를 수행합니다.

1.    소스 Oracle 데이터베이스에서 이 쿼리를 실행하여 소스에 아카이브 로그 시퀀스가 있는지 확인합니다. 예를 들어 다음 쿼리로 재실행 로그 시퀀스 232488을 확인합니다.

select name, dest_id, thread#,
sequence#, archived, applied, deleted, status, first_time, next_time, 
completion_time  from v$archived_log where sequence# =232488;

2.    소스 서버의 아카이브 로그 파일 위치에서 이 명령을 실행합니다. 이 명령으로 아카이브 로그가 물리적으로 존재하는지 확인합니다.

ls -l * 232488*

3.    소스 Oracle 데이터베이스에서 아카이브 로그 대상(log_archive_dest)을 확인합니다.

이 문서의 예에서는 두 가지 근본 원인을 통해 이 오류를 조사합니다.

  • AWS DMS가 잘못된 DEST_ID에서 재실행 로그를 찾고 있음
  • DEL이 YES이고 아카이브 로그 시퀀스가 소스 Oracle에 존재하지 않음

해결 방법

예 1 - AWS DMS가 잘못된 DEST_ID에서 재실행 로그를 찾고 있는 경우

이 오류는 아카이브된 재실행 로그 시퀀스 232488이 소스 Oracle DB에서 누락되었음을 나타냅니다. 소스 Oracle 데이터베이스에서 로그를 삭제하는 경우 이러한 문제가 발생할 수 있습니다. 이로 인해 태스크가 실패합니다.

01788702: 2022-06-07T17:10:31:206453 [SOURCE_CAPTURE  ]D:  Going to 
prepare the statement 'select supplemental_log_data_min, DATABASE_ROLE, 
SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_ALL from v$database'  
(oracle_endpoint_conn.c:114)

01788702: 2022-06-07T17:10:31:209648 [SOURCE_CAPTURE  ]I:  Database role is 'PHYSICAL STANDBY'  (oracle_endpoint_conn.c:139)

1.    소스 데이터베이스에서 다음 쿼리를 실행하여 아카이브 로그 시퀀스 232488이 소스에 있는지 확인합니다.

select name, dest_id, thread#, sequence#, archived, applied, deleted, 
status, first_time, next_time, completion_time  from v$archived_log 
where sequence# in (232488);

출력:

NAME                                             DEST_ID    THREAD#  SEQUENCE# ARC APPLIED   DEL S FIRST_TIM NEXT_TIME COMPLETIO

--------------------------------------------- ---------- ---------- ---------- --- --------- --- - --------- --------- ---------

/orafra/prdsvbo/arc/1_232488_950180179.arc             2          1     232488 YES YES       NO  A 07-JUN-22 07-JUN-22 07-JUN-22

2.    DEL 열을 확인합니다. 이 열에 NO가 표시되면 아카이브 로그 시퀀스가 소스 데이터베이스에 존재합니다. YES로 표시되면 아카이브된 로그가 존재하지 않으며 보존 기간 때문에 소스에서 제거되었을 수 있습니다.

이 예에서 출력은 아카이브된 로그 시퀀스가 소스에 있음을 나타냅니다. 그러나 AWS DMS 태스크는 여전히 시퀀스가 존재하지 않는다는 오류가 표시되며 실패합니다. DEL이 YES인 경우의 문제 해결에 대해서는 예 2를 참조하세요.

3.    다음으로 DEST_ID 열을 확인합니다. 기본적으로 AWS DMS는 DEST_ID 1의 재실행 로그를 캡처합니다. 이 예에서는 로그에서 다음 스니펫을 볼 수 있습니다.

01788702: 2022-06-07T17:10:31:658376 [SOURCE_CAPTURE  ]I:  Used Oracle archived Redo log destination id is '1'  (oracdc_merger.c:639)

01788702: 2022-06-07T17:10:31:658420 [SOURCE_CAPTURE  ]I:  Oracle instance uses more than one archived Redo log destination id. Please configure the correct destination id, if Redo logs of '1' destination cannot be accessed  (oracdc_merger.c:642)

따라서 DEST_ID 1에서 재실행 로그를 찾고 있기 때문에 AWS DMS 태스크가 실패하지만 재실행 로그 파일은 DEST_ID 2에 있습니다.

4.    이 오류를 해결하려면 소스 엔드포인트에서 다음 추가 연결 속성(ECA)을 사용합니다.

additionalArchivedLogDestId=2

additionalArchivedLogDestID에 대한 자세한 내용은 Oracle의 소스 데이터 유형을 참조하세요.

5.    ECA를 구성한 후 AWS DMS 태스크를 재개합니다. 이 예에서 로그는 이제 AWS DMS가 DEST_ID 2에서 사용 가능한 재실행 로그 시퀀스 232488을 캡처할 수 있음을 보여줍니다.

01898667: 2022-06-08T05:45:08:535588 [SOURCE_CAPTURE  ]D:  Going to retrieve archived REDO log with sequence 232488, thread 1  (oradcdc_thread.c:510)

01898667: 2022-06-08T05:45:08:535607 [SOURCE_CAPTURE  ]T:  Use a prepared statement to access v$archived_log, thread 1  (oradcdc_thread.c:587)

01898667: 2022-06-08T05:45:08:598396 [SOURCE_CAPTURE  ]D:  Going to open Redo Log with original name '/orafra/prdsvbo/arc/1_232488_950180179.arc', thread id '1'  (oradcdc_redo.c:492)

01898667: 2022-06-08T05:45:08:599614 [SOURCE_CAPTURE  ]D:  archived Redo log '/orafra/prdsvbo/arc/1_232488_950180179.arc' with sequence 232488 is opened, thread id '1'  (oradcdc_redo.c:747)

예 2 - DEL이 YES이고 아카이브 로그 시퀀스가 소스 Oracle에 존재하지 않는 경우

앞서 2단계에서 자세히 설명했듯이 DEL이 YES이면 아카이브 로그 시퀀스가 소스 Oracle 데이터베이스에서 제거되었을 수 있습니다.

참고: Oracle 인스턴스는 아카이브 로그가 차지하는 공간을 최소화하기 위해 아카이브 로그 파일을 삭제합니다.

온프레미스 또는 Amazon Elastic Compute Cloud(Amazon EC2)를 위한 단계

SYSDATE-1 시간까지 프롬프트 없는 아카이브 로그를 삭제하도록 RMAN(복구 관리자)을 예약한 경우 이 일정은 하루를 초과한 오래된 모든 아카이브 로그 파일을 삭제합니다. 이 값을 늘리려면 이 명령을 SYSDATE-2 로 수정하거나 일정을 끕니다.

다음 단계에 따라 현재 보존 기간을 찾은 다음 값을 늘립니다.

1.    RMAN에 연결합니다.

2.    모두 표시합니다.

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

참고: 기본 아카이브 로그 삭제 정책 값은 NONE입니다.

3.    삭제 정책 값을 소스 온프레미스 데이터베이스의 아카이브 로그를 유지하기에 충분한 값으로 변경합니다.

CONFIGURE ARCHIVELOG DELETION POLICY BACKED UP integer TIMES TO DEVICE TYPE

  CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO SBT;

Amazon RDS를 위한 단계

Amazon RDS는 5분마다 아카이브 로그 파일을 삭제하고 Amazon Simple Storage Solution(Amazon S3) 버킷에 사본을 보관합니다. 이 사본을 사용하여 시점 복원을 수행할 수 있습니다.    

1.    Oracle DB 인스턴스에 대한 일반적인 로그 관련 태스크 수행 단계를 사용하여 아카이브 로그 파일의 보존 기간을 늘립니다.    

2.    아카이브 로그 파일에 대해 정의된 보존 기간을 확인합니다.

exec RDSADMIN.RDSADMIN_UTIL.SHOW_CONFIGURATION;

3.    이전 쿼리에서 가져온 아카이브 로그 파일을 소스 데이터베이스 서버에서 실제로 사용할 수 있는지 확인합니다.

SQL>select name, archived, deleted, status, sequence# from v$archived_log where sequence# = 232488;

참고: Amazon RDS에서 삭제된 열은 삭제되었더라도 NO로 표시됩니다. 이 정보는 제어 파일에서 가져옵니다.

4.    Amazon RDS에 재실행 로그가 있는지 확인하려면 다음 쿼리를 실행합니다.

select * from table(RDSADMIN.RDS_FILE_UTIL.LISTDIR('ARCHIVELOG_DIR')) where filename='redolog-5924417-1-1013939085.arc' order by mtime desc;

참고: AWS DMS는 아카이브 재실행 로그의 제거를 제어하지 않습니다. 아카이브 재실행 로그는 소스 온프레미스 또는 RDS for Oracle 데이터베이스에 의해 제거됩니다. 대신 AWS DMS는 다음 LSN을 처리하려고 할 때 로그를 찾을 수 없음을 확인합니다.

5.    사용할 수 있는 경우 소스 대상에서 시퀀스 232488의 누락된 아카이브 로그를 복원한 다음 태스크를 재개합니다. 232488 이후의 모든 재실행 로그가 소스에 있어야 AWS DMS 태스크를 성공적으로 재개할 수 있습니다.

누락된 아카이브 로그 시퀀스를 복원할 수 없는 경우 전체 로드 단계에서 태스크를 다시 시작한 다음 마이그레이션을 다시 시작합니다.