数据置疑

本文提供了详细的步骤来解决SQL Server数据库置疑状态的问题,包括通过重建日志文件、更新系统表设置以及使用存储过程等多种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

数据库置疑的处理方法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

转载于:https://www.cnblogs.com/luozhanbin/archive/2008/07/06/lzbsql.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值