从 SQL Server 中的 sys.syscommittab 表的重复键行

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。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 文件的完全控制。托多这一点,请按照下列步骤操作:
  1. 导航到 Binn 目录对应于您的实例 id。例如:

    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若要连接到 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

属性

文章 ID:3083381 - 上次审阅时间:09/26/2015 08:19: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
反馈