CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

重要数据恢复!~~~~~

楼主sunshinewindows()2004-09-03 21:42:16 在 MS-SQL Server / 应用实例 提问

误在SQL中删除数据库,后用EasyRecovery恢复,附加数据库,但显示不是有效的mdf文件。恢复时.mdf和.ldf都已经恢复。此现象在多台机子均出现!是否是软件用错!~~请高人指教!急~~~~~~ 问题点数:50、回复次数:12Top

1 楼zjcxc(邹建)回复于 2004-09-03 21:44:39 得分 10

可能你找到的不是有效的数据文件,或者是数据文件有些损坏,没有完全恢复.Top

2 楼wanyingsong(豌豆)回复于 2004-09-03 21:46:10 得分 40

你把你的mdf和ldf用winrar或其他压缩软件压缩一下,看看大小对不对,正常压缩的大小应该是原来大小的20%以下(winrar)Top

3 楼sunshinewindows()回复于 2004-09-03 21:46:23 得分 0

怎么办!~~~~Top

4 楼wanyingsong(豌豆)回复于 2004-09-03 21:47:37 得分 0

在试试这个,转自(leimin斑竹):  
  1.设置数据库为紧急模式  
                Use   Master  
                GO  
                sp_configure   'allow   updates',   1  
                reconfigure   with   override  
              GO  
              UPDATE   sysdatabases   SET   status   =   32768   where   name   =   'DB_SUSPECT'  
              GO  
   
  2.停掉SQL   Server服务:  
            NET   STOP   MSSQLSERVER  
   
  3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走:  
   
  4.启动SQL   Server服务:  
              NET   START   MSSQLSERVER  
   
  5.重新建立一个同名的数据库DB_SUSPECT;  
   
                USE   master  
                GO  
                CREATE   DATABASE   DB_SUSPECT  
                  ON    
                    (   NAME   =   DBNAME_DAT,  
                        FILENAME   =   'C:',  
                        SIZE   =   10,  
                          FILEGROWTH   =   5   )  
                        LOG   ON  
                      (   NAME   =   'DBNAME_LOG',  
                        FILENAME   =   'g:',  
                        SIZE   =   5MB,  
                        FILEGROWTH   =   5MB   )  
                        GO  
   
   
  6.设置数据库运行在单用户的模式:  
                    USE   MASTER  
                  GO  
                  ALTER   DATABASE   DB_SUSPECT   SET   SINGLE_USER  
                  GO  
   
  7.停掉SQL服务:  
            NET   STOP   MSSQLSERVER  
   
  8.把原来的数据文件再覆盖回来:  
   
   
  9.启动SQL   Server服务:  
              NET   START   MSSQLSERVER  
   
  10.重新设置SQLSERVER的状态:  
                    USE   MASTER  
                  GO  
                  EXEC   sp_resetstatus   "DB_SUSPECT"  
   
  11.数据库完整性检测:  
                  DBCC   CHECKDB('DB_SUSPECT')  
   
  12.恢复数据库为多用户模式:  
                  USE   MASTER  
                  GO  
                  ALTER   DATABASE   DB_SUSPECT   SET   MULTI_USER  
                GO  
   
  13.恢复SQLSERVER原始的配置:  
              USE   MATER  
   
          GO              
   
          UPDATE   sysdatabases   SET   status   =   4194320   where   name   =   'DB_SUSPECT'  
          GO  
   
  14.配置SQLSERVER不允许更新系统表:  
              USE   MASTER  
            GO  
              sp_configure   'allow   updates',   0  
              reconfigure   with   override  
            GO  
   
  15.重新启动MSSQLSERVER服务:  
   
            最好重新启动操作系统  
   
  16.备份数据库:  
   
        可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT  
  Top

5 楼sunshinewindows()回复于 2004-09-03 21:49:28 得分 0

那数据库坏了,但文件100多mb,怎么恢复数据!Top

6 楼wanyingsong(豌豆)回复于 2004-09-03 21:53:57 得分 0

