AWS DMS 태스크에서 CDC가 켜져 있을 때 RDS for SQL Server 소스의 T-Log 전체 문제를 해결하려면 어떻게 해야 합니까?

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

변경 데이터 캡처(CDC)가 켜져 있는 AWS Database Migration Service(AWS DMS) 태스크가 있습니다. 태스크에서 Amazon Relational Database Service(Amazon RDS) for SQL Server를 소스로 사용합니다. AWS DMS 태스크에서 SQL 서버 T-Llog 전체 문제가 발생했습니다. AWS DMS 태스크에서 CDC가 켜져 있을 때 이러한 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

SQL Server를 AWS DMS 태스크의 소스로 사용하는 경우 인스턴스에서 MS 변경 데이터 캡처(CDC)를 활성화하여 진행 중인 변경 사항을 복제할 수 있습니다. Amazon RDS for MySQL, 온프레미스 SQL 및 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 대해 MS CDC를 사용할 수 있습니다.

CDC가 켜진 후에는 fn_dblog() 함수를 사용하여 활성 로그 파일에서 진행 중인 DML 변경 사항을 추적하고 읽습니다. 모든 소스 테이블의 경우 CDC는 해당 CDC 변경 테이블(change table)을 만듭니다.

변경 사항을 추적하기 위해 CDC는 다음 두 가지 작업을 만듭니다.

  • 캡처 작업(Capture job) - T-logs를 스캔한 다음 sp_replcmds 저장소 프로시저를 사용하여 해당 변경 추적 테이블의 변경 사항을 캡처하고 기록합니다.
  • 정리 작업(Cleanup job) - 보존 정책에 따라 변경 내용 추적을 정리합니다.

이러한 설정에 대해 설정된 값을 보려면 다음 저장소 프로시저를 실행합니다.

EXEC sys.sp_cdc_help_jobs
  • Maxtrans - 각 스캔 주기에서 처리할 최대 트랜잭션 수입니다.
  • Maxscans - 로그에서 모든 행을 추출하기 위해 실행할 최대 스캔 주기 수입니다.
  • Pollinginterval - 로그 스캔 주기 사이의 시간(초)입니다.

Amazon RDS에서 SQL Server는 5분마다 로그 백업을 수행합니다. 이러한 백업을 Amazon Simple Storage Service(S3)로 푸시합니다. SQL Server는 마지막 분 LSN까지 로그를 자릅니다. AWS DMS가 활성 로그의 가까운 영역을 읽는 동안 활성 로그가 잘리면 fn_dblog에 대한 다음 호출 시 변경 사항이 누락될 수 있습니다. Amazon S3에서 fn_dump_dblog를 사용하여 로그에 액세스할 수 없기 때문에 태스크가 실패합니다.

이와 같은 문제를 방지하기 위해 AWS DMS에는 Safeguard traction 및 pollingInterval 옵션이 있습니다.

  • Safeguard traction: AWS DMS는 소스 데이터베이스에 Awsdms_trucatcation safeguard라는 테이블을 생성합니다. Awsdms_trucatcation은 두 개의 Safeguard traction을 연 다음 5분마다 더미 업데이트 문을 번갈아 실행합니다. 즉, SQL은 10분 동안 로그를 자르지 않습니다.

하지만 AWS DMS가 10분 이상 로그 읽기를 지연하면 태스크가 다시 실패합니다. 이를 방지하려면 pollingInterval 파라미터를 사용하세요. 자세한 내용은 Microsoft SQL Server 데이터베이스를 AWS DMS의 소스로 사용을 참조하세요.

  • pollingInterval: 캡처 작업의 폴링 간격의 기본값은 5초로 설정됩니다. 즉, pollingInterval은 5초마다 실행되고 T-log를 스캔하여 변경 사항을 읽고 이러한 로그를 복제된 것으로 표시합니다. 그런 다음 로그를 잘라냅니다.

