다음을 통해 공유


Azure SQL 데이터베이스에서 CDC(변경 데이터 캡처) 사용하는 법

적용 대상: Azure SQL 데이터베이스

이 문서에서는 테이블 및 행이 수정되었을 때 데이터베이스에 작업을 기록하는 CDC(변경 데이터 캡처)에 대해 알아봅니다. SQL Server 및 Azure SQL Managed Instance에서 구현되는 방법을 포함하여 CDC 기능에 대한 자세한 내용은 SQL Server에서의 CDC를 참조하세요.

개요

Azure SQL 데이터베이스에서 변경 데이터 캡처 스케줄러는 소스 테이블의 변경 데이터를 캡처 및 정리하는 SQL Server 에이전트 작업을 대체합니다. 스케줄러는 안정성 또는 성능을 위해 외부에 의존하지 않고 데이터베이스 내에서 캡처 및 정리를 자동으로 실행합니다. 사용자는 필요에 따라 캡처 및 정리 프로세스를 수동으로 시작할 수도 있습니다.

이 기술이 사용하는 데이터 소비자의 좋은 예로는 ETL(추출, 변환 및 로드) 애플리케이션이 있습니다. ETL 애플리케이션은 SQL Server 원본 테이블에서 데이터 웨어하우스 또는 데이터 마트로 변경 데이터를 증분 방식으로 로드합니다. 데이터 웨어하우스 내의 원본 테이블 표현은 원본 테이블의 변경 내용을 반영해야 하지만 원본의 복제본(replica)을 새로 고치는 E2E 기술은 여기에 적절하지 않습니다. 대신 소비자가 다른 종류의 데이터 대상 표현에 적용할 수 있도록 구조화된 안정적인 변경 데이터 스트림이 필요합니다. SQL Server 변경 데이터 캡처는 이러한 기술을 제공합니다.

Azure SQL 데이터베이스의 변경 데이터 캡처에 대한 자세한 내용은 다음 데이터 노출 에피소드를 참조하세요.

데이터 흐름

다음 그림에서는 Azure SQL 데이터베이스를 사용하여 변경 데이터 캡처의 주요 데이터 흐름을 보여 줍니다.

변경 데이터 캡처를 위한 데이터 흐름을 보여 주는 흐름 차트의 다이어그램입니다.

필수 조건

사용 권한

Azure SQL 데이터베이스에서 변경 데이터 캡처를 사용하도록 설정하려면 db_owner 역할이 필요합니다.

Azure SQL 데이터베이스 컴퓨팅 요구 사항

단일 데이터베이스탄력적 풀을 사용할 때 모두 vCore 기반 구매 모델 내의 모든 서비스 계층에 Azure SQL 데이터베이스에서 CDC를 활성화할 수 있습니다.

DTU 구매 모델의 데이터베이스의 경우 CDC는 S3 계층 이상의 데이터베이스에서 지원됩니다. 하위 계층(기본, S0, S1, S2)은 CDC를 지원하지 않습니다.

Azure SQL 데이터베이스에서 CDC 활성화하기

개별 테이블에 캡처 인스턴스를 만들려면 먼저 Azure SQL 데이터베이스에 CDC를 활성화 해야 합니다.

Azure Data Studio 또는 SSMS(SQL Server Management Studio)를 열어 SQL Server 데이터베이스에 연결합니다. 새 쿼리 창을 열고 T-SQL을 실행하여 CDC를 활성화합니다.

EXEC sys.sp_cdc_enable_db;
GO

참고 항목

데이터베이스에서 CDC가 이미 활성화되었는지 확인하려면 sys.databases 카탈로그 보기의 is_cdc_enabled 열을 쿼리합니다.

데이터베이스의 변경 데이터 캡처를 활성화하면 데이터베이스의 cdc schema, cdc user, 메타데이터 테이블 및 기타 시스템 개체가 만들어집니다. cdc schema에는 변경 데이터 캡처 메타데이터 테이블이 포함되며 원본 테이블의 변경 데이터 캡처가 활성화된 후에는 개별 변경 테이블이 변경 데이터의 리포지토리 역할을 수행합니다. 변경 데이터를 쿼리하는 데 사용되는 관련 시스템 함수도 cdc schema에 포함됩니다.

Important

변경 데이터 캡처를 사용하려면 cdc schemacdc user(을)를 단독으로 사용해야 합니다. cdc라는 스키마 또는 데이터베이스 사용자가 데이터베이스에 현재 있는 경우 해당 스키마 및/또는 사용자가 삭제되거나 이름이 바뀔 때까지 데이터베이스의 변경 데이터 캡처를 활성화할 수 없습니다.

