不能在具有唯一索引 'si_xdes_id' 的对象 'sys.syscommittab' 中插入重复键的行由于错误 2601,无法将该提交表刷新到 DBID 7 中的磁盘
广告:
sys.syscommittab
IT IT = 内部表
S = 系统表
INTERNAL_TABLE
消息 2601,级别 14,状态 1,过程 sp_flush_commit_table,行 15 [批起始行 0]
不能在具有唯一索引 'si_xdes_id' 的对象 'sys.syscommittab' 中插入重复键的行。
语句已终止。
消息 2601,级别 14,状态 1,过程 sp_flush_commit_table,行 15 [批起始行 0]
不能在具有唯一索引 'si_xdes_id' 的对象 'sys.syscommittab' 中插入重复键的行。
消息 3999,级别 17,状态 1,第 1 行
由于错误 2601,无法将该提交表刷新到 DBID 7 中的磁盘。有关详细信息,请查看错误日志。
参照:
https://learn.microsoft.com/zh-cn/troubleshoot/sql/database-engine/replication/duplicate-keys-sys-syscommittab-table#transact-sql-script
单用户启动sqlserver
当 SQL Server 以单用户模式启动时,它将跳过属于 AlwaysOn 可用性组(AG)的数据库的启动过程。 如果需要排查需要以单用户模式启动 SQL Server 的更改跟踪问题,并且启用了更改跟踪的数据库也是 AG 的一部分,则必须在单用户模式下启动 SQL Server 之前从 AG 中删除数据库,以便数据库联机
net start mssql$SQL2008 /m --如果提示拒绝访问 ,cmd请以管理员模式打开
或者
net start mssqlsqlserver /m
或者
下面的示例在单用户模式下启动 SQL Server 实例,并且只允许通过 SQL Server Management Studio 查询编辑器进行连接。
net start "SQL Server (MSSQLSERVER)" /m"Microsoft SQL Server Management Studio - Query"
例如:
net start mssql$SQL2008 /m
sqlcmd使用命令行连接到专用管理员连接 (DAC) 下的 SQL Server,并执行修改后的 Transact-SQL 脚本。 例如:
sqlcmd -S PRODSERV1\MSSQLSERVER -A -E -i c:\temp\remove_duplicates.sql
或者
sqlcmd -S .\sql2008 -A -E -i K:\temp\20250326\sql.sql
--以下内容保存为sql.sql
--Create a temporary database to store the necessary rows required to remove the duplicate data USE master GO IF EXISTS(SELECT 1 FROM sys.databases WHERE name = 'dbChangeTrackingMetadata') BEGIN DROP DATABASE dbChangeTrackingMetadata END GO CREATE DATABASE dbChangeTrackingMetadata GO --Table to store the contents of the SYSCOMMITTABLE USE dbChangeTrackingMetadata GO CREATE 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 table CREATE 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 OPENROWSET EXEC sys.sp_setbuildresource 1 GO --Change <AFFECTED_DB> to the database that contains the duplicate values USE MVC_Web GO DECLARE @rowcount BIGINT SET @rowcount = 0 --Copy all rows from the SYSCOMMITTABLE INTo the temporary database INSERT INTO dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLE SELECT commit_ts, xdes_id, commit_lbn, commit_csn, commit_time FROM OPENROWSET (table SYSCOMMITTABLE, db_id (), 0, 0) --Save the duplicate values INTo the temporary database INSERT INTO dbChangeTrackingMetadata.dbo.t_syscommittab SELECT ondisk_ct.* FROM sys.syscommittab as ondisk_ct JOIN dbChangeTrackingMetadata.dbo.t_SYSCOMMITTABLE as inmem_ct ON ondisk_ct.xdes_id = inmem_ct.xdes_id --Delete the duplicate values DELETE FROM sys.syscommittab WHERE xdes_id in ( SELECT xdes_id from dbChangeTrackingMetadata.dbo.t_syscommittab ) SET @rowcount = @@rowcount IF (@rowcount > 0) BEGIN PRINT '' PRINT 'DELETED '+CAST(@rowcount as NVARCHAR(10))+' rows from sys.syscommittab that were also stored in SYSCOMMITTABLE' PRINT '' END ELSE BEGIN PRINT '' PRINT 'Failed to DELETE DUP rows from sys.syscommittab' PRINT '' END EXEC sys.sp_setbuildresource 0 GO
广告: