详细信息
Attribute | 值 |
---|---|
产品名称 | SQL Server |
事件 ID | 605 |
事件源 | MSSQLSERVER |
组件 | SQLEngine |
符号名称 | WRONGPAGE |
消息正文 | 尝试在数据库 %d 中提取逻辑页 %S_PGID 失败。 该逻辑页属于分配单元 %I64d,而非 %I64d。 |
说明
此错误通常表示指定数据库中的页或分配已损坏。 SQL Server 会在根据页链接或使用索引分配映射 (IAM) 读取属于表的页时,检测到此损坏。 分配给表的所有页必须属于与该表相关联的分配单元之一。 如果页眉中包含的分配单元 ID 不匹配与表相关联的分配单元 ID,将引发此异常。 错误消息中列出的第一个分配单元 ID 是页眉中显示的 ID,而第二个分配单元值则是与表相关联的 ID。
数据损坏错误
严重级别为 21 表示可能存在数据损坏。 可能的原因包括损坏的页链、损坏的 IAM 或该对象的 sys.objects 目录视图中存在无效条目。 这些错误通常由硬件或磁盘设备驱动程序故障而引起。
暂时性错误
严重级别为 12 表示可能存在暂时性错误,即在缓存中出现错误,但不表示对磁盘上的数据造成破坏。 暂时性的 605 错误可由以下条件引发:
-
操作系统过早地通知 SQL Server 已完成某个 I/O 操作;尽管不存在实际的数据损坏,但显示错误消息。
-
运行带有优化器提示 NOLOCK 的查询,或将事务隔离级别设置为 READ UNCOMMITTED。 当使用 NOLOCK 或 READ UNCOMMITTED 事务隔离级别的查询尝试读取被其他用户移走或更改的数据时,将发生 605 错误。 若要验证是否为暂时性的 605 错误,请稍后重新运行该查询。
通常,如果在数据访问期间发生该错误,但后续的 DBCC CHECKDB 操作在没有出错的情况下完成,则 605 错误可能是暂时的。
用户操作
如果 605 错误不是暂时性的,则说明问题很严重,必须运行以下任务来纠正该问题:
-
运行以下查询,确定与消息中指定的分配单元相关联的表。 用错误消息中说明的分配单元替换
allocation_unit_id
。USE [database_name]; 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 = '<allocation_unit_id>' OR au.allocation_unit_id = '<allocation_unit_id>' ORDER BY au.allocation_unit_id; GO
-
对与错误消息中说明的第二个分配单元 ID 相关联的表,执行不带 REPAIR 子句的 DBCC CHECKTABLE。
-
尽快执行不带 REPAIR 子句的 DBCC CHECKDB,以确定整个数据库中的总体损坏程度。
-
检查错误日志以查找经常随 605 错误一起发生的其他错误,并检查 Windows 事件日志以查找任何与系统或硬件有关的问题。 修复日志中包含的所有与硬件相关的问题。
如果问题与硬件无关,请执行以下任务之一:
-
从已知的干净备份中还原数据库。 可以利用页面还原备份功能来还原损坏的页。
-
运行带有 REPAIR 子句的 DBCC CHECKDB(这是步骤 3 中所执行 DBCC CHECKDB 操作推荐的做法),以修复损坏。 如果运行具有 REPAIR 子句的 DBCC CHECKDB 无法解决存在的问题,请与主要支持提供商联系。 提供 DBCC CHECKDB 的输出以供查看。
注意
如果您不确定运行带有 REPAIR 子句的 DBCC CHECKDB 会对数据造成何种影响,请在运行该语句前与您的主要支持提供商联系。