테이블의 CDC 활성화

Azure SQL 데이터베이스에 CDC를 활성화한 후 하나 이상의 테이블을 선택하여 데이터 변경 내용을 추적하여 테이블 수준에서 CDC를 활성화할 수 있습니다. sys.sp_cdc_enable_table 저장 프로시저를 사용하여 개별 원본 테이블에 대한 캡처 인스턴스를 만듭니다.

테이블에 CDC를 활성화하려면 다음 T-SQL을 실행하세요.

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = NULL;
GO

이전 예시에서는 NULL에 매개 변수를 설정하여 명시적 @role_name 사용하지 않지만, 게이팅 역할을 사용하여 변경 데이터에 대한 액세스를 제한할 수 있습니다.

캡처할 원본 테이블의 열

기본적으로 원본 테이블의 모든 열은 캡처된 열로 식별됩니다. 개인 정보 보호 또는 성능상의 이유 등으로 인해 열의 하위 세트만 추적해야 하는 경우에는 @captured_column_list 매개 변수를 사용하여 열의 하위 세트를 지정합니다.

테이블의 특정 열 목록에 CDC를 활성화하려면 다음 T-SQL을 실행합니다.

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = NULL,
    @captured_column_list = N'Column1, Column2, Column3';
GO

이전 예시에서는 NULL에 매개 변수를 설정하여 명시적 @role_name 사용하지 않지만, 게이팅 역할을 사용하면 변경 데이터에 대한 액세스를 제한할 수 있습니다.

변경 테이블에 대한 액세스를 제어하는 역할

명명된 역할의 목적은 변경 데이터에 대한 액세스를 제어하는 것입니다. 지정된 역할은 기존 고정 서버 역할 또는 데이터베이스 역할일 수 있습니다. 지정한 역할이 아직 존재하지 않으면 해당 이름의 데이터베이스 역할이 자동으로 만들어집니다. 모든 사용자는 원본 테이블의 모든 캡처된 열에 대한 SELECT 권한이 있어야 합니다. 또한 역할이 지정되면 sysadmin 또는 db_owner 역할의 멤버가 아닌 사용자도 지정된 역할의 멤버여야 합니다.

게이팅 역할을 지정하는 테이블에 CDC를 활성화하려면 다음 T-SQL을 실행합니다.

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = N'RoleName'
GO

게이팅 역할을 사용하지 않으려면 NULL@role_name 매개 변수를 명시적으로 설정하세요.

순 변경 내용을 쿼리하는 함수

캡처 인스턴스는 항상 정의된 간격 내에서 발생한 모든 변경 테이블 항목을 반환하는 데 사용되는 테이블 반환 함수를 포함합니다. 이 함수 이름은 cdc.fn_cdc_get_all_changes_에 캡처 인스턴스 이름을 더해 지정됩니다. 자세한 내용은 cdc.fn_cdc_get_all_changes 참조하세요.

@supports_net_changes 매개 변수가 1로 설정된 경우 캡처 인스턴스에 순 변경 함수도 생성됩니다. 이 함수는 호출에 지정된 간격 내에 변경된 각 개별 행에 대해 하나의 변경만 반환합니다. 자세한 내용은 cdc.fn_cdc_get_net_changes 참조하세요.

순 변경 쿼리를 지원하기 위해 원본 테이블에는 행을 고유하게 식별하는 기본 키 또는 고유 인덱스가 있어야 합니다. 고유 인덱스가 사용되는 경우 @index_name 매개개 변수를 사용하여 인덱스의 이이름을 지정해야 합니다. 기본 키 또는 고유 인덱스에 정의된 열은 캡처할 원본 열 목록에 포함되어야 합니다.

순 변경 내용이 지원되는 테이블에 CDC를 활성화하려면 다음 T-SQL을 실행합니다.

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = NULL,
    @supports_net_changes = 1
GO

기존 기본 키가 있는 테이블에 변경 데이터 캡처가 활성화되어 있고, index_name 매개 변수를 사용하여 대체 고유 인덱스를 식별하지 않는 경우 변경 데이터 캡처 기능에 기본 키가 사용됩니다. 기본 키에 대한 후속 변경을 허용하려면 먼저 테이블의 CDC를 비활성화해야 합니다. 이는 CDC를 구성할 때 순 변경 쿼리에 대한 지원을 요청했는지 여부와 관계없이 적용됩니다.

테이블에 변경 데이터 캡처를 활성화할 때 기본 키가 존재하지 않는 경우에는 기본 키에 대한 후속 추가 사항이 변경 데이터 캡처에 의해 무시됩니다. CDC는 테이블에 이 기능이 설정된 이후에 생성되는 기본 키를 사용하지 않으므로 키와 키 열을 제한 없이 제거할 수 있습니다.

