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

数据库损坏(数据库损坏后的一般修复方法) 。
常见的曲解 。
823错误 。
错误信息是:“在文件& # 39;% ls & # 39在偏移量为%#016I64x的位置执行%S_MSG期间,操作系统向SQL Server返回了错误%ls 。”
"在文件& # 39;中的%S_MSGat偏移量%#016I64x期间,操作系统向SQL Server返回了错误% 1!% ls & # 39."
例如:
消息823,24层,3号州,1号线
操作系统返回错误5(访问被拒绝 。)写入文件& # 39;中偏移量0x0000000000e000处的SQLServer 。文件路径\文件名& # 39; 。
错误823表示SQL Server在申请从操作系统读取或写入页面时,遇到了来自Windows的读取或写入请求失败,Windows返回的错误代码和对应的文本将被插入到消息中 。对于读取操作,在报告823错误之前,SQL Server已重试读取请求四次 。
从错误产生的机制可以看出,823错误发生在发出页面读写请求时,与读写内容无关,所以823错误与SQL Server本身无关 。通常,此错误是由物理文件损坏引起的,但也可能是由引导资源网络的设备驱动程序引起的 。如果数据文件反复出现823错误,要么是硬件设备出了问题,要么是数据文件严重损坏 。这个错误基本上意味着数据页中的有效数据已经丢失,一般很难修复DBCC CHECKDB 。
824错误 。
错误消息是:“基于一致性% 1!SQL Server检测到逻辑输入/输出错误 。在文件' ' % 1!' '中偏移量为%#016I64x的位置的数据库标识% 2!的第% 3!页上执行% 4!时出错
" SQL Server检测到一个基于逻辑一致性的输入/输出错误:% 1!它发生在文件& # 39;中偏移量%#016I64x处的第%S_PGIDin数据库ID %d页的%S_MSG期间 。% ls & # 39."
例如:
SQL Server检测到基于逻辑一致性的输入/输出错误:tornpage(预期签名:0x0实际签名:0x4e0372a8) 。读取数据库ID 13中偏移量000000000000000000000000000000000000000000000000000000000000000000000000000000000000000s:\ Microsoft SQL Server \ MSSQL . 1 \ MSSQL \ Data \ www 71 _ global _ Data . MDF & # 39; 。
此错误表示Windows报告页面已成功从磁盘读取,但SQL Server在页面中检测到逻辑错误 。
常见的错误类型如下:
1、校验和
SQL资源网络服务器在写入每一页时,可以根据页面强度数据计算出一个校验值,并一起存储在页面中 。下次读取页面时,根据读取的页面数据计算新的校验值 。如果写入和读取的数据相同,则两个检查值必须相等 。如果两个校验值不相等,说明上次SQL Server写入的数据和这次读取的数据不一样,现在读取的数据有问题 。这样,SQL Server可以避免数据页损坏 。
2、撕页
撕页保护实际上是一种检测电源故障导致页面损坏的方法 。例如,意外的电源故障可能仅导致页面的一部分写入磁盘 。当使用不完全页保护时,在页的每个512字节扇区的末尾放置一个2位签名(在将原始的2位复制到页头之后) 。每次执行写操作时,该签名在二进制数01和10之间交替,因此总是可以确定是否只有一些扇区被写入磁盘 。如果以后读页面时发现某个位置的状态不正确,说明页面没有写对,所以检测到问题的页面称为断页 。与Checksum相比,不完全页检测使用的资源最少,但其算法过于简单,无法检测出磁盘硬件故障导致的所有错误 。
3、短转移
读取数据的长度比预期的要短 。例如,一个读取请求预期读取8KB的数据,但实际上只返回了4KB 。这也意味着当前读取的页面已损坏 。
4、错误的页面标识
读取页面后,SQL Server会将存储在页面开头的页码与自己请求的目标页码进行比较 。如果你发现你想读的页面是第200页,而你读的内容显示是第100页,那么SQL Server就会触发一个824错误 。这种错误通常会被发送到错误的页面,甚至是SQL Server的空页面,因为输入/输出系统不能正确处理SQL Server请求 。
5、恢复待定
在企业版的SQL Server中,用户可以要求在恢复时跳过一些损坏的页面(出错后继续) 。这些跳过的页面被标识为“恢复挂起” 。如果一些用户想要访问它,他们会遇到824错误 。
6、陈旧阅读
在一些硬件系统中经常会出现写操作缺失的情况(SQL Server要求在硬盘文件中写入一页,I/O子系统报告写操作已经完成,但下次SQL Server读取时,仍会先读取内容再写入) 。由于旧版本的页面没有任何问题,校验和或撕裂页面算法都无法检查错误 。对于这种问题,SQL Server也有对策 。打开SQL Server启动参数开关-T818后,SQL Server将在内存中维护一个哈希表,以记录所有已写入页面的最新LSN(日志序列号)值 。下次阅读该页面时,您将比较这两个值是否相等 。因为LSN是一个会自动增长的唯一值,所以对于每个新修改的页面,LSN的值都会大于原始值 。如果读LSN与存储在内存中的不一致,这意味着最后一个写请求没有真正完成 。这时,824错误也会触发 。


推荐阅读