zoukankan      html  css  js  c++  java
  • SQL Server 2000中数据库质疑的恢复方法

    原帖地址: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.重启服务器

  • 相关阅读:
    IfcFurnishingElementType
    IfcRelAssociatesClassification
    IfcRelAssociatesDocument
    IfcContext
    IfcRelAssociatesMaterial
    我是高敏感的人,你呢?
    介绍一本红色的书
    矫枉必须过正
    大家都在说的民法典,与我有何关系?
    线上Kafka突发rebalance异常,如何快速解决?
  • 原文地址:https://www.cnblogs.com/momogua/p/8304649.html
Copyright © 2011-2022 走看看