CDC의 알려진 문제 및 오류

적용 대상:SQL ServerAzure SQL Managed Instance

이 문서에서는 SQL Server 및 Azure SQL Managed Instance에 대한 CDC(변경 데이터 캡처)의 알려진 문제 및 오류에 대해 설명합니다.

Azure SQL Database의 경우 Azure SQL Database의 CDC와 관련된 알려진 문제를 참조 하세요.

메타데이터 수정

CDC가 제대로 작동하려면 테이블 변경, CDC 시스템 저장 프로시저, 기본 cdc user 권한(sys.database_principals)과 같은 CDC schemaCDC 메타데이터를 수동으로 수정하거나 이름을 바꿔cdc user서는 안 됩니다.

속성이 설정된 1 sys.objects의 모든 개체is_ms_shipped 는 수정해서는 안 됩니다.

SELECT    name AS object_name   
        ,SCHEMA_NAME(schema_id) AS schema_name  
        ,type_desc  
        ,is_ms_shipped  
FROM sys.objects 
WHERE is_ms_shipped= 1 AND SCHEMA_NAME(schema_id) = 'cdc'

데이터 정렬 차이점

변경 데이터 캡처를 위해 구성된 테이블의 열과 데이터베이스 간에 데이터 정렬이 서로 다른 상황을 알고 있어야 합니다. CDC는 중간 스토리지를 사용하여 사이드 테이블을 채웁니다. 테이블에 데이터베이스 데이터 정렬과 다른 데이터 정렬이 있는 CHAR 또는 VARCHAR 열이 있고 해당 열이 ASCII가 아닌 문자(예: 더블 바이트 DBCS 문자)를 저장하는 경우 CDC는 변경된 데이터를 기본 테이블의 데이터와 일관되게 유지하지 못할 수 있습니다. 중간 스토리지 변수에 연결된 데이터 정렬이 있을 수 없기 때문입니다.

캡처된 변경 데이터가 기본 테이블과 일치하도록 하려면 다음 방법 중 하나를 고려합니다.

  • 비 ASCII 데이터를 포함하는 열에는 NCHAR 또는 NVARCHAR 데이터 형식을 사용합니다.

  • 또는 열 및 데이터베이스에 대해 동일한 데이터 정렬을 사용합니다.

예를 들어 SQL_Latin1_General_CP1_CI_AS 데이터 정렬을 사용하는 데이터베이스가 하나 있는 경우 다음 표를 고려합니다.

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 VARCHAR(10) collate Chinese_PRC_CI_AI)

CDC는 데이터 정렬이 다르기 때문에 C2 열에 대한 이진 데이터를 캡처하지 못할 수 있습니다(Chinese_PRC_CI_AI). NVARCHAR를 사용하여 이 문제를 방지합니다.

CREATE TABLE T1( 
     C1 INT PRIMARY KEY, 
     C2 NVARCHAR(10) collate Chinese_PRC_CI_AI --Unicode data type, CDC works well with this data type
     )

ADR(가속 데이터베이스 복구) 및 CDC(변경 데이터 Capure)

현재 CDC(변경 데이터 캡처)와 ADR(가속 데이터베이스 복구)을 모두 사용하도록 설정하는 것은 지원되지 않습니다. SQL Server에서 CDC(변경 데이터 캡처)를 사용하도록 설정하면 ADR의 적극적인 로그 잘림 기능이 비활성화됩니다. CDC 검사가 데이터베이스 트랜잭션 로그에 액세스하기 때문입니다. 활성 트랜잭션은 트랜잭션 커밋 및 CDC 검사가 catch되거나 트랜잭션이 중단될 때까지 트랜잭션 로그 잘림을 계속 유지합니다. 이로 인해 트랜잭션 로그가 평소보다 더 많이 채워지거나 사이드 테이블에 기록된 데이터 작업이 비정상이 되는 등 다양한 문제가 발생할 수 있습니다.

CDC를 사용하도록 설정하는 경우 다시 시작하는 인덱스 옵션을 사용하는 것이 좋습니다. 다시 시작 가능한 인덱스는 인덱스를 만들거나 다시 작성하기 위해 장기 실행 트랜잭션을 열어 둘 필요가 없으므로 이 작업 중에 로그 잘림이 가능하고 로그 공간 관리가 향상됩니다. 자세한 내용은 온라인 인덱스 작업에 대한 지침 - 다시 시작 가능한 인덱스 고려 사항을 참조하세요.

