Righe di chiave duplicate dalla tabella sys.syscommittab in SQL Server

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 3083381
Sintomi
Quando si confrontano le SYSCOMMITTABLE in memoria e il file su disco sys.syscommittab in Microsoft SQL Server, si possono vedere le righe di chiave duplicate. Questi valori duplicati possono causare operazioni di backup e del punto di arresto l'esito negativo.

Cause
Questo problema si verifica a causa di un problema noto di rilevamento delle modifiche di SQL Server.
Risoluzione
Per risolvere i fattori che causano le chiavi duplicate, applicare una delle seguenti correzioni, come appropriato alla situazione:

FIX: Un'operazione di backup su un database di SQL Server 2008 o SQL Server 2008 R2 non riesce se si attiva sul database di rilevamento delle modifiche
http://support.microsoft.com/kb/2522893

FIX: Backup non riesce in SQL Server 2008 R2, SQL Server 2008 o SQL Server 2012 se si attiva sul database di rilevamento delle modifiche
http://support.microsoft.com/kb/2603910

Correzione: Operazione di Backup non riesce in un database di SQL Server 2008 R2, SQL Server 2008 o SQL Server 2012 dopo aver attivato il rilevamento delle modifiche
http://support.microsoft.com/kb/2682488

Sebbene queste correzioni righe di chiave duplicate non potrà continuare a visualizzare, essi non vengono rimossi automaticamente le righe duplicate. Senza rimuovere le righe duplicate, il database interessato non può completare i checkpoint del database e backup potrebbero non riuscire.

Per rimuovere le righe duplicate, utilizzare uno dei metodi descritti di seguito.

Metodo 1: Disattivare e attivare il rilevamento delle modifiche

  1. Disattivare le tabelle interessate e database di rilevamento delle modifiche.
  2. Emettere un CHECKPOINT manuale del database.
  3. Attiva sul database interessato e tabelle di rilevamento delle modifiche.

Per ulteriori informazioni sul rilevamento delle modifiche, vedereAttivare e disattivare il rilevamento delle modifiche.

Per informazioni su come eseguire un'istruzione CHECKPOINT manuale, vedere CHECKPOINT (Transact-SQL)

Metodo 2: Eliminare manualmente le righe duplicate

  1. Copiare lo script Transact-SQL alla fine della sezione "Risoluzione" in un editor di testo.
  2. Individuare il <AFFECTED_DB>nello script, segnaposto e sostituirlo con il nome del database interessato.</AFFECTED_DB>
  3. Salvare lo script modificato sul disco rigido come file con estensione SQL. Ad esempio:
    C:\temp\remove_duplicates.SQL
Se si esegue SQL Server 2014, è necessario concedere il controllo completo del SID al servizio per i file mssqlsystemresource.ldf e mssqlsystemresource.mdf. TODO, attenersi alla seguente procedura:
  1. Passare alla directory Binn che corrisponde al tuo ID di istanza. Ad esempio:

    C:\Program Files\Microsoft SQL Server<Instance id="">\MSSQL\Binn</Instance>
  2. Aprire la finestra delle proprietà mssqlsystemresource.ldf e mssqlsystemresource.mdf e quindi fare clic sulla scheda protezione .
  3. Individuare il SID al servizio di servizio di SQL Server e notare le autorizzazioni predefinite:

    * Leggere & esecuzione
    * Lettura
  4. Il servizio SQL Server di concedere il controllo completo di SID di servizio e quindi chiudere le finestre di dialogo autorizzazioni.
  5. Avviare SQL Server in modalità utente singolo. Per ulteriori informazioni, vedereAvviare SQL Server in modalità utente singolo.
  6. Adoperare SQLCMDriga di comando per connettersi a SQL Server in amministratore connessione dedicata (DAC). Ad esempio:

    SQLCMD -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sql
    Quindi, eseguire lo script Transact-SQL modificato.
  7. Avviare SQL Server in modalità multiutente e verificare che operazioni di backup e CHECKPOINT nel database interessato completano. Se è stato utilizzato il passaggio 4, ripristinare le autorizzazioni per i valori predefiniti.

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

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 3083381 - Ultima revisione: 09/25/2015 15:30:00 - Revisione: 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 KbMtit
Feedback