다음을 통해 공유


CDC의 알려진 문제 및 오류

적용 대상: SQL Server Azure SQL Managed Instance

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

Azure SQL 데이터베이스의 경우 Azure SQL 데이터베이스의 CDC와 관련된 알려진 문제를 참조하세요.

메타데이터 수정

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

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

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(변경 데이터 캡처)

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

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

cdc(이)라는 이름의 스키마 또는 사용자가 이미 있는 경우 CDC 사용이 실패합니다.

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

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

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

이 문제를 해결하려면:

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

ALTER COLUMN을 VARCHAR 및 VARBINARY로 변경 후 CDC 실패

CDC 사용 테이블에 있는 열의 데이터 형식이 TEXT에서 VARCHAR로 또는 IMAGE에서 VARBINARY로 변경되고 기존 행이 행이 다른 값으로 업데이트되는 경우 업데이트 후 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 schema, 변경 테이블, CDC 시스템 저장 프로시저, 기본 cdc user 권한(sys.database_principals)과 같은 CDC 메타데이터를 수동으로 수정하거나 cdc user 이름을 바꿔서는 안 됩니다.

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

참고 사항

sys.objects 시스템 카탈로그 뷰에 있는 개체를 is_ms_shipped=1 and schema_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=1 and schema_name='cdc'로 설정하고, 모든 CDC 관련 개체를 나열하세요. 쿼리가 개체를 반환하지 않으면 데이터베이스에 CDC를 비활성화한 다음 다시 활성화하세요. 데이터베이스의 변경 데이터 캡처를 활성화하면 데이터베이스의 CDC 스키마, CDC 사용자 메타데이터 테이블 및 기타 시스템 개체가 만들어집니다.

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

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

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

데이터베이스 공간 관리

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

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

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

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

CDC 제한 사항

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

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

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

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';

다음 단계