SQL Server sys.syscommittab 테이블에서 중복 키 행

이 문서는 Microsoft 기계 번역 소프트웨어를 이용하여 번역되었으며 Microsoft Community에 의한 Community Translation Framework(CTF) 기술 혹은 사람이 번역한 내용에 의하여 사후 편집될 수 있습니다. Microsoft는 Knowledge Base에 있는 모든 문서에 다양한 언어로 접근할 수 있도록 하기 위하여 기계 번역, 사람에 의한 번역 및 커뮤니티가 편집한 내용을 모두 제공합니다. 번역된 문서는 어휘, 구문 및/혹은 문법에 오류가 있을 수 있습니다. Microsoft는 번역 오류로 인한 부정확성, 오류 및/또는 손해와 이를 고객이 사용하는 데에 대하여 책임을 지지 않습니다.

이 문서의 영문 버전 보기:3083381
현상
Microsoft SQL Server 디스크에 있는 sys.syscommittab 파일과 메모리 SYSCOMMITTABLE를 비교 하는 경우 중복 키 행을 볼 수 있습니다. 이러한 중복 값 백업 및 검사점 작업이 실패할 발생할 수 있습니다.

원인
이 문제는 SQL Server 변경 내용 추적에서 알려진된 문제로 인해 발생 합니다.
해결 방법
중복 된 키를 발생 시키는 요소를 해결 하려면 상황에 맞게 다음 수정 프로그램 중 하나를 적용:

FIX: 변경 추적에서이 데이터베이스를 사용 하면 SQL Server 2008 또는 SQL Server 2008 R2 데이터베이스에 대 한 백업 작업이 실패 한다
http://support.microsoft.com/kb/2522893

FIX: 변경 내용 추적 데이터베이스를 사용 하면 백업을 SQL Server 2008, SQL Server 2008 R2 또는 SQL Server 2012에서 실패
http://support.microsoft.com/kb/2603910

FIX: 변경 내용 추적을 사용 하도록 설정한 후 백업 작업이 SQL Server 2008, SQL Server 2008 R2 또는 SQL Server 2012 데이터베이스 실패
http://support.microsoft.com/kb/2682488

이러한 수정 프로그램 중복 키 행을 표시를 방지 하지만 제거 하지 않습니다 자동으로 중복 된 행. 중복 행을 제거 하지 않고 삭제할된 데이터베이스는 데이터베이스 검사점을 완료할 수 없습니다 하 고 백업이 실패할 수 있습니다.

중복 행을 제거 하려면 다음 방법 중 하나를 사용 합니다.

방법 1: 해제 하 고 변경 내용 추적 설정

  1. 변경 영향을 받는 테이블 및 데이터베이스에 대 한 추적을 비활성화 합니다.
  2. 데이터베이스 수동 검사점을 발급 합니다.
  3. 변경 영향을 받는 데이터베이스와 테이블에 추적을 사용 합니다.

변경 내용 추적에 대 한 자세한 내용은 참조 하십시오.설정 및 변경 내용 추적 해제.

수동 검사점을 실행 하는 방법에 대 한 정보를 참조 하십시오. 검사점 (거래 SQL)

방법 2: 중복 된 행을 수동으로 삭제

  1. "해결 방법" 섹션의 끝에 Transact SQL 스크립트를 텍스트 편집기에 복사 합니다.
  2. 찾아는 <AFFECTED_DB>스크립트에서 개체 틀의 영향을 받는 데이터베이스 이름으로 바꿉니다.</AFFECTED_DB>
  3. 수정된 된 스크립트를.sql 파일로 하드 디스크에 저장 합니다. 예를 들어:
    C:\temp\remove_duplicates.sql
