내용으로 건너뛰기

MySQL을 소스로 사용했을 때 AWS DMS CDC 작업이 ‘Error 1236’과 함께 실패하는 이유는 무엇입니까?

7분 분량
0

AWS Database Migration Service(AWS DMS)를 사용하여 소스 MySQL 데이터베이스 엔진에서 대상 엔진으로 데이터를 마이그레이션했습니다. 하지만 변경 데이터 캡처(CDC) 작업이 ‘Error 1236’과 함께 실패했습니다.

간략한 설명

AWS DMS를 사용하면 일회성 마이그레이션을 수행하고 진행 중인 변경 사항을 복제하여 소스와 대상을 동기화 상태로 유지할 수 있습니다. 소스 데이터베이스에서 진행 중인 변경 사항을 읽기 위해 AWS DMS는 엔진별 API 작업을 사용하여 소스 엔진의 트랜잭션 로그를 읽습니다. MySQL을 소스로 사용하는 경우 AWS DMS는 행 기반 이진 로그(binlog)에서 변경 사항을 읽습니다. 그런 다음, AWS DMS는 해당 변경 사항을 대상으로 마이그레이션합니다.

이진 로그에 문제가 있는 경우 "Error 1236" 메시지가 표시됩니다. 자체 관리형 또는 AWS 관리형 MySQL 호환 데이터베이스를 사용할 때는 AWS DMS CDC를 지원하도록 모든 이진 로깅 파라미터를 올바르게 구성해야 합니다.

해결 방법

"Error 1236" 문제를 해결하려면 수신한 오류 메시지를 기반으로 다음 작업을 수행하십시오.

"Could not find first log file name in binary log index file reading binlog"

작업 로그의 예제 오류:

[SOURCE_CAPTURE  ]I: Setting position in binlog 'mysql-bin-changelog.014448' at 119624570  (mysql_endpoint_capture.c:886)
[SOURCE_CAPTURE  ]I: Position was set in binlog 'mysql-bin-changelog.014448' at 119624570  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]E: Error 1236 (Could not find first log file name in binary log index file) reading binlog [1020493]
[TASK_MANAGER    ]I: Task - ABCDXXXXXXXXXXXXXX is in ERROR state, updating starting status to AR_NOT_APPLICABLE

위 오류는 소스 MySQL 데이터베이스에서 AWS DMS가 데이터 변경 사항을 대상에 복제하는 데 사용하는 이진 로그를 제거했을 때 발생합니다. MySQL은 다음과 같은 이유로 이진 로그를 제거할 수 있습니다.

  • 이진 로그 보존 기간이 너무 짧습니다.
  • 문제로 인해 AWS DMS 작업이 멈추거나 중지되었습니다.

이진 로그를 사용할 수 있는지 확인하려면 다음 명령을 실행하여 모든 이진 로그 파일을 나열합니다.

mysql> SHOW BINARY LOGS;

그 후 다음 명령을 실행하여 현재 이진 로그 파일 및 위치를 나열합니다.

mysql> SHOW MASTER STATUS;

이전 명령에 대한 자세한 내용은 MySQL 웹 사이트의 SHOW BINARY LOGS 문SHOW MASTER STATUS 문을 참조하십시오.

오류를 해결하려면 소스 MySQL 데이터베이스에서 이진 로그 보존 기간을 확인하십시오. 필요한 경우 보존 기간을 늘리십시오. AWS DMS 작업을 다시 시작하여 전체 로드 단계를 다시 실행합니다.

데이터베이스 유형에 따라 다음 작업을 수행하십시오.

자체 관리형 MySQL 데이터베이스

온프레미스 또는 Amazon Elastic Compute Cloud(Amazon EC2)의 이진 로그 보존 기간을 확인하려면 expire_logs_days 값을 검토하십시오. 자세한 내용은 MySQL 웹 사이트의 로그 만료 일수를 참조하십시오.

참고: SET 변수의 글로벌 파라미터를 1 이상으로 설정하는 것이 좋습니다. 자세한 내용은 MySQL 웹 사이트에서 변수 할당을 위한 SET 구문을 참조하십시오.

AWS 관리형 MySQL 데이터베이스

