新闻建站cms系统、政府cms系统定制开发

广州网站建设公司-阅速公司

asp.net新闻发布系统、报纸数字报系统方案
/
http://www.ysneo.com/
广州网站建设公司
您当前位置:首页>sqlserver数据库

sqlserver数据库

不能在具有唯一索引 'si_xdes_id' 的对象 'sys.syscommittab' 中插入重复键的行由于错误 2601,无法将该提交表刷新到 DBID 7 中的磁盘

发布时间:2025/3/26 16:00:03  作者:Admin  阅读:10  

广告:

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

广告:

相关文章
sys.syscommittab
cms新闻系统购买咨询
扫描关注 广州阅速软件科技有限公司
扫描关注 广州阅速科技