스키마 또는 명명된 cdc 사용자가 이미 있는 경우 CDC 사용이 실패합니다.

데이터베이스에서 CDC를 사용하도록 설정하면 새 스키마와 이름이 지정된 cdc사용자가 만들어집니다. 따라서 시스템 사용을 위해 예약되어 있으므로 사용자 지정 스키마 또는 명명된 cdc 사용자를 수동으로 만드는 것은 권장되지 않습니다.

CDC와 관련이 없는 사용자 지정 스키마 또는 데이터베이스에 명명된 cdc 사용자를 수동으로 정의한 경우 시스템 저장 프로시저 sys.sp_cdc_enable_db 가 아래 오류 메시지와 함께 데이터베이스에서 CDC를 사용하도록 설정하지 못합니다.

<database_name>'cdc'라는 데이터베이스 사용자 또는 'cdc'라는 스키마가 현재 데이터베이스에 이미 있으므로 변경 데이터 캡처에 대해 데이터베이스를 사용하도록 설정할 수 없습니다. 이러한 개체는 CDC에서만 필요합니다. 사용자 또는 스키마를 삭제하거나 이름을 바꾼 후 작업을 다시 시도하십시오.

이 문제를 해결하려면:

  • cdc 스키마와 cdc 사용자를 수동으로 삭제합니다. 그런 다음 데이터베이스에서 CDC를 사용하도록 설정할 수 있습니다.

ALTER COLUMN에서 VARCHAR 및 VARBINARY로의 CDC 실패

CDC 지원 테이블에 있는 열의 데이터 형식이 다른 행에서 TEXTVARCHARIMAGEVARBINARY 또는 다른 행으로 변경되고 기존 행이 행에서 벗어난 값으로 업데이트되는 경우 업데이트 후 CDC 검사에서 오류가 발생합니다.

원본 테이블에 대한 DDL 변경 내용

DDL 문을 사용하여 CDC 지원 테이블의 열 크기를 변경하면 후속 CDC 캡처 프로세스에 문제가 발생하여 오류 2628 또는 오류 8115가 발생할 수 있습니다. CDC 변경 테이블의 데이터는 사용자 구성 설정에 따라 유지됩니다. 따라서 열 크기를 변경하기 전에 변경 내용이 CDC 변경 테이블의 기존 데이터와 호환되는지 여부를 평가해야 합니다.

sys.dm_cdc_errors 변경 테이블에 대한 오류 2628 또는 오류 8115로 인해 검사가 실패했음을 나타내는 경우 먼저 영향을 받는 변경 테이블에서 변경 데이터를 사용해야 합니다. 그런 다음, 문제를 효과적으로 해결하려면 테이블에서 CDC 를 사용하지 않도록 설정한 다음 다시 활성화해야 합니다.

데이터 계층 가져오기/내보내기 및 추출/게시 작업을 사용하여 데이터베이스 가져오기

CDC 사용 SQL 데이터베이스의 경우 SqlPackage, SSDT 또는 기타 SQL 도구를 사용하여 가져오기/내보내기 또는 추출/게시 cdc 하는 경우 스키마와 사용자가 새 데이터베이스에서 제외됩니다. 가져오기/내보내기 및 추출/배포 작업에 포함되지 않은 다른 CDC 개체에는 sys.objects로 표시된 is_ms_shipped=1 테이블이 포함됩니다.

CDC를 사용하도록 설정하지 않고 새 데이터베이스를 가져오거나 설정하는 가져오기/내보내기 및 추출/배포 작업에서도 제외되는 사용자 지정 스키마 또는 데이터베이스에 명명 cdc 된 사용자를 정의한 경우에도 해당합니다.

변수를 사용하여 파티션 전환

데이터베이스 또는 CDC(변경 데이터 캡처)가 있는 테이블에서 파티션 전환과 함께 변수를 사용하는 것은 문에서 ALTER TABLE ... SWITCH TO ... PARTITION ... 지원되지 않습니다. 자세한 내용은 파티션 전환 제한 사항을 참조하세요.

