数据库状态为suspect的解决

数据库状态为suspect
RESTORE DATABASE msdb WITH RECOVERY

不过系统表是不能随便改的,设置一下先
USE MASTER
GO
SP_CONFIGURE 'ALLOW UPDATES',1
RECONFIGURE WITH OVERRIDE
GO

先把数据库设置为emergency mode,sysdatabases的status为32768 就表示数据库处于此状态。
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='msdb'
Go

先设置成单用户模式,然后做dbcc
sp_dboption 'msdb', 'single user', 'true'
Go
DBCC CHECKDB('msdb')

如果没有什么大问题就可以把数据库状态改回去了,记得别忘了把系统表的修改选项关掉。checkdb有几种修复选项,自己看着用吧,不过最后你可能还是得用repair_allow_data_loss,完成所有修复。
  chekcdb并不能完成所有的修复,我们需要更进一步的修复,用dbcc checktable对每一个表做检查吧。
Go
update sysdatabases set status =28 where name='msdb'
Go
sp_configure 'allow updates', 0
reconfigure with override
Go
sp_dboption 'msdb', 'single user', 'false'

 


IF   EXISTS   (   SELECT   *   from   sysobjects   where   name   =   'sp_resetstatus'   )  
        DROP   PROCEDURE   sp_resetstatus  
  GO  
   
  CREATE   PROC   sp_resetstatus   @dbname   varchar(30)   AS  
  DECLARE   @msg   varchar(80)  
  IF   @@trancount   >   0  
              BEGIN  
                    PRINT   'Can''t   run   sp_resetstatus   from   within   a   transaction.'  
                    RETURN   (1)  
              END  
  IF   suser_id()   !=   1  
              BEGIN  
                    SELECT   @msg   =     'You   must   be   the   System   Administrator   (SA)'  
                    SELECT   @msg   =   @msg   +   '   to   execute   this   procedure.'  
                    RETURN   (1)  
              END  
  IF   (SELECT   COUNT(*)   FROM   master..sysdatabases  
                    WHERE   name   =   @dbname)   !=   1  
              BEGIN  
                    SELECT   @msg   =   'Database   '   +   @dbname   +   '   does   not   exist!'  
                    PRINT   @msg  
                    RETURN   (1)  
              END  
  IF   (SELECT   COUNT(*)   FROM   master..sysdatabases  
                    WHERE   name   =   @dbname   AND   status   &   256   =   256)   !=   1  
              BEGIN  
                    PRINT   'sp_resetstatus   can   only   be   run   on   suspect   databases.'  
                    RETURN   (1)  
              END  
  BEGIN   TRAN  
              UPDATE   master..sysdatabases   SET   status   =   status   ^   256  
                    WHERE   name   =   @dbname  
              IF   @@error   !=   0   OR   @@rowcount   !=   1  
                    ROLLBACK   TRAN  
              ELSE    
                    BEGIN  
                          COMMIT   TRAN  
                          SELECT   @msg   =   'Database   '   +   @dbname   +   '   status   reset!'  
                          PRINT   @msg  
                          PRINT   ''  
                          PRINT   'WARNING:   You   must   reboot   SQL   Server   prior   to     '  
                          PRINT   '                   accessing   this   database!'  
                          PRINT   ''  
                    END  
   
  GO

 

sp_resetstatus   PRODUCTION 

 数据库日志文件丢失时的恢复步骤

2.Zach的灵验脚本
Zach说他每次遇到这种数据库置疑情况,就运行下面这个脚本,屡试不爽:
======================================================
--before running any script, run the following to set the
master database to allow updates
USE master
GO
sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE
GO

--Run the following script
UPDATE master..sysdatabases SET status = status ^ 256
WHERE name = 'Database_Name'

--Run the following script
exec SP_resetstatus Database_Name

--stop and start the MSDTC at this stage

--After the procedure is created, immediately disable
updates to the system tables:
exec sp_configure 'allow updates', 0
GO
RECONFIGURE WITH OVERRIDE
GO

转载于:https://www.cnblogs.com/shenhuidong2/archive/2009/03/16/1413015.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值