SQL Server sys.syscommittab tablodaki yinelenen anahtar satırları

Belirtiler

Bellek içi SYSCOMMITTABLE ve Microsoft SQL Server disk üzerindeki sys.syscommittab dosyasında karşılaştırdığınızda yinelenen anahtar satırları görebilirsiniz. Bu yinelenen değerler yedekleme ve denetim noktası işlemlerinin başarısız olmasına neden olabilir.

"Yinelenen anahtar satır benzersiz dizin 'si_xdes_id' ile 'sys.syscommittab' nesne olarak ekleyemezsiniz. Yinelenen anahtar değeri (KeyValue) ' dir.

Hata: 3999, önem derecesi: 17, durum: 1.

DBID DatabaseID 2601 hata nedeniyle, diske kaydetme tablo temizleme başarısız oldu. Daha fazla bilgi için errorlog denetleyin."

Neden

Bu sorun, SQL Server değişiklik izleme bilinen bir sorun nedeniyle oluşur.

Çözüm

Yinelenen anahtarlar neden Etkenler gidermek için durumunuza uygun olarak aşağıdaki düzeltmeleri birini uygulayın: düzeltme: değişiklik bu veritabanıhttp://support.microsoft.com/kb/2522893üzerinde düzeltme izlemeyi etkinleştirirseniz SQL Server 2008 veya SQL Server 2008 R2 veritabanı yedekleme işlemi başarısız olur: yedekleme başarısız olur SQL Server 2008, SQL Server 2008 R2 veya SQL Server 2012 değişiklik veritabanı http://support.microsoft.com/kb/2603910üzerinde düzeltme izlemeyi etkinleştirirseniz: SQL Server 2008'de Yedekleme işlemi başarısız , SQL Server 2008 R2 veya değişiklik bu düzeltmeler yinelenen anahtar satırlar görünmesi bunlar değil otomatik olarak Kaldır yinelenen satırları devam etmenizi önler, ancak http://support.microsoft.com/kb/2682488izlemeyi etkinleştirdikten sonra SQL Server 2012 veritabanı. Yinelenen satırları kaldırma, etkilenen veritabanı veritabanı kontrol noktaları tamamlayamıyor ve yedekleme işlemleri başarısız olabilir. Yinelenen satırları kaldırmak için aşağıdaki yöntemlerden birini kullanın.

Yöntem 1: Devre dışı bırakır ve değişiklik izlemeyi etkinleştir

  1. Değişiklik izleme etkilenen tablolar ve veritabanı devre dışı bırakın.

  2. El ile bir veritabanı denetim noktası sorunu.

  3. Değişiklik izleme etkilenen veritabanı ve tablolar üzerinde etkinleştirin.

Değişiklik izleme hakkında daha fazla bilgi için bkz: etkinleştirme ve değişiklik izlemeyi devre dışı. El ile denetim noktası sorun hakkında daha fazla bilgi için bkz: Denetim noktası (Transact-SQL)

Yöntem 2: Yinelenen satırları el ile silin.

  1. "Çözüm" bölümünde, sonunda Transact-SQL komut dosyasını bir metin düzenleyicisine kopyalayın.

  2. Komut dosyasında < AFFECTED_DB > yer tutucu bulun ve etkilenen veritabanı adını değiştirin.

  3. Değiştirilmiş komut dosyasını sabit diskinize bir .sql dosyası olarak kaydedin. Örneğin:

    C:\temp\remove_duplicates.sql

SQL Server 2014 kullanıyorsanız, her hizmet SID tam denetim mssqlsystemresource.ldf ve mssqlsystemresource.mdf dosyalarını vermeniz gerekir. Bunu yapmak için şu adımları izleyin:

  1. Kimliğinizi örneğine karşılık gelen Binn dizinine gidin Örneğin:

    C:\Program Files\Microsoft SQL Server\ < örnek kimliği > \MSSQL\Binn

  2. Mssqlsystemresource.ldf ve mssqlsystemresource.mdf özelliklerini açın ve sonra Güvenlik sekmesini tıklatın.

  3. SQL Server hizmeti her hizmet SID bulun ve Not varsayılan izinler:

    * Okuma ve yürütme

    *Read

  4. SQL Server hizmeti vermek her hizmet SID tam denetim ve izinleri iletişim kutularını kapatın.

  5. SQL Server tek kullanıcı modunda başlatın. Daha fazla bilgi için bkz: SQL Server tek kullanıcı modunda başlatın.

  6. SQL Server altında adanmış yönetici bağlantısı (DAC) bağlanmak için sqlcmd komut satırını kullanın. Örneğin:

    sqlcmd -S PRODSERV1\MSSQLSERVER - A -E -i c:\temp\remove_duplicates.sqlSonra değiştirilen Transact-SQL komut dosyasını yürütün.

  7. SQL Server birden çok kullanıcılı modda başlatın ve sonra yedekleme ve etkilenen veritabanı denetim noktası işlemleri başarıyla tamamlamak doğrulayın. 4. adım kullanıldıysa, izinleri varsayılan değerlerine döner.

Transact-SQL komut dosyası

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

Daha fazla yardıma mı ihtiyacınız var?

Yeteneklerinizi geliştirin
Eğitimleri keşfedin
Yeni özellikleri ilk olarak siz edinin
Microsoft Insider 'a katılın

Bu bilgi yardımcı oldu mu?

Geri bildiriminiz için teşekkür ederiz!

Geri bildiriminiz için teşekkürler! Office destek temsilcilerimizden biriyle görüşmeniz yararlı olabilir.

×