原帖地址:http://topic.csdn.net/u/20081224/15/8058b7e7-9ae9-4951-aca2-2009f54b24e1.html,是有人问的问题,现在把回答总结一下。


问题:

昨天数据库服务器运行非常之缓慢,结果我把服务器重新硬启动了,昨天windows系统一直运行不起来,运行到最后报未知的硬件错误,今天操作系统起来了,但是数据库现在数据库变成了可疑状态,而且数据库文件最后修改日期变成了2008-12-3日

对于可疑数据库如何恢复?2008-12-3以后的最近的数据会不会丢失?
我把数据库和日志文件拷贝到其他SQL server服务器上,想附加上去,提示“无法在数据库上重做日志记录”

可能有用的解决方案:

办法一:

数据库置疑的处理办法


在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因: 
 1.错误的删除日志; 
 2.硬件(HD)损坏,造成日志和数据文件写错误; 
 3.硬盘的空间不够,比如日志文件过大; 
 
 
 解决办法: 
 
 这是最简单的办法是有数据库的全备份,然后恢复即可. 
 步骤: 
 
 1. 删除原始的数据库: 
 USE MASTER 
 GO 
 DROP DATABASE DB_SUEPECT 
 
 
 2.建立同名的数据库: 
 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   
 
 3.恢复数据库: 
 RESTORE DATABASE DB_SUSPECT   

 FROM DBNAME_BACKUP.DAT   
 
 4.数据库完整性检测:   DBCC CHECKDB('DB_SUSPECT') 
 
 5.重新启动MSSQLSERVER服务.
  

 
 如果没有全备份,那就要用一些特殊的方法: 
 
 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 
 补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限.  


办法二:

 
     
使用Log Explorer恢复数据 用日志工具Log Explorer 步骤: 1 、查看日志 a、打开log explorer,选择菜单File -- >attach log file b、在Log File Selection窗口中,填写连接到要恢复数据的数据库服务器机器名、数据库登录ID及密码,然后点击"Connect"按钮。 c、若连接成功,则窗口左边树将显示命令菜单,这时我们点击Browser下的View Log命令,此时窗口右边则出现该数据库的Log。 2 、恢复数据库 这时您只要选择您要恢复对事件点,右键点击选择"undo transation"命令,保存T - SQL代码,然后在查询分析器中执行该T - SQL代码


方法三:

   由于种种原因,我们如果当时仅仅备份了mdf文件,那么恢复起来就是一件很麻烦的事情了。   
   如果您的mdf文件是当前数据库产生的,那么很侥幸,也许你使用sp_attach_db或者sp_attach_single_file_db可以   恢复数据库,   
   但是会出现类似下面的提示信息   
   设备激活错误。物理文件名  'C:\Program  Files\Microsoft  SQL  Server\MSSQL\data\test_Log.LDF'  可能有误。   
   已创建名为  'C:\Program  Files\Microsoft  SQL  Server\MSSQL\Data\test_log.LDF'  的新日志文件。   
   但是,如果您的数据库文件是从其他计算机上复制过来的,那么很不幸,也许上述办法就行不通了。你也许会得到类似下面的错误信息   
   服务器:  消息  1813,级别  16,状态  2,行  1   
   未能打开新数据库  'test'。CREATE  DATABASE  将终止。   
   设备激活错误。物理文件名  'd:\test_log.LDF'  可能有误。   
      
   怎么办呢?别着急,下面我们举例说明恢复办法。   
   A.我们使用默认方式建立一个供恢复使用的数据库(如test)。

CREATE DATABASE test

ON

(NAME = 'TEST_DAT',FILENAME='C:\TEST_DATA.MDF',SIZE = 10,FILEGROWTH =5)

LOG ON

(NAME = 'TEST_LOG',FILENAME='C:\TEST_LOG.LOG',SIZE =10,FILEGROWTH = 5)  

   B.停掉数据库服务器:NET STOP MSSQLSERVER
   C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。   
   D.启动数据库服务器: NET START MSSQLSERVER

         此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。   
   E.设置数据库允许直接操作系统表。此操作可以在SQL  Server  Enterprise  Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。   
  
   use  master   
   go   
   sp_configure  'allow  updates',1   
   go     
   reconfigure  with  override   
   go   


    F.设置test为紧急修复模式      

   update  sysdatabases  set  status=-32768  where  dbid=DB_ID('test')      

    此时可以在SQL  Server  Enterprise  Manager里面看到该数据库处于“只读\置疑\脱机\紧急模式”可以看到数据库里       面的表,但是仅仅有系统表

           

 G.下面执行真正的恢复操作,重建数据库日志文件      

     dbcc  rebuild_log('test','C:\Program  Files\Microsoft  SQL  Server\MSSQL\Data\test_log.ldf')


   执行过程中,如果遇到下列提示信息:   
   服务器:  消息  5030,级别  16,状态  1,行  1   
   未能排它地锁定数据库以执行该操作。   
   DBCC  执行完毕。如果  DBCC  输出了错误信息,请与系统管理员联系。[brown][/i]   
   说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL  Server  Enterprise  Manager打开了test库的系统表,那么退出SQL  Server  Enterprise  Manager就可以了。   
   正确执行完成的提示应该类似于:   
   警告:  数据库  'test'  的日志已重建。已失去事务的一致性。应运行  DBCC  CHECKDB  以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。   
   DBCC  执行完毕。如果  DBCC  输出了错误信息,请与系统管理员联系。   
   此时打开在SQL  Server  Enterprise  Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。   
      
   H.验证数据库一致性(可省略)   
   dbcc  checkdb('test')   
   一般执行结果如下:   
   CHECKDB  发现了  0  个分配错误和  0  个一致性错误(在数据库  'test'  中)。   
   DBCC  执行完毕。如果  DBCC  输出了错误信息,请与系统管理员联系。   
      
   I.设置数据库为正常状态 :多用户状态  
   sp_dboption  'test','dbo  use  only','false'   
   如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。   
      
   J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL  Server  Enterprise  Manager里面恢复,也可以使用如下语句完成   
   sp_configure  'allow  updates',0   
   go     
   reconfigure  with  override   
   go  


总结一下就是:

1.停止服务器   net stop mssqlserver

2.把原来的数据文件和日志文件移走

3.开启服务器net start mssqlserver 

4.删除数据库 drop database test

5.新建数据库 create database test on (name='',filename='',size=,filegrowth=) log on (name='',filename='',size=,filegrowth=)

6修改配置,使得能修改系统表:设置数据库为紧急修复模式,设为单用户模式 

sp_configure 'allow updates',1 

update sysdatabases set status = -32768 where name = 'test'

alter database test set single_user 或者 sp_dboption 'test','dbo use only','true'

7.重设数据库状态 

sp_restestatus 'test'

7.重建日志文件     

dbcc rebuild_log(test,'日志文件名')

8.检测数据库的物理一致性

 dbcc checkdb(test)

9.设置数据库为多用户模式 

alter database test set multi_user  或者 sp_dboption 'test','dbo use only','false'

10.修改配置,使得不能修改系统表 

sp_configure 'allow updates',0 

reconfigure

11.重启服务器