sys.sp_cdc_enable_table 저장 프로시저 인수에 대한 자세한 내용은 sys.sp_cdc_enable_table(Transact-SQL)를 참조하세요.

변경 데이터 캡처에 원본 테이블이 활성화 되어있는지를 sys.tables 카탈로그 보기의 is_tracked_by_cdc 열을 확인하세요.

Azure SQL 데이터베이스에서 CDC 비활성화하기

Azure SQL 데이터베이스에 CDC를 비활성화하면 cdc user, cdc schema, 외부 스케줄러 캡처 및 정리 프로세스를 포함하여 연결된 모든 변경 데이터 캡처 메타데이터가 제거됩니다. 하지만 CDC로 생성된 모든 제어 역할은 자동으로 제거되지 않으며 명시적으로 삭제해야 합니다.

참고 항목

데이터베이스에 CDC가 활성화되었는지 확인하려면 sys.databases 카탈로그 보기의 is_cdc_enabled 열을 쿼리합니다.

데이터베이스 수준에서 CDC를 비활성화하기 전에 개별 테이블의 CDC를 비활성화할 필요는 없습니다.

데이터베이스 수준에서 CDC를 비활성화하려면 다음 T-SQL을 실행합니다.

EXEC sys.sp_cdc_disable_db;
GO

데이터베이스 수준에서 CDC를 비활성화한 후에는 CDC 기능을 다시 사용하려는 경우 개별 테이블의 CDC 활성화를 다시 해야 합니다.

CDC 관리

Azure SQL 데이터베이스에서 CDC는 데이터베이스 테이블의 변경 내용을 추적하고 관리하는 중요한 기능입니다. 기존 SQL Server 환경과 달리 Azure SQL 데이터베이스는 SQL Server 에이전트 작업에 의존하는 대신 변경 데이터 캡처 스케줄러를 사용하여 CDC 작업을 처리합니다. 이 스케줄러는 데이터베이스 내 CDC 테이블의 주기적인 캡처 및 정리 프로세스를 자동으로 실행하여 외부에 의존하지 않고 안정성과 성능을 보장합니다.

자동 CDC 캡처 및 정리

Azure SQL 데이터베이스의 CDC 캡처 작업은 20초마다 변경 내용을 추적하여 매끄럽게 실행됩니다. 동시에 정리 작업은 매시간 실행되어 CDC 테이블의 최적화된 상태를 유지합니다. 수동 개입 없이도 CDC 관리가 자동으로 수행되기 때문에 사용자는 안심할 수 있습니다.

Important

서버리스 데이터베이스에 CDC가 활성화되어 있지만 일시 중지된 상태라면 CDC가 실행되지 않습니다. CDC 스캔은 자동 일시 중지 기능에 영향을 미치지 않습니다.

수동 CDC 제어

CDC가 자동으로 실행되는 동안에도 사용자는 유연하게 필요에 따라 수동 CDC 작업을 수행할 수 있습니다. sp_cdc_scansp_cdc_cleanup_change_tables 절차를 사용하면 필요에 따라 캡처 및 정리 작업을 실행할 수 있습니다.

CDC 모니터링

Azure SQL 데이터베이스는 CDC 활동을 모니터링하는 유용한 도구를 제공합니다. sys.dm_cdc_log_scan_sessionssys.dm_cdc_errors 두 동적 관리 뷰는 CDC 프로세스에 대한 인사이트를 제공하여 데이터 변경 내용을 완전히 파악할 수 있도록 도와줍니다.

CDC 사용자 지정

Azure SQL 데이터베이스는 CDC 관리를 간소화하지만 몇 가지 제한 사항이 있습니다.

  • 사용자는 CDC 캡처 및 정리 작업의 빈도를 지정할 수 없습니다.
  • 캡처 및 정리 작업에 대한 pollingintervalcontinuous 값은 Azure SQL 데이터베이스에 적용되지 않습니다.
  • cdc.cdc_jobs 테이블에서 캡처 작업 항목을 제거해도 백그라운드 캡처 작업은 중단되지는 않습니다.
  • 정리 작업 항목을 삭제하면 정리 작업이 중지됩니다.
  • cdc.cdc_jobs 테이블은 msdb이(가) 아닌 cdc 스키마에 있습니다.

