随着社会越来越发达,大家都选择在网络上汲取相关知识内容,比如数据库损坏(数据库损坏后的一般修复方法),为了更好的解答大家的问题,小编也是翻阅整理了相应内容,下面就一起来看一下吧!


(相关资料图)

数据库损坏(数据库损坏后的一般修复方法)

常见的误解

823错误

错误为:“在文件“%ls”中偏移量%#016I64x处执行%S_MSG期间,操作系统向SQL Server返回了错误%ls。”

"在文件" " % 1!" "中的% 2!MSGat偏移量%#016I64x期间,操作系统向SQL Server返回了错误% 1!. "

例如:

消息823,24级,状态3,第1行

操作系统返回错误5(访问被拒绝。)在文件“FilePath\FileName”中偏移量0x0000000000e000处写入到SQLServer。

83错误意味着SQL Server在向操作系统申请页面读写时遇到了Windows读取或写入请求失败。Windows返回的错误代码和相应的文本将 *** 入到消息中。对于读取操作,SQL Server在报告823错误之前重试了4次读取请求。

从错误产生的机理可以看出,823错误是在发出页面读写请求时发生的,与读写内容无关,所以823错误与SQL Server本身无关。此错误通常是由物理文件损坏引起的,但也可能是由设备驱动程序引起的。如果823错误在一个数据文件上重复出现,要么是硬件设备故障,要么是数据文件已经严重损坏。这个错误基本上意味着数据页中的有效数据已经丢失。通常,DBCC CHECKDB很难修复。

824错误

错误为:“SQL Server检测到基于一致性的逻辑I/O错误%ls。在数据库ID % 1!中第% 2!页上的% 1!执行% 2!期间,在文件" " % 1!" "中偏移量%#016I64x处出现错误。

SQL Server检测到基于逻辑一致性的I/O错误:%ls。该错误发生在数据库ID % 1!中的第% 2!页的第% 1!页的第% 2!页,偏移量%#016I64x,位于文件" " % 1!" "中。

例如:

SQL Server检测到基于逻辑一致性的I/O错误:tornpage(预期签名:0x0实际签名:0x4e0372a8)。在读取数据库ID 13中偏移量为0000000000000000的页(1:0)时,在以下文件中出现此错误:\ Microsoft SQL Server \ MSSQL . 1 \ MSSQL \ Data \ www 71 _ global _ Data . MDF。

此错误表明Windows报告已成功从磁盘读取该页,但SQL Server在该页中检测到逻辑错误。

常见的错误类型如下:

1、校验和

SQL Server在写入每页时可以根据页面强度数据计算出一个校验值,一起存储在页面中。下次读取页面时,根据读取的页面数据计算新的检查值。如果写入和读取的数据相同,则两个校验值必须相等。如果两个校验值不相等,说明SQL Server上次写入的数据和这次读取的数据不一样,现在读取的数据有问题。这样,SQL Server可以避免数据页损坏。

2、撕破的页面

撕裂页保护实际上是一种检测断电引起的页面损坏的方法。例如,意外的电源故障可能会导致只有一部分页面被写入磁盘。使用坏页保护时,在页的每个512字节扇区的末尾放置一个2位签名(在将原来的2位复制到页头之后)。每次执行写操作时,该签名在二进制数01和10之间交替,因此总是可以确定是否只有一些扇区被写入磁盘。如果后来在读取页面时发现某个位置的状态不正确,则说明该页面没有被正确写入,因此检测到问题的页面称为缺陷页面。与校验和相比,不完全页检测使用的资源最少,但其算法过于简单,无法检测出磁盘硬件故障导致的所有错误。

3、短期 ***

读取的数据长度小于预期。例如,一个读取请求预计读取8KB的数据,但实际上只返回了4KB。这也意味着当前读取的页面已损坏。

4、错误的页面Id

读取页面后,SQL Server会将存储在页面开头的页码与它向Youyou.com请求的目标页码进行比较。如果发现要读取的页面是第200页,而读取的内容显示是第100页,SQL Server会触发824错误。这种错误往往是由于I/O系统没有正确处理SQL Server请求而导致的,并且是带着错误页,甚至是空页发送给SQL Server的。

5、恢复待定

在SQL Server企业版中,用户可以要求在恢复过程中跳过一些损坏的页面(出错后继续)。这些跳过的页面被标识为“恢复挂起”。如果一些用户想要访问它,他们将遇到824错误。

6、陈旧的阅读

