Rândurile cheie dublate din tabel sys.syscommittab în SQL Server

IMPORTANT: Acest articol este tradus cu ajutorul software-ului Microsoft de traducere automată și poate fi corectat prin intermediul tehnologiei Community Translation Framework (CTF). Microsoft oferă articole traduse automat, post-editate de comunitate și articole traduse de oameni, pentru a permite accesul la toate articolele din Baza noastră de cunoștințe în mai multe limbi. Articolele traduse automat și post-editate pot conține greșeli de vocabular, sintaxă și/sau gramatică. Microsoft nu este responsabil de inexactitățile, erorile sau daunele cauzate de traducerea greșită a conținutului sau de utilizarea acestuia de către clienți. Găsiți mai multe informații despre traducerea în colaborare la http://support.microsoft.com/gp/machine-translation-corrections/ro.

Faceți clic aici pentru a vizualiza versiunea în limba engleză a acestui articol: 3083381
Simptome
Atunci când comparaţi SYSCOMMITTABLE în memorie și fișierul pe disc sys.syscommittab în Microsoft SQL Server, este posibil să vedeți rândurile cheie dublate. Aceste valori dublate poate provoca operațiuni de copiere de rezervă și punct de control să nu reușească.

Cauză
Această problemă se produce din cauza unei probleme cunoscute în urmărirea modificărilor SQL Server.
Rezoluţie
Pentru a rezolva factori care provoca tastele dublate, se aplică una dintre următoarele remedieri, în funcție de situația dvs.:

Remediere: O operațiune de copiere de rezervă pe o bază acoperire de date SQL Server 2008 sau SQL Server 2008 R2 nu reușește dacă activaţi această bază acoperire de date urmărirea modificărilor
http://support.Microsoft.com/kb/2522893

Remediere: copiere de rezervă nu reușește în SQL Server 2008, SQL Server 2008 R2 sau SQL Server 2012 dacă activați modificare în baza acoperire de date de urmărire
http://support.Microsoft.com/kb/2603910

Remediere: Operațiune de copiere de rezervă nu reușește în baza acoperire de date SQL Server 2008, SQL Server 2008 R2 sau SQL Server 2012 după ce activați modificare urmărire
http://support.Microsoft.com/kb/2682488

Deși aceste remedieri rândurile dublate cheie împiedica Urmărire să apară, ei nu elimina automat rândurile dublate. Fără a o elimina rândurile dublate, baza acoperire de date afectate nu poate finaliza bazei acoperire de date de puncte de control și copiile de rezervă pot să nu reușească.

Pentru a elimina rândurile dublate, utilizați una dintre următoarele metode.

Metoda 1: Dezactivează și activează modificare urmărire

  1. Dezactivați modificare de urmărire afectate tabele și baze acoperire de date.
  2. Problemă la o bază acoperire de date manual punct de control.
  3. Activați modificare în baza acoperire de date afectate și tabele de urmărire.

Pentru mai multe informații despre modificarea urmărire, consultațiActivați și dezactivați modificare urmărire.

Pentru informații despre cum să emită un punct de verificare manuală, consultați punct de control (Transact-SQL)

Metoda 2: Ștergerea manuală a rândurilor dublate

  1. Copiați scriptul Transact-SQL la sfârșitul "Rezolvare" într-un editor de text.
  2. Găsiți <AFFECTED_DB>substituent în scriptul, și se înlocuiește cu nume de sign-in bazei acoperire de date afectate.</AFFECTED_DB>
  3. Salvați scriptul modificată de pe hard disk ca fișier .sql. De exemplu:
    C:\temp\remove_duplicates.SQL
Dacă executaţi SQL Server 2014, trebuie să acorde per-serviciu de SID control complet asupra fișierelor mssqlsystemresource.ldf și mssqlsystemresource.mdf. Este de făcut acest lucru, urmați acești pași:
  1. Navigaţi la directorul Binn care corespunde cu ID-ul instanță. De exemplu:

    C:\Program Files\Microsoft SQL Server\<Instance id="">\MSSQL\Binn</Instance>
  2. Deschideți proprietățile pentru mssqlsystemresource.ldf și mssqlsystemresource.mdf, și apoi faceți clic pe fila securitate .
  3. Localizați serviciul SQL Server per Service SID și notați permisiunile implicite:

    * Citi & executa
    * Citire
  4. Acordaţi serviciul SQL Server per Service Control total SID, și apoi închideți permisiunile casete de dialog.
  5. Porniți SQL Server în mod utilizator unic. Pentru mai multe informații, consultațiPorniți SQL Server în mod utilizator unic.
  6. Usea Sqlcmdlinia Către de comandă pentru a vă conecta la SQL Server sub dedicate Administrator conexiune (DAC). De exemplu:

    Sqlcmd -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sql
    Apoi, executați scriptul modificată Transact-SQL.
  7. Porniți SQL Server în mod multi-utilizator și apoi verificați că copierea de rezervă și operațiuni de punct de verificare împotriva bazei acoperire de date afectate terminat cu succes. Dacă s-a utilizat Pasul 4, reveniți permisiunile la valorile implicite.

Transact-SQL script

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

Avertisment: acest articol a fost tradus automat

Proprietăți

ID articol: 3083381 - Ultima examinare: 09/26/2015 08:17:00 - Revizie: 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 KbMtro
Feedback