이러한 제한에도 존재하지만 다음 옵션의 경우 사용자 지정이 가능합니다.

  • cdc.cdc_jobs 테이블을 쿼리하여 현재 구성 세부 정보를 확인합니다.
  • sp_cdc_change_job 저장 프로시저를 사용하여 maxtransmaxscans 옵션을 조정합니다.
  • 필요에 따라 sp_cdc_drop_jobsp_cdc_add_job(을)를 사용하여 작업을 관리합니다.

성능 고려 사항 및 권장 지침

Azure SQL 데이터베이스에 변경 데이터 캡처를 활성화활 경우, SQL Server 또는 Azure SQL Managed Instance에 CDC를 활성화와 비슷한 성능 효과가 있습니다. 그러나 다음과 같은 몇 가지 요인은 CDC 활성화의 성능 효과에 영향을 줍니다.

  • Azure SQL 데이터베이스의 CDC 사용 테이블 수.

  • 추적된 테이블의 변경 빈도 또는 트랜잭션 볼륨. 활성 트랜잭션은 트랜잭션이 커밋되고 CDC 스캔이 따라잡거나 트랜잭션이 예기치 않게 종료될 때까지 트랜잭션 로그가 잘리는 것을 방지합니다. 이로 인해 트랜잭션 로그가 평소보다 많이 채워질 수 있으므로 트랜잭션 로그가 채워지지 않도록 모니터링해야 합니다.

  • CDC 아티팩트(예: CT 테이블, cdc_jobs 등)와 동일한 데이터베이스에 저장되니 원본 데이터베이스의 사용할 수 있는 공간이 충분한지 확인합니다.

  • 단일 데이터베이스 또는 탄력적 풀의 일부인지 여부.

  • 탄력적 풀의 데이터베이스는 리소스를 공유하므로(예: 디스크 공간) 여러 데이터베이스에서 CDC를 활성화하면 탄력적 풀 디스크 크기의 최대 크기에 도달할 위험이 있습니다. CPU, 메모리 및 로그 처리량과 같은 리소스를 모니터링하세요. 자세한 내용은 가득찬 탄력적 풀의 리소스 관리를 참조하세요.

  • 탄력적 풀에서 데이터베이스를 처리할 때는 CDC가 활성화된 테이블의 수와 해당 테이블이 속한 데이터베이스 수를 반드시 고려해야 합니다. 워크로드를 확인하여 탄력적 풀 크기 조정과 같은 필요한 조치를 취하는 것이 좋습니다. 자세한 내용은 Azure SQL 데이터베이스에서 단일 데이터베이스 리소스 크기 조정하기를 참조하세요.

Important

이러한 고려 사항은 일반적인 지침입니다. 특정 워크로드의 성능을 최적화하기 위한 정확한 지침은 Microsoft 지원에 문의하세요.

Azure SQL 데이터베이스에서 CDC를 사용하는 경우 다음 모범 사례를 확인해 보세요.

  • 프로덕션의 데이터베이스에서 CDC 활성화 전 워크로드를 철저히 테스트하여 워크로드에 적합한 SLO를 결정하세요. 자세한 내용은 Azure SQL 데이터베이스의 서버리스 컴퓨팅 계층을 참조하세요.

  • Azure SQL 데이터베이스에서 CDC를 활성화한 다음에도 이전 성능 수준을 유지하려면 vCore 수를 조정하거나 Hyperscale과 같은 더 높은 데이터베이스 계층으로의 전환을 고려해 보세요. 자세한 내용은 vCore 구매 모델 - Azure SQL 데이터베이스Hyperscale 서비스 계층을 참조하세요.

  • 공간 사용률을 면밀히 모니터링하세요. 자세한 내용은 Azure SQL 데이터베이스 파일 공간 관리를 참조하세요.

  • 로그 생성률 모니터링에 대한 자세한 내용은 사용자 워크로드 및 내부 프로세스별 리소스 사용량을 참조하세요.

  • CDC 스캔 및 정리 프로세스는 일반 데이터베이스 워크로드(리소스 사용)에 포함됩니다. 트랜잭션 양에 따라 스캔 및 정리 프로세스가 변경 테이블에 추가되는 전체 행을 따라가지 못하고 업데이트의 경우 프리이미지가 포함되어 상당한 성능 저하가 발생할 수도 있습니다. 워크로드를 확인하여 이전 권장 사항에 따라 필요한 조치를 취할 것을 권장합니다. 자세한 내용은 이 문서의 CDC 관리 섹션을 참조하세요.

Important

