SQL Server,我无法修复的一致性错误

Als*_*sin 5 sql-server dbcc

用户数据库上的 DBCC CHECKDB 返回此错误

Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3851, State 1: An invalid row (class=128,depid=65536,depsubid=0) was found in the system table sys.syssingleobjrefs (class=128).
Run Code Online (Sandbox Code Playgroud)

此错误出现在用户数据库中,而不是出现在master! 当人们尝试检查在不同服务器上恢复的主数据库时,互联网上充满了专门讨论此错误的文章。事实并非如此。

我尝试了所有常用的魔法,但没有成功。

DBCC CHECKDB WITH ALL_ERRORMSGS, NO_INFOMSGS
--error

ALTER DATABASE DBCopy SET SINGLE_USER WITH ROLLBACK IMMEDIATE

DBCC CHECKDB (DBCopy, REPAIR_ALLOW_DATA_LOSS) 
--output reports the same error

DBCC CHECKDB WITH ALL_ERRORMSGS, NO_INFOMSGS
--error

--no hope but just in case
ALTER DATABASE DBCopy SET EMERGENCY

DBCC CHECKDB (DBCopy, REPAIR_ALLOW_DATA_LOSS) 
--the same error reported

DBCC CHECKDB WITH ALL_ERRORMSGS, NO_INFOMSGS
--error

ALTER DATABASE DBCopy SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)

我们没有不存在此错误的备份。这个错误看起来完全无害。数据库和应用程序工作完全正常。

微软 SQL Server 2019 (RTM-CU14)

DB 是内存中启用的。

在开始重建数据库之前要尝试什么?

PS我重建了数据库。

Cha*_*ace 2

您似乎有一行与sys.syssingleobjrefs其他系统表中的行不对应。

sys.syssingleobjrefs被列为系统基表,并且只能通过 DAC(管理员)连接进行访问。您可以使用 访问它sqlcmd.exe -A

您还需要以单用户模式启动 SQL Server。您可以通过将服务的启动参数修改为-m并重新启动来完成此操作。

文档说:

要绑定到系统基表,用户必须使用专用管理员连接 (DAC) 连接到 SQL Server 实例。尝试从系统基表执行 SELECT 查询而不使用 DAC 连接会引发错误。

重要的

使用 DAC 访问系统基表仅供 Microsoft 人员使用,这不是受支持的客户方案。

我只会建议在确实没有其他选择的情况下这样做。弄乱系统表可能会破坏您的数据库,显然它会在数据库标头中设置一个标志,这意味着 Microsoft 可能决定不对该数据库提供任何支持。

因此,您可以以管理员身份登录或以sa. 您可能只想删除无效行,希望这能解决问题。

警告!:

这样做的风险完全由您自己承担。我强烈建议您备份数据库,将其恢复到完全不同的实例,然后首先在那里进行测试。

USE [DBCopy];
GO

ALTER DATABASE DBCopy SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

DELETE FROM sys.syssingleobjrefs
WHERE class = 128
  AND depid = 65536
  AND depsubid = 0;

GO

DBCC CHECKDB (DBCopy, REPAIR_ALLOW_DATA_LOSS)
  WITH NO_INFOMSGS, TABLOCK;

GO
Run Code Online (Sandbox Code Playgroud)