数据置疑

 

 

数据库置疑的处理方法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 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
posted @ 2008-07-06 23:25  梦极无边界  阅读(1465)  评论(3)    收藏  举报