스케줄러는 SQL Database에서 자동으로 캡처 및 클린업을 실행합니다. CDC 캡처 작업은 20초마다 실행되고 클린업 작업은 한 시간마다 실행됩니다.

  • CDC 사용 데이터베이스 수가 탄력적 풀에 할당된 vCore 수를 초과하지 않는지 확인하면 대기 시간 증가를 방지할 수 있습니다. 자세한 내용은 가득찬 탄력적 풀의 리소스 관리를 참조하세요.

  • 워크로드 및 성능 수준에 따라 CDC 보존 기간을 기본값인 3일보다 짧은 기간으로 변경하여 클린업 프로세스가 변경 테이블의 변경 내용을 따라갈 수 있도록 하는 것을 권장합니다. 데이터베이스 크기를 모니터링하는 동안은 보존 기간을 더 짧게 유지하는 것이 좋습니다.

  • 변경 내용이 변경 테이블에 가득 찰 경우, SLA(서비스 수준 약정) 없음을 확인하세요. 1초 미만 대기 시간은 지원되지 않습니다.

알려진 문제 및 제한 사항

적극적인 로그 자르기

Azure SQL 데이터베이스 또는 SQL Server에서 CDC(변경 데이터 캡처)를 활성화하면 ADR(가속 데이터베이스 복구)의 적극적인 로그 자르기 기능이 비활성화된다는 점에 유의하세요. CDC 검사가 데이터베이스 트랜잭션 로그에 액세스하기 때문입니다. 활성 트랜잭션은 트랜잭CDC 스캔이 커밋되는 트랜잭션을 따라잡을 때까지 또는 트랜잭션이 예기치 않게 종료될 때까지 트랜잭션 로그 자르기를 계속 유지합니다. 이로 인해 트랜잭션 로그가 평소보다 많이 채워질 수 있으므로 트랜잭션 로그가 채워지지 않도록 모니터링해야 합니다.

CDC를 활성화하는 경우, 인덱스를 생성하거나 다시 빌드할 때 다시 시작 가능한 인덱스 옵션을 사용하는 것이 좋습니다. 다시 시작 가능한 인덱스는 장기 실행 트랜잭션을 연 상태로 두지 않으며 작업 중에 로그 자르기를 허용하여 로그 공간 관리를 향상합니다. 자세한 내용은 온라인 인덱스 작업에 대한 지침 - 다시 시작 가능한 인덱스 고려 사항을 참조하세요.

Azure SQL 데이터베이스 서비스 계층

CDC는 vCore 기반 구매 모델 내의 모든 서비스 계층에서 데이터베이스탄력적 풀에 대해 지원되지만 S3보다 낮은 데이터베이스(예: Basic, S0, S1, S2)는 DTU 구매 모델에서 지원되지 않습니다.

Azure SQL 데이터베이스 로그 제한 사항

가속 데이터베이스 복구 및 CDC는 Azure SQL 데이터베이스에서 호환되지 않습니다. CDC 스캔이 ADR의 공격적인 로그 자르기 동작과 충돌할 수 있는 데이터베이스 트랜잭션 로그에 적극적으로 액세스하고 상호 작용하기 때문입니다.

확장성 및 공간 관리 문제를 방지하려면 Azure SQL 데이터베이스를 면밀히 모니터링하고 더 높은 데이터베이스 계층으로 확장하는 것을 고려하고 워크로드 요구 사항에 따라 트랜잭션 로그가 확장할 수 있도록 하세요.

트랜잭션 로그 처리량이 높고 트랜잭션 커밋 시간이 빨라 워크로드가 더 높은 전반적인 성능을 요구하는 경우 하이퍼스케일 서비스 계층을 사용하세요.

온라인 DDL 문은 지원되지 않습니다.

데이터베이스에서 변경 내용 데이터 캡처를 사용하도록 설정하면 온라인 DDL 문이 지원되지 않습니다.

캡처 및 클린업 사용자 지정

Azure SQL 데이터베이스에서는 CDC의 캡처 및 클린업 프로세스의 빈도를 구성할 수 없습니다. 캡처 및 클린업은 스케줄러에 의해 자동으로 실행됩니다.

Azure SQL 데이터베이스 장애 조치

로컬 또는 GeoDR 장애 조치(failover) 시나리오의 경우 데이터베이스에 CDC가 활성화된 경우 장애 조치가 수행된 후 새 주 데이터베이스에서 데이터 변경 내용을 캡처하고 클린 프로세스가 자동으로 수행됩니다.

Microsoft Entra ID

참고 항목

Microsoft Entra ID는 이전의 Azure AD(Azure Active Directory)입니다.

Microsoft Entra ID로 Azure SQL 데이터베이스에 데이터터베이스를 만들고 CDC를 사용하면 SQL 사용자(예: sysadmin 관리자 역할)가 CDC 아티팩트를 비활성화하거나 변경할 수 없게 됩니다. 그러나 다른 Microsoft Entra 사용자는 같은 데이터베이스에서 CDC를 사용하거나 사용하지 않을 수 있습니다.