오류 문제 해결

이 섹션에서는 SQL Server의 CDC 및 Azure SQL Managed Instance와 관련된 오류를 해결합니다. CDC 관련 오류는 캡처 프로세스의 적절한 작동을 방해하고 데이터베이스 트랜잭션 로그의 확장으로 이어질 수 있습니다.

이러한 오류를 검사하려면 동적 관리 뷰 sys.dm_cdc_errors 쿼리할 수 있습니다. sys.dm_cdc_errors 동적 관리 뷰에서 오류를 반환하는 경우 다음 섹션을 참조하여 완화 단계를 이해합니다.

참고 항목

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

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

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

수정된 메타데이터

오류 200/208 - 잘못된 개체 이름

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

  • 권장 사항: 이 문제를 해결하려면 데이터베이스에 CDC를 사용하지 않도록 설정하고 다시 사용하도록 설정해야 합니다. 데이터베이스에 대해 변경 데이터 캡처를 사용하도록 설정하면 데이터베이스에 대한 cdc 스키마, cdc 사용자, 메타데이터 테이블 및 기타 시스템 개체가 만들어집니다.

참고 항목

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

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

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

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

오류 15517 - 보안 주체가 없기 때문에 데이터베이스 보안 주체로 실행할 수 없습니다.

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

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

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

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

  • 권장 사항: 테이블을 직접 쿼리하여 시스템 테이블이 존재하고 액세스할 수 있는지 확인합니다. sys.objects 시스템 카탈로그를 쿼리하고 is_ms_shipped=1 및 schema_name='cdc'를 사용하여 조건자 절을 설정하여 모든 CDC 관련 개체를 나열합니다. 쿼리에서 개체를 반환하지 않는 경우 데이터베이스에 CDC를 사용하지 않도록 설정한 다음 다시 사용하도록 설정해야 합니다. 데이터베이스에 변경 데이터 캡처를 사용하도록 설정하면 데이터베이스에 대한 cdc 스키마, cdc 사용자, 메타데이터 테이블 및 기타 시스템 개체가 만들어집니다.

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

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

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

데이터베이스 공간 관리

오류 1105 - 파일 그룹이 가득 찼기 때문에 데이터베이스의 개체 공간을 할당할 수 없습니다.

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

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

    불필요한 데이터/개체 삭제가 옵션이 아닌 경우 데이터베이스 트랜잭션 로그에 더 많은 공간을 할당하는 것이 좋습니다. 트랜잭션 로그 관리에 대한 자세한 내용은 SQL Server 트랜잭션 로그 아키텍처 및 관리 가이드를 참조 하세요.

CDC 제한 사항

오류 2628 - 테이블에서 문자열 또는 이진 데이터가 잘립니다.

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

  • 권장 사항: 열 크기를 변경하기 전에 변경 내용이 CDC 변경 테이블의 기존 데이터와 호환되는지 여부를 평가해야 합니다. 이 문제를 해결하려면 데이터베이스에 CDC를 사용하지 않도록 설정하고 다시 사용하도록 설정해야 합니다. 데이터베이스 또는 테이블에 CDC를 사용하도록 설정하는 방법에 대한 자세한 내용은 데이터베이스에 CDC 사용 및 테이블에 CDC 사용 설정을 참조하세요.

오류 913 - 시스템 CLR 데이터 형식을 사용하여 테이블에 대한 변경 내용을 처리할 때 CDC 캡처 작업이 실패함

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

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

사용자 만들기 및 역할 할당

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

다음 T-SQL 스크립트를 사용하여 사용자를 만들고() 동일한(cdcdb_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';

역할 멤버 자격 확인 및 추가

사용자가 해당 또는 db_owner 역할에 속하는지 cdcsysadmin 확인하려면 다음 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';

다음 단계

  • SQL Server CDC에 대한 개요는 CDC(변경 데이터 캡처)란?을 참조 하세요.
  • Azure SQL Database의 CDC에 대한 알려진 문제 및 제한 사항에 대한 자세한 내용은 AZURE SQL Database의 CDC 알려진 문제 및 제한 사항을 참조 하세요.
  • CDC를 사용하거나 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 변경 데이터 캡처 사용 및 사용 안 함을 참조 하세요.