pollingInterval 값을 3599 이상으로 설정하는 것이 가장 좋습니다. 즉, 캡처 작업을 너무 자주 실행할 수 없으며 지정된 시간 동안 T-log가 잘리지 않도록 합니다.

그러나 트랜잭션이 많은 데이터베이스는 T-Log 전체 상태가 될 수 있으며 다음과 유사한 오류가 발생하여 태스크가 실패할 수 있습니다.

E: RetCode: SQL_ERROR SqlState: 42000 NativeError: 9002 Message: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The transaction
log for database ‘yourdatabase' is full due to 'REPLICATION'

해결 방법

CDC가 켜져 있을 때 SQL Server T-Log 전체 문제를 해결하고 확인합니다.

다음 단계를 사용하여 CDC가 켜져 있을 때 SQL Server T-Log 전체 문제를 해결하고 확인할 수 있습니다.

1.    트랜잭션 로그 파일의 크기를 확인합니다.

DBCC SQLPERF(logspace)

2.    트랜잭션 로그가 꽉 찬 경우 다음 명령을 실행하여 로그를 소비하는 항목을 확인합니다.

select name, log_reuse_wait_desc from sys.databases where name = ' db_name '
  • Replication: 복제가 작동을 중지했거나 활성 트랜잭션을 읽고 있지 않습니다.
  • Active_transaction: 진행 중인 트랜잭션이 있습니다.

활성 트랜잭션이 있는 경우 진행 중인 트랜잭션의 목록을 확인합니다.

select * from sys.sysprocesses where open_tran=1

참고: AWS DMS 태스크가 실행 상태일 때는 CDC가 켜진 데이터베이스의 T-Log를 축소할 수 없습니다. 대신 태스크를 중지하고 로그 백업으로 인해 트랜잭션 로그가 잘릴 때까지 기다립니다. 그런 다음 데이터베이스의 T-Log를 축소합니다.

T-log 파일을 축소하고 태스크를 다시 시작합니다.

로그를 정리한 후 T- 로그 파일을 축소한 다음 태스크를 다시 시작합니다.

1.    태스크를 중지합니다.

2.    CDC 상태를 확인한 다음 CDC를 끕니다.

CDC 상태를 확인합니다.

select b.name,a.run_date,a.run_status from msdb.dbo.sysjobhistory as a
join msdb.dbo.sysjobs as b on a.job_id=b.job_id
where b.name like '%cdc%capture%';

데이터베이스 수준에서 CDC를 끕니다.

exec msdb.dbo.rds_cdc_disable_db '<db_name>'

CDC의 일부인 테이블을 찾습니다.

USE db_name
GO
SELECT s.name AS Schema_Name, tb.name AS Table_Name
, tb.object_id, tb.type, tb.type_desc, tb.is_tracked_by_cdc
FROM sys.tables tb
INNER JOIN sys.schemas s on s.schema_id = tb.schema_id
WHERE tb.is_tracked_by_cdc = 1

테이블 수준에서 CDC를 끕니다.

use <db_name>
EXEC sys.sp_cdc_disable_table
@source_schema = N'<schema>',
@source_name   = N'<table>',
@capture_instance = N'<schema_table>'

3.    CDC가 꺼져 있는지 확인합니다.

select is_cdc_enabled, * from sys.databases where name = 'dbname' Value 1- enabled   and 0 -Disabled

4.    CDC가 꺼진 후 10분 이상 기다린 다음 T-log를 축소합니다.

use <dbname>
SELECT file_id, name
FROM sys.database_files;
GO

USE <dbname>
GO
DBCC SHRINKFILE (N'dbname_log' , 0, TRUNCATEONLY)
GO

5.    로그 크기를 확인합니다.

DBCC SQLPERF(logspace)

6.    CDC를 다시 켠 다음 태스크를 다시 시작합니다. 태스크를 재개하면 트랜잭션이 누락될 수 있습니다. Amazon RDS for SQLServer에서는 보관된 T-log에 액세스하는 것이 지원되지 않습니다.