마찬가지로, SQL 사용자로 데이터베이스를 만들면 Microsoft Entra 사용자로 CDC를 사용하거나 사용할 수 없습니다.

Azure SQL 데이터베이스에서 Microsoft Entra 사용자로 데이터베이스를 만들고 CDC를 활성화하지 않은 다음 데이터베이스를 복원하여도 CDC를 활성화할 수 없습니다.

이 문제를 해결하려면 Microsoft Entra 관리자 계정으로 데이터베이스에 연결하고 다음 T-SQL을 실행합니다.

ALTER AUTHORIZATION ON DATABASE::[<restored_db_name>] TO [<azuread_admin_login_name>];

EXEC sys.sp_cdc_enable_db;

PITR(특정 시점 복원)

AZURE SQL Database에서 SQL 사용자로 CDC를 활성화한 경우 PITR(지정 시간 복원)은 하위 코어 SLO로 복원되지 않는 한 복원된 데이터베이스에 CDC를 유지합니다. 하위 코어 SLO로 복원된 경우 CDC 아티팩트를 사용할 수 없습니다.

데이터베이스에서 Microsoft Entra 사용자로 CDC를 활성화한 경우 PITR(지정 시간 복원)을 하위 코어 SLO로 복원할 수 없습니다. 데이터베이스를 원본과 동일하거나 더 높은 SLO로 복원한 다음 필요한 경우 CDC를 비활성화할 수 있습니다.

문제 해결

이 섹션은 Azure SQL 데이터베이스의 CDC와 관련된 지침 및 문제 해결 단계를 다룹니다. CDC 관련 오류는 캡처 프로세스의 적절한 작동을 방해하고 데이터베이스 트랜잭션 로그의 확장으로 이어질 수 있습니다.

이러한 오류를 검사하려면 동적 관리 뷰 sys.dm_cdc_errors를 쿼리하세요. sys.dm_cdc_errors 동적 관리 뷰에서 오류를 반환하는 경우 다음 섹션을 참조하여 완화 단계를 알아 보세요.

참고 항목

특정 오류 코드에 대한 자세한 내용은 데이터베이스 엔진 이벤트 및 오류를 참조하세요.

다음은 이 섹션에 포함된 다양한 문제 해결 범주입니다.

범주 설명
수정된 메타데이터 추적된 테이블이 수정되거나 삭제된 경우 CDC와 관련된 문제를 완화하는 방법에 대해 알아봅니다.
데이터베이스 파일 공간 관리 데이터베이스 공간이 소진되었을 때 문제를 완화하는 방법에 대해 알아봅니다.
CDC 제한 사항 CDC 제한 사항으로 인한 문제를 완화하는 방법에 대해 알아봅니다.

수정된 메타데이터

오류 200/208 - 잘못된 개체 이름입니다.

  • 원인: CDC 메타데이터를 삭제할 때 발생할 수 있는 오류입니다. CDC가 제대로 작동하려면 CDC schema, 변경 테이블, CDC 시스템 저장 프로시저, 기본 cdc user 권한(sys.database_principals)과 같은 CDC 메타데이터를 수동으로 수정하거나 cdc user 이름을 바꿔서는 안 됩니다.

  • 권장 사항: 이 문제를 해결하려면 데이터베이스에 CDC를 비활성화했다가 다시 활성화해야 합니다. 데이터베이스의 변경 데이터 캡처를 활성화하면 데이터베이스의 CDC 스키마, CDC 사용자 메타데이터 테이블 및 기타 시스템 개체가 만들어집니다. 데이터베이스에 CDC를 활성화한 후 개별 테이블의 CDC를 수동으로 다시 활성화해야 합니다.

참고 항목

sys.objects 시스템 카탈로그 뷰에 있는 개체를 is_ms_shipped=1schema_name=cdc(으)로 변경하거나 삭제해서는 안 됩니다.

오류 1202 - 데이터베이스의 주체가 없거나 사용자가 멤버가 아닙니다.

  • 원인: CDC 사용자자를 삭제했을 때 발생할 수 있는 오류입니다. CDC가 제대로 작동하려면 CDC schema, 변경 테이블, CDC 시스템 저장 프로시저, 기본 cdc user 권한(sys.database_principals)과 같은 CDC 메타데이터를 수동으로 수정하거나 cdc user 이름을 바꿔서는 안 됩니다.

  • 권장 사항: cdc 사용자가 데이터베이스에 있고 해당 사용자에게 db_owner 역할이 할당되었는지 확인하세요. cdc 사용자를 만들려면 CDC 사용자 만들기 및 역할 할당 예시를 참조하세요.