有些硬件系统经常会漏写(SQL Server要求一个页面写入硬盘文件,I/O子系统报告写完了,但是下一次SQL优优资源 *** 服务器读的时候会先读内容再写)。因为旧版页面本身没有问题,无论是校验和还是撕裂页算法都无法检查错误。对于这类问题,SQL Server也有对策。打开SQL Server的启动参数开关-T818后,SQL Server会在内存中维护一个哈希表,记录所有已写入页面的最新LSN(日志序列号)值。下次阅读该页时,您将比较这两个值是否相等。因为LSN是自动增长的唯一值,所以对于每个新修改的页面,LSN的值将大于原始值。如果读取的LSN与存储在存储器中的不一致,这意味着最后的写入请求没有真正完成。这时,824错误也会触发。

虽然是“逻辑错误”,是SQL Server主动发现的数据损坏,但损坏的源头大多不是SQL Server本身。这里的错误主要是由于预期写的不完整造成的。错误的原因基本上在I/O子系统。因为SQL Server的读写请求都是发送到Windows,再由Windows发送到底层磁盘系统,所以Windows下面的每一层都可能出现问题,比如磁盘驱动器故障、磁盘估计问题、设备驱动不正确等。可以负责任的说,SQL Server本身不会造成824错误。

因为824错误是发生在页面级别的逻辑错误,所以DBCC CHECKDB在许多情况下是可以修复的。这种修理是合乎逻辑的。存储在页面中的数据在824错误发生之前就丢失了,SQL Server无法修复它们,所以824错误基本上意味着一些数据丢失了。

05错误

错误为:“尝试提取数据库% 1!中的逻辑页% 2!失败。该逻辑页属于分配单元%I64d,而不是%I64d。

"试图在数据库尤优资源 *** % d中获取逻辑页% s _ pgid失败。它属于分配单元% i64d,而不是% i64d。"

例如:

尝试提取数据库2中的逻辑页(1:584)失败。它属于分配单元445237904015360,而不是72057594060079104。

05也是非常著名的数据库损坏错误。此错误通常表示指定数据库中的页面或分配已损坏。当根据页链或使用索引分配映射(IAM)读取属于表的页时,SQL Server将检测到这种损坏。分配给某个表的所有页必须属于与该表关联的分配单元之一。如果标头中包含的分配单元ID与表关联的分配单元ID不匹配,将引发此异常。错误消息中列出的之一个分配单元ID是显示在标题中的ID,而第二个分配单元值是与表关联的ID。

严重级别21表示可能有数据损坏。原因包括损坏的页链、损坏的IAM或此对象的sys.objects目录视图中的无效条目。这些错误通常是由硬件或磁盘设备驱动程序故障引起的。

严重级别12表示可能存在临时错误,即缓存中出现错误,但并不意味着磁盘上的数据损坏。以下情况可能会导致的临时605错误:

系统过早地通知SQL Server I/O操作已经完成;尽管没有实际的数据丢失

坏的,但现实的错误信息。

运行带有优化器提示NOLOCK的查询,或将事务隔离级别设置为READ。

未承诺的.当使用NOLOCK或READ UNCOMMITTED的查询试图读取

当数据被其他用户移动或更改时,将出现605错误。如果验证是临时的

05错误,您可以稍后重新运行查询。

通常,如果此错误发生在数据访问期间,但后续的DBCC CHECKDB操作已顺利完成,则605错误可能是暂时的。

因为605错误意味着一些页面分配不正确,这也是一个非常严重的数据库损坏。通常,很难用DBCC CHECKDB来修复它。

其他错误

在SQL Server内部,除了文件页面分配和每页的内部格式之外,还有一些其他的约束规则。以下是一些常见的错误例子。

PFS页损坏:

消息8946,级别16,状态12,行1表错误:分配页(1:13280496)有

无效的PFS_PAGEpage标头值。类型为0。检查类型、分配单元ID和页面

页面上的ID。

系统表的聚集索引页损坏:

服务器:消息8966,级别16,状态1,第1行无法读取和锁定页面(1:18645)

带SH型插销。sysindexes失败。

消息7985,级别16,状态2,服务器启动,行1系统表预检查:对象

ID 4。无法使用闩锁类型SH读取和闩锁页面(1:51)。check语句

由于不可修复的错误而终止。

字段的值不符合字段数据类型的定义:

消息2570,级别16,状态3,第1行第(1:152)页,objectID 2073058421中的槽0,

索引ID 0,分区ID 72057594038321152,分配单元ID72057594042318848(类型

“行内数据”)。列“c1”的值超出了数据类型“datetime”的范围。更新

列设置为合法值。