SQL SERVER联机丛书重置置疑状态
如果 SQL Server 因为磁盘驱动器不再有可用空间,而不能完成数据库的恢复,那么 Microsoft® SQL Server™ 2000 会返回错误 1105 并且将 sysdatabases 中的 status 列设为置疑。按下面的步骤解决这个问题: 执行 sp_resetstatus。
用 ALTER DATABASE 向数据库添加一个数据文件或日志文件。
停止并重新启动 SQL Server。 
用新的数据文件或日志文件所提供的额外空间,SQL Server 应该能完成数据库的恢复。释放磁盘空间并且重新运行恢复操作。 
sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。注意  只有在您的主要支持提供者指导下或有疑难解答建议的做法时,才可以使用 sp_resetstatus。否则,可能会损坏数据库。
由于该过程修改了系统表,系统管理员必须在创建这个过程前,启用系统表更新。要启用更新,使用下面的过程:USE master
GO
sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE
GO过程创建后,立即禁用系统表更新:sp_configure 'allow updates', 0
GO
RECONFIGURE WITH OVERRIDE
GO只有系统管理员才能执行 sp_resetstatus。执行该过程后,立即关闭 SQL Server。语法为:sp_resetstatus database_name下面的例子将关闭 PRODUCTION 数据库的置疑标志。sp_resetstatus PRODUCTION下面是结果集:Database 'PRODUCTION' status reset!
WARNING: You must reboot SQL Server prior to accessing this database!sp_resetstatus 存储过程代码
下面是 sp_resetstatus 存储过程的代码:IF EXISTS ( SELECT * from sysobjects where name = 'sp_resetstatus' )
   DROP PROCEDURE sp_resetstatus
GOCREATE 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

解决方案 »

  1.   

    是这样做的吗?sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。注意  只有在您的主要支持提供者指导下或有疑难解答建议的做法时,才可以使用 sp_resetstatus。否则,可能会损坏数据库。
    由于该过程修改了系统表,系统管理员必须在创建这个过程前,启用系统表更新。要启用更新,使用下面的过程:USE master
    GO
    sp_configure 'allow updates', 1
    GO
    RECONFIGURE WITH OVERRIDE
    GO过程创建后,立即禁用系统表更新:sp_configure 'allow updates', 0
    GO
    RECONFIGURE WITH OVERRIDE
    GO只有系统管理员才能执行 sp_resetstatus。执行该过程后,立即关闭 SQL Server。语法为:sp_resetstatus database_name下面的例子将关闭 PRODUCTION 数据库的置疑标志。sp_resetstatus PRODUCTION下面是结果集:Database 'PRODUCTION' status reset!
    WARNING: You must reboot SQL Server prior to accessing this database!
      

  2.   

    sp_detach_db [ @dbname = ] 'dbname'  先分离
    再sp_attach_db 附加试一下
      

  3.   

    http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=2785
      

  4.   

    可能置疑的原因很多,我遇到过这些情况,你看看有没有帮助
    1.数据库的空间不足。原因是你没有设上自动增长的属性,或者设了自动增长,但是你的磁盘空间用光了。如果是这样比较好解决,只要增大数据库的容量或增大磁盘的空间就可以了。
    2.由于数据文件.MDF和.LDF不可写,就是说可能什么原因是你的数据文件变成只读文件(要小心,可能是你的文件所在的目录不可写了,我遇到的就是这样的问题,由于程序的原因使得目录损坏,不可写导致数据库置疑),那么解决的办法是,如果是文件属性为只读,那么将属性改过来就可以了,如果是目录不可写,那么将目录修复为可写就可以了,如果不能修复,那么将数据库先分离出来,在将数据文件拷贝到好的目录下,附加上就可以了。
    3.数据库日志文件的损坏。如果是这样,将数据库分离出来,将日至文件先备份到其他的目录,然后删除日至文件,在查询分析器里用sp_attach_single_file_db将数据库.MDF文件附加上就可以了。
    4.如果上面的都不行,可能是你的数据文件损坏了。寻找最新的完全备份,新建一个数据库,将备份恢复就可以了。如果没有备份,嘻,你自求多福吧。
      

  5.   

    如果你是为了救回数据,可以试用以下的方法:
    1。中止SQL服务。
    2。Run "sqlservr -c -f" in command windows。
    3。在MASTER DATABASE中运行UPDATE SYSDATABASES SET STATUS=-32768 WHERE NAME='DBNAME'
    4。重启SQL服务。
    5。DATABASE状态由SUSPECT变为EMERGENCY。
    6。用DTS将最新的数据TRNAS TO 原先BACKUP的DATABASE。
      

  6.   

    今天刚刚解决次问题,不过我是在6.5中解决的,无论是2000还是6.5,出现此问题后,都会在sysdatabases中将出现问题的数据库质疑,将状态位置为2^8=256以sa登陆
    直接修改sysdatabases中的状态位(无论是2000,还是6.5最终都是达到此目的)
    use master
    go
    sp_configure "allow updates",1
    reconfigure with override
    go
    updat sysdatabases
    set status = status - 256 //或者直接设置为1
    where name= "your dbname"
    and status & 26=56 = 256 //或者不要此条件
    go
    sp_configure "allow updates",0
    reconfigure
    go
    以上语句我在6.5中试验成功
    另外,如果3个data文件在质疑之后拷贝出来,用这三个文件恢复数据库之后仍是质疑状态