오류 15517 - 주체가 없어 데이터베이스 주체로 실행할 수 없습니다.

  • 원인: 이 유형의 주체는 가장할 수 없습니다. 권한이 없을 때에도 발생합니다. CDC 메타데이터가 삭제되었거나 더 이상 db_owner 역할의 일부가 아닐 때 오류가 발생할 수 있습니다. CDC가 제대로 작동하려면 CDC schema, 변경 테이블, CDC 시스템 저장 프로시저, 기본 cdc user 권한(sys.database_principals)과 같은 CDC 메타데이터를 수동으로 수정하거나 cdc user 이름을 바꿔서는 안 됩니다.

  • 권장 사항: cdc 사용자가 데이터베이스에 있고 해당 사용자에게 db_owner 역할이 할당되었는지 확인하세요. cdc 사용자를 만들려면 CDC 사용자 만들기 및 역할 할당 예시를 참조하세요.

오류 18807 - 복제본(replica) 시스템 테이블의 개체 ID를 찾을 수 없습니다.

  • 원인: SQL Server가 복제본(replica)시스템 테이블 '%s'을 찾거나 액세스할 수 없는 경우 이 오류가 발생합니다. 테이블이 없거나 연결할 수 없을 때 발생할 수 있는 오류입니다. CDC가 제대로 작동하려면 CDC schema, 변경 테이블, CDC 시스템 저장 프로시저, 기본 cdc user 권한(sys.database_principals)과 같은 CDC 메타데이터를 수동으로 수정하거나 cdc user 이름을 바꿔서는 안 됩니다.

  • 권장 사항: 시스템 테이블이 있고 쿼리하여 직접 이 시스템 테이블을 액세스할 수 있는지 확인해 보세요. sys.objects 시스템 카탈로그를 쿼리하고, 조건자 절을 is_ms_shipped=1schema_name=cdc(으)로 설정하고, 모든 CDC 관련 개체를 나열하세요. 쿼리가 개체를 반환하지 않으면 데이터베이스에 CDC를 비활성화한 다음 다시 활성화하세요. 데이터베이스의 변경 데이터 캡처를 활성화하면 cdc schema, cdc user, 메타데이터 테이블 및 기타 시스템 개체가 만들어집니다. 데이터베이스에 CDC를 활성화한 후 개별 테이블의 CDC를 수동으로 다시 활성화해야 합니다.

Error 21050 - sysadmin 멤버 또는 db_owner 고정 서버버 역할의 멤버만 이 작업을 수행할 수 있습니다.

  • 원인: cdc 사용자가 db_owner 데이터베이스 역할 또는 sysadmin 서버 역할에서 제거되었습니다.

  • 권장 사항: cdc 사용자에게 db_owner 역할이 할당되었는지 확인하세요. cdc 사용자를 만들려면 CDC 사용자 만들기 및 역할 할당 예시를 참조하세요.

데이터베이스 공간 관리

오류 1105 - 파일 그룹에 공간이 없어서 데이터베이스의 개체에 공간을 할당할 수 없습니다.

  • 원인: 이 오류는 데이터베이스의 주 파일 그룹의 공간이 부족하여 SQL Database가 해당 파일 그룹 내의 개체(예: 테이블 또는 인덱스)에 더 많은 공간을 할당할 수 없을 때 발생합니다.

  • 권장 사항: 이 문제를 해결하려면 데이터베이스 내에 불필요한 데이터를 삭제하여 공간을 확보하세요. 파일 그룹에서 사용하지 않는 테이블, 인덱스 또는 안전하게 제거할 수 있는 다른 개체를 찾아 보세요. 자세한 내용은 Azure SQL 데이터베이스의 데이터베이스 파일 공간 관리를 참조하세요.

    불필요한 데이터/개체 삭제를 할 수 없는 경우, 더 높은 데이터베이스 계층으로 확장하는 것을 권장합니다.

Important

Azure SQL 데이터베이스(단일 데이터베이스) 컴퓨팅 크기(SLO)에 대한 자세한 내용은 vCore 구매 모델을 사용하는 단일 데이터베이스의 리소스 제한DTU 구매 모델(Azure SQL 데이터베이스)을 사용하는 단일 데이터베이스의 리소스 제한 사항을 참조하세요.

