KB3095958 - FIX: 테이블 파티션을 전환하고 해당 파일 및 파일 그룹을 삭제한 후 메타데이터 불일치 오류 발생

적용 대상
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

증상

다음 시나리오를 고려하세요.

  • Microsoft SQL Server 2014에는 두 개의 분할된 테이블이 있으며 첫 번째 테이블의 파티션은 동일한 파티션 구성표 및 함수를 사용하여 다른 파일 및 파일 그룹에 매핑됩니다.
  • 파티션 중 하나를 두 번째 테이블로 전환한 다음 두 번째 테이블을 잘라냅니다.
  • 전환된 파티션에 매핑된 파일 및 파일 그룹을 삭제합니다.
  • 두 번째 테이블에서 SELECT 문을 실행합니다.

이 경우 다음과 유사한 내용의 오류 메시지가 나타납니다.

참고

메시지 606, 수준 21, 상태 1
메타데이터 불일치. 테이블 <테이블 이름>에 지정된 파일 그룹 ID<파일 그룹 ID>가 없습니다. DBCC CHECKDB 또는 CHECKCATALOG를 실행합니다.

DBCC CHECKDB/CHECKTABLE을 실행하면 다음과 같은 오류 메시지가 나타납니다.

참고

파일 그룹(파일 그룹 ID<, FileGroupNumber>)이 잘못되어 테이블 TableName>의 < 인덱스 <IndexName>을 처리할 수 없습니다.

해결 방법

이 문제는 다음과 같은 SQL Server 누적 업데이트에서 처음 해결되었습니다.

권장 사항: SQL Server용 최신 누적 업데이트 설치

SQL Server에 대한 각각의 새로운 누적 업데이트에는 이전 누적 업데이트에 포함된 모든 핫픽스와 모든 보안 수정 사항이 포함되어 있습니다. SQL Server용 최신 누적 업데이트를 다운로드하여 설치하는 것이 좋습니다.

      

        
참고: 이 수정 사항은 향후 이 문제가 발생할 수 없도록 합니다. 이 문제가 이미 발생 중인 경우 기존 메타데이터 손상 없이 새 데이터베이스로 데이터를 내보냅니다. 그러려면 다음 단계를 따르세요.

  1. 파티션에 잘못된 파일 그룹이 있는지 확인하려면 다음 쿼리를 실행하여 결과가 반환되는지 확인합니다.

    SELECT * FROM sys.allocation_units AS au WHERE au.data_space_id NOT IN (SELECT data_space_id FROM sys.filegroups)
    
  2. 메타데이터 손상이 있는 테이블을 다시 볼 수 있게 합니다.

    1단계의 쿼리가 결과를 반환하는 경우 메타데이터가 손상된 파티션으로 인해 테이블의 행을 보기(선택 *)할 수 없는 것입니다. 이 문제를 해결하려면 불량 파티션을 제거합니다.

    참고 잘못된 파티션은 비어 있어야 합니다. 그렇지 않으면 해당 파일이 있는 파일과 파일 그룹을 삭제하거나 삭제할 수 없습니다. 

    이렇게 하려면 이 파티션을 동일한 분할 체계를 사용하는 다른 테이블로 이동합니다. 이 테이블은 더미 테이블일 수 있습니다. 1단계의 쿼리에서 container_id 사용하여 sys.partitions의 partition_id와 일치시킵니다. (partition_number 기록해 두어야 합니다.) partition_number를 사용하여 더미 테이블까지 볼 수 없는 테이블에서 ALTER TABLE SWITCH PARTITION을 수행합니다. 더미 테이블은 동일한 열 집합을 가져야 하며 동일한 파티션 구성표를 사용해야 합니다. 일관성이 없는 파티션을 찾기 위한 쿼리는 다음과 유사할 수 있습니다.

    SELECT au.container_id, au.data_space_id, p.partition_number FROM sys.partitions AS p JOIN sys.allocation_units AS au ON p.partition_id = au.container_id LEFT JOIN sys.filegroups AS fgs ON fgs.data_space_id = au.data_space_id WHERE object_id = OBJECT_ID('MyTableName') AND fgs.data_space_id IS NULL;
    
  3. 이전에 볼 수 없었던 테이블에서 새 데이터베이스로 데이터를 복사합니다.

상태

Microsoft에서 이는 "적용 대상" 섹션에 나열된 Microsoft 제품에서의 문제임을 확인했습니다.