Sql server 2008 尝试获取数据库2中的逻辑页失败。它属于分配单元X,不属于Y

Sql server 2008 尝试获取数据库2中的逻辑页失败。它属于分配单元X,不属于Y,sql-server-2008,tsql,Sql Server 2008,Tsql,在执行某些SP时开始出现以下错误。与此错误相关的代码非常简单,将#temp表连接到real表 错误全文: Msg 605, Level 21, State 3, Procedure spSSRSRPTIncorrectRevenue, Line 123 Attempt to fetch logical page (1:558552) in database 2 failed. It belongs to allocation unit 2089673263876079616 not to 417

在执行某些SP时开始出现以下错误。与此错误相关的代码非常简单,将#temp表连接到real表

错误全文:

Msg 605, Level 21, State 3, Procedure spSSRSRPTIncorrectRevenue, Line 123
Attempt to fetch logical page (1:558552) in database 2 failed. It belongs to allocation unit 2089673263876079616 not to 4179358581172469760.
以下是我的发现:

这表明数据库存在某种问题。我在用户数据库和临时数据库上运行
dbcccheckdb
——所有过程

我正在做的第二件事——试图找到这些分配单元属于哪个表

SELECT au.allocation_unit_id, OBJECT_NAME(p.object_id) AS table_name, fg.name AS filegroup_name,
au.type_desc AS allocation_type, au.data_pages, partition_number
FROM sys.allocation_units AS au
JOIN sys.partitions AS p ON au.container_id = p.partition_id
JOIN sys.filegroups AS fg ON fg.data_space_id = au.data_space_id
WHERE au.allocation_unit_id in(2089673263876079616, 4179358581172469760)
ORDER BY au.allocation_unit_id
这将在
tempdb
中返回2个对象,而不是在用户数据库中。所以,这让我觉得这是tempdb中的某种数据损坏?我是开发人员,不是DBA。对我下一步应该检查什么有什么建议吗

另外,当我运行上面的查询时,我如何告诉我理解的真实对象名?像
#myetreable uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

在我的例子中,截断并重新填充相关表中的数据是解决方案


表中的数据很可能已损坏。

我可以通过清除SQL缓存来解决此问题:

DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
显然,重新启动SQL服务也会产生同样的影响


(via,在此处复制以帮助他人!)

数据库ID 2表示您的tempdb已损坏。修复tempdp很容易。重新启动sqlserver服务,就可以开始了

这可能是Microsoft在SQL Server 2008上修复的错误的一个实例,该错误包含对自引用临时表的查询(例如,我们在过滤前一步中已填充到临时表中的任何行时,从实际表加载数据到临时表中)

这似乎只发生在没有标识/主键的临时表上,因此解决方法是添加一个标识/主键,尽管如果您修补CU3或更高版本,也可以通过打开跟踪标志来启用修补程序


有关错误/修复的更多详细信息:

我也喜欢您的get错误。 首先,你必须备份到表或对象上,以便在备份后不要再惊慌。我在我的数据库上尝试了以下步骤

第1步: 备份表(数据移动到其他表,如manuel或vs.。您可以怎么做) 我习惯于在下面的代码中移动我的桌子和其他桌子

--代码-

检查你的桌子。如果出现错误,请转至其他步骤3

第三步: !!注意!!您可能会丢失表中的一些数据。但是别担心。因此,您在步骤1中备份了您的表

-DBCC CHECKTABLE(your_table , REPAIR_ALLOW_DATA_LOSS)
GO
祝你好运! ~pektas

-DBCC CHECKTABLE(your_table , REPAIR_REBUILD )
 GO
-DBCC CHECKTABLE(your_table , REPAIR_ALLOW_DATA_LOSS)
GO