Error 1132 - 탄력적 풀이 스토리지 용량 한도에 도달했습니다.

  • 원인: 이 오류는 탄력적 풀의 스토리지 사용량이 할당된 제한을 초과했을 때 발생합니다.

  • 권장 사항: 이 문제를 해결하려면 필요한 데이터만 탄력적 풀의 일부인 데이터베이스에 유지할 수 있도록 데이터 보관 및 제거 전략을 구현해야 합니다. 공간 사용률을 면밀히 모니터링하세요. 자세한 내용은 Azure SQL 데이터베이스 파일 공간 관리를 참조하세요.

    불필요한 데이터/개체를 아카이빙하거나 삭제할 수 없는 경우, 더 높은 데이터베이스 계층으로 확장하는 것을 권장합니다.

CDC 제한 사항

Error 2628 - 테이블의 문자열이나 이진 데이터가 잘립니다.

  • 원인: DDL 문을 사용하여 CDC 사용 테이블의 열 크기를 변경할 경우 후속 CDC 캡처 프로세스에서 문제가 발생할 수 있습니다. sys.dm_cdc_errors DMV(동적 관리 뷰)는 오류 번호 2628 및 8115와 같은 보고된 문제에 대해 CDC를 검사 데 유용합니다.

  • 권장 사항: 열 크기를 변경하기 전에 변경 내용이 CDC 변경 테이블의 기존 데이터와 호환되는지를 확인하세요. 이 문제를 해결하려면 데이터베이스의 CDC를 비활성화했다가 다시 활성화해야 합니다. 데이터베이스 또는 테이블에 CDC를 활성화하는 법에 대한 자세한 내용은 이 문서의 Azure SQL 데이터베이스 CDC 활성화하기테이블 CDC 활성화하기를 참조하세요.

Error 22830 - 가장 컨텍스트의 기본 제공 함수 'SUSER_SNAME'은 해당 버전의 SQL Server에서 지원되지 않습니다.

  • 원인: 이 오류는 SUSER_SNAME()(을)를 create_table에 호출하는 콜이 있는 데이터베이스에 사용자 트리거가 있는 경우 CDC가 활성화된 동안 발생합니다. 다음 Transact-SQL 스크립트를 사용하여 트리거를 나열할 수 있습니다. 이 명령은 개체 트리거 및 이에 해당하는 object_id의 세부 정보를 제공합니다.

    SELECT name,
        object_id
    FROM sys.triggers
    WHERE parent_class_desc = 'DATABASE'
        AND is_disabled = 0;
    

    트리거 정의를 받으면 다음 스크립트를 사용하여 SYSTEM_USER에 수행되는 호출을 찾을 수 있습니다.

    SELECT OBJECT_DEFINITION(object_id) AS trigger_definition;
    
  • 권장 사항: 이 문제를 해결하려면 이전 스크립트에서 얻은 각 사용자 트리거에 대해 다음 단계를 수행합니다.

    • 트리거 비활성화
    • CDC 사용
    • 트리거 다시 활성화

자세한 내용은 DISABLE TRIGGER(Transact-SQL)를 참조하세요.

913 오류 - 시스템 CLR 데이터 형식의 테이블의 변경 내용을 처리할 때 CDC 캡처 작업이 실패했습니다.

  • 원인: 이 오류는 시스템 CLR 데이터 형식의 테이블에서 CDC를 사용하도록 설정하고, DML을 변경한 다음, CDC 캡처 작업이 다른 테이블과 관련된 변경 내용을 처리하는 동안 동일한 테이블에서 DDL을 변경할 때 발생합니다.

  • 권장 사항: 테이블의 DML을 정지시키고, 캡처 작업을 실행하여 변경 내용을 처리하고, 테이블에 DDL을 실행하고, 캡처 작업을 실행하여 DDL 변경 내용을 처리한 다음, DML 처리를 다시 사용하도록 설정하는 것입니다. 자세한 내용은 변경 내용 시 CDC 캡처 작업 실패를 참조하세요.

사용자 계정 만들기 및 역할 할당

cdc user(이)가 제거된 경우 사용자를 수동으로 다시 추가할 수 있습니다.

다음 T-SQL 스크립트를 사용하여 사용자(cdc)를 만들고 적절한 역할(db_owner)을 할당합니다.

IF NOT EXISTS (
    SELECT *
    FROM sys.database_principals
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] WITHOUT LOGIN
    WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

역할 멤버 자격 확인 및 추가

cdc 사용자가 sysadmin 또는 db_owner 역할에 속하는지 확인하려면 다음 T-SQL 쿼리를 실행합니다.

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

cdc 사용자가 두 역할에 속하지 않는 경우 다음 T-SQL 쿼리를 실행하여 cdc 사용자에게 db_owner 역할을 추가합니다.

EXEC sp_addrolemember 'db_owner' , 'cdc';