2008年(4)
分类: 服务器与存储
2008-07-19 08:29:33
朋友的SQLserver数据库记录了他公司的经营数据,但没有任何保护措施,数据备份也是好几个月以前做了一次。并且这样重要的数据库,他也就是安装在一块IDE硬盘上(可能对他这么规模大小的公司,还没有什么数据安全的意识)
不幸的事情终于发生,一天断电导致SQLSErver数据库无法打开了。
他送来的数据文件有
在Sqlserver 2000里attache这个数据文件时,发生823错误:
Event Type: Error
Event Source: MSSQL$DD
Event Category: (2)
Event ID: 17052
Date:
Time: 7:13:31 PM
User: DDW2K3\Administrator
Computer: DDW2K3
Description:
Error: 823, Severity: 24, State: 2
I/O error (bad page ID) detected during read at offset 0x
尝试使用通常的办法恢复,即建立一个新数据库,然后用这个数据文件覆盖新数据库的数据文件。不成功,这个数据文件已严重损坏。
察看文件的0x00000000012000数据块信息,发现page id 为00 00,显然不对。并且从0x00000000012000开始到0x00000000014000的8K数据块中没有任何数据,说明SQLServer在读写这个页面的时候发生了严重错误,这8K信息已完全丢失。
解决办法:
1. 把0x00000000012000处的page ID改为正常值。
2. 打开sqlserver enterprise manager,attache 修改后的数据文件。成功。
3. 使数据库处于单用户模式下,运行dbcc checkdb (‘dbname’, repair_rebuild),数据成功恢复
4. 正常打开数据库,备份文件。
SqlServer每个page为8K,自动在每个page前面标注ID number,以保持数据的一致性。由于断电等意外因素,缓存内的数据还来不及写入到硬盘,就可能造成某个或某些Page的数据错误,导致整个数据库无法打开。
我上网查了大量的资料,一般发生这样的情况下,只能依靠以前备份的数据来恢复。像这样通过修改某个page id就能修复的情况,实在是不幸中的大幸了。