Amazon Relational Database Service(Amazon RDS) for MySQL 또는 Amazon Aurora MySQL 호환 버전 데이터베이스에 설정된 이진 로그 보존 시간을 확인하십시오. 다음 명령을 실행합니다.

mysql> call mysql.rds_show_configuration;

로그 보존 기간을 24시간으로 늘리려면 다음 명령을 실행합니다.

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

"Log event entry exceeded max_allowed_packet; increase max_allowed_packet on master..."

작업 로그의 예제 오류:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'mysql-bin.056367' at 787323674  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]D:  net_safe_read error 1236 (log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.056367' at 787323674, the last event read from '/mnt/data/logs/mysql-bin.056367' at 123, the last byte read from '/mnt/data/logs/mysql-bin.056367' at 787323693.)  (mysql_endpoint_capture.c:1119)
[SOURCE_CAPTURE  ]I:  Error 1236 (log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.056367' at 787323674, the last event read from '/mnt/data/logs/mysql-bin.056367' at 123, the last byte read from '/mnt/data/logs/mysql-bin.056367' at 787323693.) reading binlog. Try reconnect  (mysql_endpoint_capture.c:1123)

위 오류는 다음과 같은 이유로 발생할 수 있습니다.

  • 행에 소스의 max_allowed_packet 값보다 많은 데이터가 있습니다. 자세한 내용은 MySQL 웹 사이트에서 최대 허용 패킷을 참조하십시오.
  • 단일 트랜잭션에 많은 양의 데이터가 포함되어 있거나 단일 트랜잭션에 행 업데이트가 여러 개 있습니다.
  • 소스 데이터베이스의 이진 로그가 손상되었습니다.

이진 대형 객체(BLOB) 열이나 긴 문자열을 사용하는 경우 max_allowed_packet 값을 사용하는 가장 큰 BLOB로 설정하십시오. 이 파라미터의 값은 최대 1GB일 수 있습니다. 자세한 내용은 MySQL 웹 사이트의 BLOB 및 TEXT 유형을 참조하십시오.

최대 트랜잭션 크기를 확인하려면 이진 로그를 검토하십시오. 트랜잭션 크기가 max_allowed_packet 크기를 초과하지 않는지 확인하십시오. 대규모 트랜잭션을 분할하는 방법에 대한 자세한 내용은 MySQL 웹 사이트의 패킷이 너무 큼을 참조하십시오.

그래도 오류가 발생하면 소스 이진 로그에 손상이 있는 것일 수 있습니다.

이진 로그에서 문제를 확인하려면 다음 단계를 완료하십시오.

  1. 다음 명령을 실행하여 이진 로그가 존재하는지 확인합니다.

    mysql> SHOW BINARY LOGS;
  2. 이진 로그의 이벤트를 보려면 다음 명령을 실행합니다.

    mysql> SHOW BINLOG EVENTS IN 'binlog file' FROM position;

    참고: binlog file을 이진 로그 이름으로 바꾸고 position을 이벤트가 발생한 위치로 바꾸십시오.

  3. 이진 로그를 다운로드하려면 다음 명령을 실행합니다.

    shell> mysqlbinlog \
        --read-from-remote-server \
        --host=MySQLInstance1.cg034hpkmmjt.region.rds.amazonaws.com \
        --port=3306  \
        --user ReplUser \
        --password \
        --raw \
        --verbose \
        --result-file=/tmp/ \
        binlog.00098
  4. 오류 메시지에 언급된 이진 로그에서 손상 여부를 확인합니다.

  5. 이진 로그가 손상된 경우 AWS Support 사례를 만듭니다.

"Binlog truncated in the middle of event; consider out of disk space on master..."

작업 로그의 예제 오류:

[SOURCE_CAPTURE ]I: Read next binary log event failed; net_safe_read error 1236 (binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin-changelog.017672' at 486, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.017672' at 125, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.017672' at 4756.) (mysql_endpoint_capture.c:1069)
[SORTER ]I: Transaction consistency reached (sorter_transaction.c:347)
[TASK_MANAGER ]I: Starting replication now (replicationtask.c:2774)
[TASK_MANAGER ]I: Task - MGLVRIRUJH6FE2GP6F7SW46BPBW6YKF2JUJPSVY is in RUNNING state, updating starting status to AR_RUNNING (repository.c:5110)

위 오류는 다음과 같은 이유로 발생할 수 있습니다.

  • 프라이머리 서버에 sync_binlog != 1이 있습니다. 즉, 이진 로그 이벤트가 디스크에서 동기화되지 않을 수 있습니다. 자세한 내용은 MySQL 웹 사이트에서 binlog 동기화를 참조하십시오.
  • 소스 데이터베이스의 이진 로그가 손상되었습니다.

이 오류를 해결하려면 소스의 sync_binlog 파라미터 값이 1로 설정되었는지 확인하십시오. 그런 다음, 작업을 다시 시작합니다.

sync_binlog 파라미터가 이미 1로 설정된 경우 이진 로그에 손상이 있는지 검토하십시오. 설명은 앞의 "Log event entry exceeded max_allowed_packet; increase max_allowed_packet on master..." 섹션을 참조하십시오.

"Client requested master to start replication from impossible position"

작업 로그의 예제 오류:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'mysql-bin-changelog.007989' at 1631  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]I:  Read next binary log event failed; net_safe_read error 1236 (Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.007989' at 1631, the last event read from 'mysql-bin-changelog.007989' at 4, the last byte read from 'mysql-bin-changelog.007989' at 4.)  (mysql_endpoint_capture.c:1053)
[SOURCE_CAPTURE  ]D:  Error reading binary log. [1020493]  (mysql_endpoint_capture.c:3995)
[SOURCE_CAPTURE  ]E:  Error 1236 (Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.007989' at 1631, the last event read from 'mysql-bin-changelog.007989' at 4, the last byte read from 'mysql-bin-changelog.007989' at 4.) reading binlog events [1020493]  (mysql_endpoint_capture.c:1074)

이 오류는 소스 MySQL 데이터베이스 서버가 예기치 않게 중지될 때 발생합니다. 디스크 오류나 전원 손실과 같은 하드웨어 장애로 인해 예기치 않은 중지가 발생할 수 있습니다.

이 오류를 해결하려면 AWS DMS 작업 유형에 따라 다음 작업 중 하나를 수행하십시오.

  • 전체 로드 및 CDC 작업의 경우 AWS DMS 작업을 다시 시작합니다.
  • CDC 전용 작업의 경우 다음 이진 로그 위치에서 AWS DMS 작업을 시작합니다.

"Client requested master to start replication from position > file size"

작업 로그의 예제 오류:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'binlog.000012' at 2179  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]I:  Read next binary log event failed; net_safe_read error 1236 (Client requested master to start replication from position > file size)  (mysql_endpoint_capture.c:1052

이 오류는 암호화된 이진 로그 때문에 발생할 수 있습니다. 소스 MySQL 데이터베이스에서 MySQL 버전 8.0을 실행하고 이진 로그를 암호화하면 AWS DMS는 작업 초기화 시 로그를 읽을 수 없습니다. 따라서 AWS DMS는 이 오류를 기록합니다. 이진 로그 암호화를 활성화하면 MySQL 8.0을 소스로 사용하는 CDC 복제를 사용할 수 없습니다. 자세한 내용은 MySQL 웹 사이트의 이진 로그 파일 및 릴레이 로그 파일 암호화를 참조하십시오.

이 문제를 해결하려면 다음 단계를 완료하십시오.

  1. 다음 명령을 실행하여 MySQL 버전을 확인합니다.

    mysql> SELECT VERSION();
  2. 다음 명령을 실행하여 binlog_encryptionON인지 확인합니다.

    mysql> SELECT * FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'binlog_encryption';
  3. binlog_encryption을 비활성화하려면 다음 명령을 실행합니다.

    mysql> SET GLOBAL binlog_encryption = OFF;

    -또는-
    binlog_encryption을 비활성화한 상태로 AWS DMS 작업을 시작한 후 다음 명령을 실행하여 binlog_encryption을 활성화합니다.

    mysql> SET GLOBAL binlog_encryption = ON;

관련 정보

Aurora MySQL 호환을 소스로 하여 AWS DMS를 사용하는 경우 발생하는 이진 로깅 오류를 해결하려면 어떻게 해야 합니까?