修复SQLSERVER2000数据库之实战经验  
   
  ********************************************************************************  
   
  Author:黄山光明顶  
   
  mail:leimin@jxfw.com  
   
  version:1.0.0  
   
  date:2004-1-30  
   
  (如需转载,请注明出处!,如果有问题请发MAIL给我:-))  
   
  *******************************************************************************  
   
        我所讲的一个故事的背景是这样的,在某一个POS的项目中使用SQLSERVER   2000做前台数据库,IBM   的DB2做后台数据库。前台数据库的环境是这样的操作系统是WINDOWS2000   SERVER(10   USERS),数据库是SQLSERVER2000(E)+SP3,Application是POS的收银系统(是一种实时的交易系统)。硬件的配置是:P4   XRON   2.4G*2,36G   HDD*5   做的RAID5   ,1G   MEMORY,HP   DDS4   磁带机,数据库的容量一般保持在5G左右。  
        因为数据比较的重要,并且数据容量也不大,我们要求的备份策略是每天在磁带机做POS_DB的全备份(一个星期7天一个循环),在晚上还在硬盘上做全部备份(MASTER,MSDB,POS_DB).这样保持双重的保险。  
   
  1.故障爆发:  
  2003-12-26   13:00  
  客户报告所有的POS死机和SERVER运行速度非常的慢。经过重新启动服务器(启动到检查RAID卡时开始报警)我们发现在WINDEOWS   2000   SERVER的“系统日志”中有这样的信息:  
                Error:   823,   Severity:   24,   State:   2  
                I/O   error   (torn   page)   detected   during   read   at   offset   0x0000001bf96000   in   file       D   :\DATA\POS_DB.mdf'.    
  SQLSERVER的“错误日志”中有这样的信息:    
    2003-12-10   03:34:22.23   spid56         Error:   823,   Severity:   24,   State:   2  
    2003-12-10   03:34:22.23   spid56         I/O   error   (torn   page)   detected   during   read   at   offset   0x00000074964000   in   file       'D:\DATA\POS_DB.mdf'..  
  来自msdn的解释:  
          I/O   logical   check   failure:   If   a   read   Windows   API   call   or   a   write   Windows   API   call   for   a   database   file   is   successful,   but   specific   logical   checks   on   the   data   are   not   successful   (a   torn   page,   for   example),   an   823   error   is   raised.   The   following   error   message   is   an   example   of   an   823   error   for   an   I/O   logical   check   failure:    
    2003-09-05   16:51:18.90   spid17   Error:   823,   Severity:   24,   State:   2    
    2003-09-05   16:51:18.90   spid17   I/O   error   (torn   page)   detected   during   read   at   offset   0x00000094004000   in   file       'F:\SQLData\mydb.MDF'..    
          To   resolve   this   problem,   first   run   the   DBCC   CHECKDB   statement   on   the   database   that   is   associated   with   the   file   in   the   error   message.   If   the   DBCC   CHECKDB   statement   reports   errors,   correct   those   errors   before   you   troubleshoot   this   problem.   If   the   problem   persists   even   after   the   DBCC   CHECKDB   errors   have   been   corrected,   or   if   the   DBCC   CHECKDB   statement   does   not   report   any   errors,   review   the   Microsoft   Windows   NT   system   event   log   for   any   system   errors   or   disk-related   errors.   You   can   also   contact   your   hardware   vendor   to   run   any   appropriate   diagnostics.  
                  I/O逻辑检查失败:如果有一个WINDOWS程序在读取和写数据库文件时是成功的,但是在详细的数据逻辑检查时没有成功(比如:不完整的页),SQLSERVER会返回MSG   823的错误。下面就是一个I/O逻辑检查失败MSG   823的实例:  
    2003-09-05   16:51:18.90   spid17   Error:   823,   Severity:   24,   State:   2    
    2003-09-05   16:51:18.90   spid17   I/O   error   (torn   page)   detected   during   read   at   offset   0x00000094004000   in   file         'F:\SQLData\mydb.MDF'..    
    要解决这样的问题,首先要在该数据库中执行DBCC   CHECKDB(错误信息提示的数据库文件)。如果DBCC   CHECKDB报错,在你修复错误之前纠正这些错误。如果这些错误信息一直保留到执行DBCC   CHECKDB运行之后,或者DBCC   CHECKDB没有报告任何错误,检查WINDOWS   NT系统的的事件查看器的和系统错误或磁盘错误相关的信息。你也可以联系硬件厂商运行正确的诊断工具。  
   
   
  坏了:-(,数据库文件有问题,在检查OS的事件查看器,我们发现在一个星期之前就有错误信息(只是OFFSET的偏移地址不同)。  
   
  赶紧检查HDD,果然发现在RAID5的第一快HDD亮了红灯(灰尘太多,很难于看清)  
   
  执行   DBCC   CHECKDB('POS_DB')检查发现:  
    Server:   Msg   8909,   Level   16,   State   1,   Line   1  
    Table   error:   Object   ID   26342838,   index   ID   35207,   page   ID   (1:50978).   The   PageId   in   the   page   header   =(32230:-2048732002).  
   
   
    Server:   Msg   8939,   Level   16,   State   1,   Line   1  
    Table   error:   Object   ID   859150106,   index   ID   255,   page   (1:238770).   Test   (IS_ON   (BUF_IOERR,   bp->bstat)   &&   bp->berrcode)     failed.   Values   are   2057   and   -1.  
   
   
    Server:   Msg   8928,   Level   16,   State   1,   Line   1  
    Object   ID   861246123,   index   ID   0:   Page   (1:57291)   could   not   be   processed.   See   other   errors   for   details.  
   
   
    Server:   Msg   2511,   Level   16,   State   1,   Line   1  
    Table   error:   Object   ID   862626116,   Index   ID   0.   Keys   out   of   order   on   page   (1:269310),   slots   0   and   1.  
   
  Top

7 楼wanyingsong(豌豆)回复于 2004-09-03 21:54:23 得分 0

啊哈,果然有很多的表都有错误关联(请记录每一个错误表的OBJECT   ID)  
  从MSDN查到:  
    错误号Msg   823:表示SQLSERVER在读取数据和写数据时检测到硬件设备有问题或者系统有问题。  
                    TORN   PAGE:的意思是不完整的页  
                    0x0000001bf96000:这是从数据文件开始处到TORN   PAGE   的字节数。  
                    错误号Msg   8939   :大家可以看看:http://support.microsoft.com/default.aspx?kbid=320434  
                    FIX:在运行   CHECKDB   时,具有   TABLOCK   提示的大容量插入(bulk   insert,   bcp   等)可能导致错误   8929   和   8965  
                    错误号MSG   8928:是和8939相关联的信息,  
                    错误号MSG   8965:是和8939相关联的信息,  
   
  大家可以到下面的地址找到相关的信息:  
    http://support.microsoft.com/default.aspx?scid=kb;en-us;826433  
    PRB:   Additional   SQL   Server   Diagnostics   Added   to   Detect   Unreported   I/O   Problems  
    http://support.microsoft.com/default.aspx?scid=kb;en-us;828339  
    PRB:   Error   message   823   may   indicate   hardware   problems   or   system   problems  
    http://support.microsoft.com/default.aspx?scid=kb;en-us;308795  
    FIX:   CheckDB   May   Not   Fix   Error   8909   or   Error   8905  
   
  故障确诊:RAID有一块HDD坏,造成数据库文件破坏  
   
  2.更换HDD  
  2003-12-28   23:00  
  现在就体现了RAID5的好处,坏了一块HDD,系统可以照常运行,不过系统的日志和SQLSERVER的日志还是有MSG823的报错信息。  
  按照RAID   卡的REBUILD的步骤将新的HDD绑定到原始的RAID5中,顺利完成:-)  
  用DBCC检查数据库的完整性  
              DBCC   CHECKDB('POS_DB')   WITH   ALL_ERRORMSGS    
  发现还是有和更换HDD之前一样的ERROR信息,看来数据库文件还是有问题。  
   
  --有一个奇怪问题1,既然是5块HDD的RAID5,为何有一块HDD坏会影响数据库文件的损坏,不解???:-(  
   
  3.恢复数据库  
  2003-12-29   00:30  
  没有办法,用备份的数据集恢复数据库(看来备份是多么的重要)  
                        USE   MASTER  
                      GO  
                      RESTORE   DATABASE   POS_DB   FROM         DISK='D:\DATABASEBACKUP\POS_DB_BACKUP.DAT'  
  重新启动MSSQLSERCVER服务,  
          NET   STOP   MSSQLSERVER   /   NET   START   MSSQLSERVER  
  用DBCC检查数据库的完整性  
          DBCC   CHECKDB('POS_DB')   WITH   ALL_ERRORMSGS    
   
  和恢复之前的错误信息一致,没有改变。  
  --奇怪问题之2,SQLSERVER   BACKUP   之前并不验证数据库的完整性,数据库的全备份竟然是有问题的。气愤!!  
   
  看来只能通过工具修复数据库了(--在修改之前记录错误表的记录数,以便修复数据库后进行比较)。  
    在查询分析器中运行:  
              ALTER   DATABASE   POS_DB   SET   SINGL_USER  
              GO  
              DBCC   CHECKDB('POS_DB',repair_allow_data_loss)   WITH   TABLOCK  
            GO  
              ALTER   DATABASE   POS_DB   SET   MULTI_USER  
            GO  
   
  CHECKDB   有3个参数:  
  REPAIR_ALLOW_DATA_LOSS    
      执行由   REPAIR_REBUILD   完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。    
  REPAIR_FAST   进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。    
  REPAIR_REBUILD   执行由   REPAIR_FAST   完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。    
   
     
   
  第一次运行,我们会发现:  
    DBCC   results   for   'TABLE_NAME'.  
    There   are   1   rows   in   1   pages   for   object   'TABLE_NAME'.  
                    The   error   has   been   repaired.  
    CHECKDB   found   0   allocation   errors   and   1   consistency   errors   in     table   '(Object   ID   26342838)'   (object   ID   26342838).  
    CHECKDB   fixed   0   allocation   errors   and   1   consistency   errors   in     table   '(Object   ID   26342838)'   (object   ID   26342838).  
  这样的信息有很多,并且有“The   error   has   been   repaired”的提示。不过到最后还是有这样的信息:  
    CHECKDB   found   0   allocation   errors   and   19   consistency   errors   in   database   'POS_DB'.  
    CHECKDB   fixed   0   allocation   errors   and   19   consistency   errors   in   database   'POS_DB'.  
  再次运行,还是有同样的错误。糟糕:=)看来这种方式是无法修复这样测错误。  
   
  失败!!!  
   
  再仔细看看SQLSERVER   BOL发现CHECKDB还有一个非常有用的参数PHYSICAL_ONLY  
   
  PHYSICAL_ONLY  
          仅限于检查页和记录标题物理结构的完整性,以及页对象   ID   和索引   ID   与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性,同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY   始终意味着   NO_INFOMSGS,并且不能与任何修复选项一起使用。  
   
   
  再次运行:  
    DBCC   CHECKDB('POS_DB')   with   NO_INFOMSGS,PHYSICAL_ONLY  
  然后再运行:  
    DBCC   CHECKDB('POS_DB',repair_allow_data_loss)   WITH   TABLOCK  
  这次会返回一些8952.8956的错误信息:  
  Server:   Msg   8952,   Level   16,   State   1,   Line   1  
  Table   error:   Database   'POS_DB',   index   'POS_REFER.Idx2_POS_REFER'   (ID   861246123)   (index   ID   2).   Extra   or   invalid   key   for   the   keys:  
   
   
  Server:   Msg   8956,   Level   16,   State   1,   Line   1  
  Index   row   (1:26315:23)   with   values   (PLU_ID   =   '6922825200240'   and   PRD_AGGR_ID   =   10006   and   EVNT_ID   =   NULL   and   RGST_MDE   =   0   and   SUBPRD_NBR   =   0   and   STR_ID   =   12   and   PRD_AGGR_ID   =   10006   and   SUBPRD_NBR   =   0   and   STR_ID   =   12   and   PLU_ID   =   '6922825200240'   and   EVNT_ID   =   NULL   and   RGST_MDE   =   0)   points   to   the   data   row   identified   by   ().  
   
  根据MSDN上的说明:  
    This   problem   does   not   cause   any   data   or   index   corruption.   The   problem   is   in   the   metadata   which   is   corrected   only   by     dropping   and   re-creating   the   indexes.    
                  这些问题不会引起数据或索引的损坏,这些问题的元数据是正确的,只是删除再重新建立索引。  
  看来问题是修改了。  
   
   
  再次运行DBCC   CHECKDB('POS_DB'),再次运行:DBCC   CHECKDB('POS_DB'),message没有错误信息。  
   
  ok成功修复:-)  
   
  Top