2014 SQL Server를 실행 하는 경우 mssqlsystemresource.ldf 및 mssqlsystemresource.mdf 파일에 서비스 당 SID 모든 권한을 부여 해야 합니다. Todo, 다음이 단계를 수행 합니다.
  1. 인스턴스 id.에 해당 하는 Binn 디렉터리로 이동 예를 들어:

    C:\Program 서식 SQL Server\<Instance id="">\MSSQL\Binn</Instance>
  2. Mssqlsystemresource.ldf 및 mssqlsystemresource.mdf를 속성을 열고 보안 탭을 클릭 합니다.
  3. SQL Server 서비스-서비스 SID를 찾아 기본 사용 권한을 적어 둡니다.

    * 읽기 & 실행
    * 읽기
  4. SQL Server 서비스를 부여 서비스 당 SID 모든 권한 및 다음 사용 권한 대화 상자를 닫습니다.
  5. 단일 사용자 모드로 SQL Server 시작 합니다. 자세한 내용은 참조 하십시오.단일 사용자 모드에서 SQL Server 시작 합니다..
  6. 예제 sqlcmd전용 관리자 연결 (DAC)에서 SQL Server 연결할 명령줄입니다. 예를 들어:

    sqlcmd-S PRODSERV1\MSSQLSERVER-A-E-i c:\temp\remove_duplicates.sql
    그런 다음 수정된 된 Transact SQL 스크립트를 실행 합니다.
  7. 다중 사용자 모드로 SQL Server 시작 하 고 백업 및 영향을 받는 데이터베이스에 대해 검사점 작업 성공적으로 완료를 확인 합니다. 4 단계를 사용 하는 경우 사용 권한을 기본값으로 되돌립니다.

트랜잭션 SQL 스크립트

--Create a temporary database to store the necessary rows required to remove the duplicate dataif exists(select 1 from sys.databases where name = 'dbChangeTrackingMetadata')begindrop database dbChangeTrackingMetadataendgocreate database dbChangeTrackingMetadatago --Table to store the contents of the SYSCOMMITTABLEuse dbChangeTrackingMetadatagocreate table dbo.t_SYSCOMMITTABLE (commit_ts bigint,xdes_id bigint,commit_lbn bigint,commit_csn bigint,commit_time datetime)go --Table to store the duplicate rows to be removed from the sys.syscommittab tablecreate table dbo.t_syscommittab (commit_ts bigint,xdes_id bigint,commit_lbn bigint,commit_csn bigint,commit_time datetime,dbfragid int)go --Enable the usage of OPENROWSETexec sys.sp_setbuildresource 1go --Change <AFFECTED_DB> to the database that contains the duplicate valuesUSE <AFFECTED DB>godeclare @rowcount bigintSET @rowcount = 0 --Copy all rows from the SYSCOMMITTABLE into the temporary databaseinsert into dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLESELECT commit_ts, xdes_id, commit_lbn, commit_csn, commit_timeFROM OpenRowset (table SYSCOMMITTABLE, db_id (), 0, 0) --Save the duplicate values into the temporary databaseinsert into dbChangeTrackingMetadata.dbo.t_syscommittabselect ondisk_ct.* from sys.syscommittab as ondisk_ctjoin dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLE as inmem_cton ondisk_ct.xdes_id = inmem_ct.xdes_id --Delete the duplicate valuesdelete from sys.syscommittabwhere xdes_id in ( select xdes_id from dbChangeTrackingMetadata.dbo.t_syscommittab )set @rowcount = @@rowcountif (@rowcount > 0)beginprint ''print 'DELETED '+CAST(@rowcount as NVARCHAR(10))+' rows from sys.syscommittab that were also stored in SYSCOMMITTABLE'print ''endelsebeginprint ''print 'Failed to DELETE DUP rows from sys.syscommittab'print ''endexec sys.sp_setbuildresource 0go

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 3083381 - 마지막 검토: 09/25/2015 15:31:00 - 수정: 2.0

Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 R2 Standard, Microsoft SQL Server 2008 R2 Developer, Microsoft SQL Server 2008 R2 Enterprise, Microsoft SQL Server 2008 R2 Workgroup, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise, Microsoft SQL Server 2012 Web, Microsoft SQL Server 2014 Standard, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Web

  • kbmt KB3083381 KbMtko
피드백