Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31437
  • 博文数量: 4
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 12:22
文章分类

全部博文(4)

文章存档

2008年(4)

我的朋友

分类: 服务器与存储

2008-07-19 08:29:33

朋友的SQLserver数据库记录了他公司的经营数据,但没有任何保护措施,数据备份也是好几个月以前做了一次。并且这样重要的数据库,他也就是安装在一块IDE硬盘上(可能对他这么规模大小的公司,还没有什么数据安全的意识)

不幸的事情终于发生,一天断电导致SQLSErver数据库无法打开了。

 他送来的数据文件有508.3M,不包括日志文件。

 Sqlserver 2000attache这个数据文件时,发生823错误:

Event Type: Error
Event Source: MSSQL$DD
Event Category: (2)
Event ID: 17052
Date:  5/31/2008
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 0x00000000012000 in file 'C:\share\tiger_data.mdf'.

尝试使用通常的办法恢复,即建立一个新数据库,然后用这个数据文件覆盖新数据库的数据文件。不成功,这个数据文件已严重损坏。

察看文件的0x00000000012000数据块信息,发现page id 00 00,显然不对。并且从0x00000000012000开始到0x000000000140008K数据块中没有任何数据,说明SQLServer在读写这个页面的时候发生了严重错误,这8K信息已完全丢失。

解决办法:
1.
0x00000000012000处的page ID改为正常值。
2.
打开sqlserver enterprise managerattache 修改后的数据文件。成功。
3.
使数据库处于单用户模式下,运行dbcc checkdb (‘dbname’, repair_rebuild),数据成功恢复
4.
正常打开数据库,备份文件。

SqlServer每个page8K,自动在每个page前面标注ID number,以保持数据的一致性。由于断电等意外因素,缓存内的数据还来不及写入到硬盘,就可能造成某个或某些Page的数据错误,导致整个数据库无法打开。

 

我上网查了大量的资料,一般发生这样的情况下,只能依靠以前备份的数据来恢复。像这样通过修改某个page id就能修复的情况,实在是不幸中的大幸了。

 

阅读(1228) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~