检查修复数据库常用方法

时间:2024-02-24 17:26:55

摘自: http://wenku.baidu.com/link?url=QYrNtEu3F3-3fhW45imoNIKkArcMAfqfUc6PNhvpv0UCHu4ChjF-OEiveN2xqPcwnGF6-1UiQY4Tyo4km5qAP_jRi-PJhub6OidIWgFZNl_

A、检查数据库常用方法:
隔一定时间或计算机经常死机、突然掉电、软件经常连接不上数据库时,需要进行检查数据库的完整性和正确性。
一、进入sqlserver“查询分析器”,选中“消费数据库”后输入检测数据库命令:
DBCC CHECKDB (\'消费数据库名称\', NOINDEX)
二、Sqlserver开始检查“消费数据库”的完整性和正确性。
检查结果:
    1、如果为“0个分配性错误,0个一致性错误”,消费数据库正常。退出。
    2、否则“消费数据库”需要进行恢复。
       步骤:
           1、把“查询分析器”的当前数据库改为master数据库。
           2、在查询分析器里面依次执行下面命令:
              A、SP_DBOPTION \'消费数据库名称\',\'SINGLE USER\',TRUE
              B、DBCC CHECKDB(\'消费数据库名称\',REPAIR_ALLOW_DATA_LOSS)
              C、SP_DBOPTION \'消费数据库名称\',\'SINGLE USER\',FALSe
    3、最后重复步骤一再次检查数据库正确性

B、LOG文件损坏处理方法:
  1、停止服务,copy mdf与ldf文件到别处(不要做sp_detach_db分离数据库)
  2、建立一个新数据库
  3、将你复制出去的 mdf文件改名字,替换刚刚新建的数据库的mdf文件(此时你再刷新数据库仍为置疑状态,可以不管)
  4、进入查询分析器,运行以下语句
      USE MASTER
      GO
      
      SP_CONFIGURE \'ALLOW UPDATES\',1
      GO

      RECONFIGURE WITH OVERRIDE
      GO
   
      UPDATE SYSDATABASES SET STATUS=-32768 WHERE NAME=\'数据库名称\'

  5、重建LOG

      DBCC REBUILD_LOG(\'数据库名称\',\'C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL\DATA\数据库名称_LOG.LDF\')

      如果提示“文件已存在”的话,请在相应目录下把原来的LOG文件删除
  
  6、DBCC检查 DBCC CHECKDB(\'数据库名称\')
  7、设置数据库为正常状态
      UPDATE SYSDATABASES SET STATUS =28 WHERE NAME=\'数据库名称\'
      GO

  8、不允许对系统目录直接修改
      SP_CONFIGURE \'ALLOW UPDATES\',0
      GO
   
      RECONFIGURE WITH OVERRIDE
      GO

  9、以上步骤执行完毕后应该就可以进入系统了,但有可能数据库还是有错误,这时可以使用A中的方法对数据库进行修复
  10、如在执行“SP_DBOPTION \'消费数据库名称\',\'SINGLE USER\',TRUE”报错“服务器: 消息 5070,级别 16,状态 2,行 1
    如果其他用户正使用数据库 \'elong\',则数据库状态不能更改 服务器: 消息 5069,级别 16,状态 1,行 1 ALTER DATABASE 语句失败。 sp_dboption 命令失败。”

    就进行以下步骤: 进入查询分析器 执行以下语句(注意数据库名称)

      use master
      go
     
      --kill所有会话
      Declare @tblConnectedUsers Table (SPID int)
      Declare @vcSQLText varchar(200),@iSPID int

      Insert into @tblConnectedUsers
      Select p.spid
          from master.dbo.sysprocesses p (nolock)
          join master..sysdatabases d (nolock) on p.dbid = d.dbid
          Where d.[name] = \'数据库名称\'
        
      While 1 = 1
      Begin
          Select top 1 @iSPID = SPID
              From @tblConnectedUsers
              Where SPID > IsNull(@iSPID, 0)
              order by SPID asc

          If @@RowCount = 0
            Break

          Set @vcSQLText = \'Kill \' + Convert(varchar(10), @iSPID)
          
          Exec(@vcSQLText)
      End

11、再重新操作A中的步骤修复数据库