用户数据库上的 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我重建了数据库。
您似乎有一行与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)
归档时间: |
|
查看次数: |
587 次 |
最近记录: |