8 楼wanyingsong(豌豆)回复于 2004-09-03 21:54:35 得分 0

4.检查修复后的数据库并且备份数据库  
  检查DBCC   CHECKDB报错的相关表,和没有执行DBCC之前的记录数进行比较,发现有一个表少了40条记录。郁闷:-<  
   
  5.总结  
   
  1.RAID5并不能保证SQLSERVER   2000   数据库的数据文件的完整性;  
  2.SQLERVER   2000的备份程序不验证数据库文件的数据完整性;如果你的数据文件有问题,备份时也不图示;  
  3.DBCC   CHECKDB的repair_allow_data_loss并不是非常安全的,不能修复所有的错误,即使是对不完整页(TORN   PAGE)的修复也会着成数据丢失;  
  4.DBCC   CHECKDB的REPAIR_ALLOW_DATA_LOSS参数无法修复所有的错误;  
   
  参考文章:  
  http://support.microsoft.com/default.aspx?scid=kb;en-us;298806  
  http://support.microsoft.com/default.aspx?scid=kb;en-us;284440  
  http://support.microsoft.com/default.aspx?kbid=320434  
  http://support.microsoft.com/default.aspx?scid=kb;en-us;828339  
  http://support.microsoft.com/default.aspx?scid=kb;en-us;308795  
  http://support.microsoft.com/default.aspx?scid=kb;en-us;826433  
   
  Top

