SqlServer数据库置疑的解决办法

    技术2022-05-19  23

    导读:   /*--重置置疑状态   1.系统方法:   如果 sql server 因为磁盘驱动器不再有可用空间,而不能完成数据库的恢复,   那么 microsoft® sql server™ 2000 会返回错误 1105   并且将 sysdatabases 中的 status 列设为置疑。按下面的步骤解决这个问题:   执行 sp_resetstatus。   语法为:   sp_resetstatus '数据库名'   用 alter database 向数据库添加一个数据文件或日志文件。   停止并重新启动 sql server。   用新的数据文件或日志文件所提供的额外空间,sql server 应该能完成数据库的恢复。   释放磁盘空间并且重新运行恢复操作。   sp_resetstatus 关闭数据库的置疑标志,但是原封不动地保持数据库的其它选项。   --*/   --2.手工重置置疑状态   use master   go   sp_configure 'allow updates',1 reconfigure with override   go   declare @dbname varchar(30)   set @dbname='你要处理的数据库名'   if @@trancount >0   print '正在进行事务处理,操作不能进行'   else if suser_id()!=1   print '你不是系统管理员(sa),不能进行此操作'   else if not exists(select 1 from master..sysdatabases where name=@dbname)   print '你要操作的数据库不存在'   else if not exists(select 1 from master..sysdatabases where name= @dbname and status &256 = 256)   print '你的数据库没有被置疑'   else   begin   begin tran   update master..sysdatabases set status = status ^ 256 where name = @dbname   if @@error != 0 or @@rowcount != 1   rollback tran   else   begin   commit tran   print '操作成功,请重新启动SQL'   end   end   go   sp_configure 'allow updates', 1 reconfigure with override   go   --------------------------   如果上面的方法不能解决问题.   就有点麻烦,首先分离你的数据库,备份数据文件   如果不能分离,则停止SQL服务,再备份数据文件,然后启动SQL服务,删除置疑的数据库   接下来按下面的步骤处理:   1.新建一个同名的数据库   2.再停掉sql server(注意不要分离数据库)   3.用原数据库的数据文件覆盖掉这个新建的数据库   4.再重启sql server   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   Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=42006

    还有一种方法:

    随便记录---------

     A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL   Server   Enterprise   Manager里面建立。     B.停掉数据库服务器。     C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据库数据文件test_data.mdf。     D.启动数据库服务器。此时会看到数据库test的状态为“置疑”。这时候不能对此数据库进行任何操作。     E.设置数据库允许直接操作系统表。此操作可以在SQL   Server   Enterprise   Manager里面选择数据库服务器,按右键,选择“属性”,在“服务器设置”页面中将“允许对系统目录直接修改”一项选中。也可以使用如下语句来实现。     use   master     go     sp_configure   'allow updates',1     go       reconfigure   with   override     go     F.设置test为紧急修复模式     update   sysdatabases   set   status=-32768   where   dbid=DB_ID('test')     此时可以在SQL   Server   Enterprise   Manager里面看到该数据库处于“只读/置疑/脱机/紧急模式”可以看到数据库里面的表,但是仅仅有系统表     G.下面执行真正的恢复操作,重建数据库日志文件     dbcc   rebuild_log('test','C:/Program   Files/Microsoft   SQL   Server/MSSQL/Data/test_log.ldf')     执行过程中,如果遇到下列提示信息:     服务器:   消息   5030,级别   16,状态   1,行   1     未能排它地锁定数据库以执行该操作。     DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。     说明您的其他程序正在使用该数据库,如果刚才您在F步骤中使用SQL   Server   Enterprise   Manager打开了test库的系统表,那么退出SQL   Server   Enterprise   Manager就可以了。     正确执行完成的提示应该类似于:     警告:   数据库   'test'   的日志已重建。已失去事务的一致性。应运行   DBCC   CHECKDB   以验证物理一致性。将必须重置数据库选项,并且可能需要删除多余的日志文件。     DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。     此时打开在SQL   Server   Enterprise   Manager里面会看到数据库的状态为“只供DBO使用”。此时可以访问数据库里面的用户表了。     H.验证数据库一致性(可省略)     dbcc   checkdb('test')     一般执行结果如下:     CHECKDB   发现了   0   个分配错误和   0   个一致性错误(在数据库   'test'   中)。     DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。     I.设置数据库为正常状态     sp_dboption   'test','dbo use only','false'     如果没有出错,那么恭喜,现在就可以正常的使用恢复后的数据库啦。     J.最后一步,我们要将步骤E中设置的“允许对系统目录直接修改”一项恢复。因为平时直接操作系统表是一件比较危险的事情。当然,我们可以在SQL   Server   Enterprise   Manager里面恢复,也可以使用如下语句完成     sp_configure   'allow updates',0     go       reconfigure   with   override     go  

     


    最新回复(0)