在 SQL Server 中的 sys.syscommittab 資料表中重複索引鍵的資料列

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:3083381
徵狀
比較時於記憶體 SYSCOMMITTABLE 和 Microsoft SQL Server 中的磁碟上的 sys.syscommittab 檔案,您可能會看到重複的索引鍵資料列。這些重複的值可能會造成備份和檢查點作業失敗。

發生的原因
之所以發生這個問題,是因為 SQL Server 變更追蹤已知的問題。
解決方案
若要解決導致重複的索引鍵的因素,套用下列修正程式,以適合您情況的其中一個:

修正: 在 SQL Server 2008年或 SQL Server 2008 R2 的資料庫上的備份作業失敗,如果您啟用這個資料庫的歷程
http://support.microsoft.com/kb/2522893

修正: 備份無法在 SQL Server 2008年、 SQL Server 2008 R2 或 SQL Server 2012年如果您啟用變更追蹤的資料庫
http://support.microsoft.com/kb/2603910

修正: 備份作業失敗的 SQL Server 2008年]、 [SQL Server 2008 R2 或 [SQL Server 2012年資料庫中啟用追蹤修訂後
http://support.microsoft.com/kb/2682488

雖然這些修正程式會導致重複的索引鍵資料列,無法繼續出現,它們並不會自動移除重複的資料列。而不要移除重複的資料列受影響的資料庫不能完成資料庫檢查點,且備份可能會失敗。

若要移除重複的資料列,請使用下列方法之一。

方法 1: 停用及啟用變更追蹤

  1. 停用追蹤受影響的資料表與資料庫的變更。
  2. 發出手動進行資料庫檢查點。
  3. 啟用 [追蹤] 將受影響的資料庫和資料表的變更。

如需有關變更追蹤的詳細資訊,請參閱啟用和停用變更追蹤.

如需有關如何發出手動檢查點的資訊,請參閱 檢查點 (交易 SQL)

方法 2: 以手動方式刪除重複的資料列

  1. 將在 < 解決方案 > 一節結尾處的考慮改用 SQL 指令碼複製到文字編輯器。
  2. 找出<AFFECTED_DB>的指令碼中的版面配置區,並使用受影響的資料庫名稱取代。</AFFECTED_DB>
  3. 將儲存修改過的指令碼到您的硬碟為.sql 檔案。例如:
    C:\temp\remove_duplicates.sql
如果您執行 SQL Server 2014年,您必須授與每個服務的 SID 完全控制的 mssqlsystemresource.ldf 和 mssqlsystemresource.mdf 的檔案。Todo,請依照下列步驟執行:
  1. 巡覽至 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. Usea sqlcmd連線到 SQL Server 專用的系統管理員連線 (DAC) 下的命令列。例如:

    sqlcmd-S PRODSERV1\MSSQLSERVER-A-E-i c:\temp\remove_duplicates.sql
    然後,執行修改過的考慮改用 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

警告:本文為自動翻譯

內容

文章識別碼:3083381 - 最後檢閱時間:09/26/2015 08:20: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 KbMtzh
意見反應