数据库置疑的处理方法1 步骤1: 创建一个新的数据库,命名为原来数据库的名字。 步骤2: 停止SQL Server 步骤3: 把老数据库的MDF文件替换新数据库的相应的MDF文件,并把LDF文件删除。 步骤4: 重新启动SQL Server服务,然后运行如下命令: Use Master Go sp_configure @#allow updates@#,1 reconfigure with override Go begin tran update sysdatabases set status =32768 where name = @#db_name@# --Verify one row is updated before committing commit tran 步骤5: 停止SQL然后重新启动SQL Server服务,然后运行如下命令: DBCC TRACEON(3604) DBCC REBUILD_LOG(@#db_name@#,@#c:\mssql7\data\dbxxx_3.ldf@#) Go 步骤6: 停止SQL然后重新启动SQL Server服务,然后运行: use master update sysdatabases set status =8 where name = @#db_name@# Go sp_configue @#allow updates@#,0 reconfigure with override Go 步骤7: 运行dbcc checkdb(db_name) 检查数据库的完整性 注:都要替换成真实的数据库名字。 数据库置疑的处理方法2 既然它认为这个ndf文件已经建立好了, 那你就建立一个嘛: 1. 备份你的数据文件和日志文件 2. 创建一个新的空数据库, 要求数据文件和日志文件与你损坏的那个数据库的文件是一样的,当然也要包含创建一个与不成功创建的ndf文件名一样的ndf文件 3. 停止sql服务, 复制你备份的数据文件和日志文件, 覆盖你新建的数据库的对应文件,ndf文件保留不动 4. 启动sql服务, 这时步骤2中创建的数据库应该是质疑的、 5. 先不管,执行下面的语句(注意修改其中的数据库名) 6.完成后一般就可以访问数据库中的数据了,这时,数据库本身一般还有问题,解决办法是,利用 数据库的脚本创建一个新的数据库,并将数据导进去就行了. USE MASTER GO SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE GO UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名' Go sp_dboption '置疑的数据库名', 'single user', 'true' Go DBCC CHECKDB('置疑的数据库名') Go update sysdatabases set status =28 where name='置疑的数据库名' Go sp_configure 'allow updates',0 reconfigure with override Go sp_dboption '置疑的数据库名', 'single user', 'false' Go --------------------------------------------------------------- 经过近6个小时的艰苦奋斗.总于搞好了.先谢谢各位.我的水平有限制,希望各位指正. 由于我试数据库添加多一个ndf文件的时候,由于我的机器出问题了,中断了操作,结果数据库出现错误,其实我的ndf文件根本没有生成,只是数据库存在一条记录罢了. 1)创建一个新的空数据库, 要求数据文件和日志文件与你损坏的那个数据库的文件是一样的,当然也要包含创建一个与不成功创建的ndf文件名一样的ndf文件. 2)关键 在master的系统表sysaltfiles里面存在每个数据库文件的记录,我把我错误的记录删除. SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE GO delete from sysaltfiles where name='错误的记录' go SP_CONFIGURE 'ALLOW UPDATES',0 RECONFIGURE WITH OVERRIDE GO 2)重新启动数据库.你会发现数据库置疑了. 3)UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='置疑的数据库名' 4)数据库状态变成了 "紧急模式".我发现在紧急模式下,用查询分析器可以查询到数据里面的表(在企业管理器不行).搜索一下数据中sysfiles和sysfiles1,你会发现,一个表中有错误记录,而一个表就因为master里面删除了它也跟着删除了. 5)UPDATE SYSDATABASES SET STATUS =28WHERE NAME='置疑的数据库名',把数据库状态还原. 6)我的天啊,企业管理器里面正常显示了.这个时候,你先别高兴,你会发现在查询分析器里面正常查询,但建表失败,在企业管理器里面直接查询表失败,导入导出失败. 7)查看数据库属性,发现错误的ndf记录没有了.但sysfile1里面还有,如是,重新建立一个ndf,成功后,你会发现所有的操作都成功了,数据库还原了 然后我马上把ndf删除 联机丛书的方法 重置置疑状态 如果 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 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 notexist!' 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 runon 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