免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1420 | 回复: 0
打印 上一主题 下一主题

手工修复SqlServer数据库 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-19 08:29 |只看该作者 |倒序浏览

朋友的SQLserver数据库记录了他公司的经营数据,但没有任何保护措施,数据备份也是好几个月以前做了一次。并且这样重要的数据库,他也就是安装在一块IDE硬盘上(可能对他这么规模大小的公司,还没有什么数据安全的意识)
不幸的事情终于发生,一天断电导致SQLSErver数据库无法打开了。
他送来的数据文件有508.3M,不包括日志文件。
在Sqlserver 2000里attache这个数据文件时,发生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开始到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就能修复的情况,实在是不幸中的大幸了。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73762/showart_1086020.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP