出现怪异现象,一张表只能查询,不能写入、更新。查看应用程序,发现原来数据逻辑页出现问题。具体的错误日志如下:
事件类型: 错误
事件来源: MSSQLSERVER
事件种类: (2)
事件 ID: 605
日期: 2009-5-23
事件: 17:04:24
用户: N/A
计算机: BMCSQ2
描述:
尝试在数据库 11 中提取逻辑页 (1:2025336) 失败。该逻辑页属于分配单元 72057594055098368,而非 72057594057457664。
有关
更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
事件来源: MSSQLSERVER
事件种类: (2)
事件 ID: 605
日期: 2009-5-23
事件: 17:04:24
用户: N/A
计算机: BMCSQ2
描述:
尝试在数据库 11 中提取逻辑页 (1:2025336) 失败。该逻辑页属于分配单元 72057594055098368,而非 72057594057457664。
有关
更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
解决方案:
首先,找到出问题的数据表,运行以下查询,确定与消息中指定的分配单元相关联的表。用错误消息中说明的分配单元替换 allocation_unit_id
。
USE dbName;
GO
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 = 72057594055098368 OR au.allocation_unit_id = 72057594055098368
ORDER BY au.allocation_unit_id;
GO
GO
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 = 72057594055098368 OR au.allocation_unit_id = 72057594055098368
ORDER BY au.allocation_unit_id;
GO
具体的可参照微软官方:http://msdn.microsoft.com/zh-cn/library/aa337419.aspx
接着,将之前的表重建,存储过程、触发器、索引都要建的,然后再导入数据。这个导入数据比较简单,直接,
insert into new(field1,field2,field3) select field1,field2,field3 from old
尽管这样处理之后,恢复正常使用,但是应用程序依然爆出这个bug.也没有找到更好的解决方案,如果有哪位高手知道解决方案,请留言,谢谢
下面是检查数据库、数据表的结果
DBCC CHECK
消息 8967,级别 16,状态 218,第 1 行
DBCC 中出现内部错误,无法继续处理。请与客户支持服务部门联系。
消息 7985,级别 16,状态 2,第 1 行
系统表预检查: 对象 ID 4。无法使用闩锁类型 SH 读取并闩锁页 (1:1880513)。由于不可修复的错误,CHECK 语句已终止。
dbName的 DBCC 结果。
消息 8944,级别 16,状态 12,第 1 行
表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 262144 (类型为 Unknown),页 (1:1880513),行 56。测试
(ColumnOffsets <= (nextRec - pRec))失败。值为 34 和 17。
CHECKDB 发现有 0 个分配错误和 1 个一致性错误与任何单个的对象都没有关联。
CHECKDB 在数据库 'dbName' 中发现 0 个分配错误和 1 个一致性错误。
对于由 DBCC CHECKDB (dbName)发现的错误,repair_allow_data_loss 是最低的修复级别。
消息 8967,级别 16,状态 218,第 1 行
DBCC 中出现内部错误,无法继续处理。请与客户支持服务部门联系。
消息 7985,级别 16,状态 2,第 1 行
系统表预检查: 对象 ID 4。无法使用闩锁类型 SH 读取并闩锁页 (1:1880513)。由于不可修复的错误,CHECK 语句已终止。
dbName的 DBCC 结果。
消息 8944,级别 16,状态 12,第 1 行
表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 262144 (类型为 Unknown),页 (1:1880513),行 56。测试
(ColumnOffsets <= (nextRec - pRec))失败。值为 34 和 17。
CHECKDB 发现有 0 个分配错误和 1 个一致性错误与任何单个的对象都没有关联。
CHECKDB 在数据库 'dbName' 中发现 0 个分配错误和 1 个一致性错误。
对于由 DBCC CHECKDB (dbName)发现的错误,repair_allow_data_loss 是最低的修复级别。
USE dbName;
GO
DBCC CHECKTABLE ("dbo.T_TLMail_Receiver");
GO
消息 8967,级别 16,状态 218,第 1 行
DBCC 中出现内部错误,无法继续处理。请与客户支持服务部门联系。
消息 8944,级别 16,状态 12,第 1 行
表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 262144 (类型为 Unknown),页 (1:1880513),行 56。测试
(ColumnOffsets <= (nextRec - pRec))失败。值为 34 和 17。
消息 7985,级别 16,状态 2,第 1 行
系统表预检查: 对象 ID 4。无法使用闩锁类型 SH 读取并闩锁页 (1:1880513)。由于不可修复的错误,CHECK 语句已终止。
GO
DBCC CHECKTABLE ("dbo.T_TLMail_Receiver");
GO
消息 8967,级别 16,状态 218,第 1 行
DBCC 中出现内部错误,无法继续处理。请与客户支持服务部门联系。
消息 8944,级别 16,状态 12,第 1 行
表错误: 对象 ID 0,索引 ID -1,分区 ID 0,分配单元 ID 262144 (类型为 Unknown),页 (1:1880513),行 56。测试
(ColumnOffsets <= (nextRec - pRec))失败。值为 34 和 17。
消息 7985,级别 16,状态 2,第 1 行
系统表预检查: 对象 ID 4。无法使用闩锁类型 SH 读取并闩锁页 (1:1880513)。由于不可修复的错误,CHECK 语句已终止。
http://msdn.microsoft.com/zh-cn/library/ms174338.aspx