9 楼sunshinewindows()回复于 2004-09-03 22:46:36 得分 0

我做到这一步时,问题如下:  
  11.数据库完整性检测:  
                  DBCC   CHECKDB('DB_SUSPECT')  
   
   
  于文件不可访问,或者内存或磁盘空间不足,所以无法打开数据库   'UFDATA_003_2004'。详细信息请参阅   SQL   Server   错误日志。  
  Top

10 楼sunshinewindows()回复于 2004-09-03 23:01:08 得分 0

清大虾速指明方向!Top

11 楼duanduan1122(俺村俺帅!!!)回复于 2004-09-07 11:26:18 得分 0

studying!!!!  
  Top

12 楼sunshinewindows()回复于 2004-09-07 21:13:20 得分 0

什么意思啊!Top

相关问题

  • 数据恢复。
  • 数据恢复!!!
  • 数据恢复
  • 恢复数据库
  • oracle 数据恢复
  • oracle数据恢复?
  • 恢复数据库
  • 数据库恢复
  • 恢复数据库
  • sos 恢复数据

关键词

  • sqlserver2000
  • 数据库
  • 修复
  • 数据
  • 检查
  • 文件
  • mssqlserver
  • raid
  • sqlserver
  • db

得分解答快速导航

  • 帖主:sunshinewindows
  • zjcxc
  • wanyingsong

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo