SQL2005里的数据库变成可疑,分离后附加的问题

时间:2021-11-14 19:19:59
服务器上2005的数据库,a数据库某天后面突然多了可疑两字,分离后,附加不上去了。现在只有mdf文件好用,根据提示好像是ldf文件受损。在网上了找了很多资料,不过大多是根据2000来的,我试过其中一个说是新建一个数据库,将要还原的数据库的mdf文件覆盖它的,怎样,怎样,结果还是不行,测试数据库并没有出现他说的紧急状态,如何修改呢?还有就是改成了紧急状态后又如何将它改成正常状态呢?救命呀,请各位帮帮忙,急死人了。

17 个解决方案

#1


参考

http://topic.csdn.net/u/20071031/18/433fedf6-7aae-4b3c-846e-0bd64e2e079f.html

#2


--參考
据库置疑的处理办法 
在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因: 
1.错误的删除日志; 
2.硬件(HD)损坏,造成日志和数据文件写错误; 
3.硬盘的空间不够,比如日志文件过大; 
解决办法: 
这是最简单的办法是有数据库的全备份,然后恢复即可. 
步骤: 
1. 删除原始的数据库: 
USE MASTER 
GO 
DROP DATABASE DB_SUEPECT 
2.建立同名的数据库: 
USE master 
GO 
CREATE DATABASE DB_SUSPECT 
ON 
( NAME = DBNAME_DAT, 
FILENAME = 'C:', 
SIZE = 10, 
FILEGROWTH = 5 ) 
LOG ON 
( NAME = 'DBNAME_LOG', 
FILENAME = 'g:', 
SIZE = 5MB, 
FILEGROWTH = 5MB ) 
GO 
3.恢复数据库: 
RESTORE DATABASE DB_SUSPECT 
FROM DBNAME_BACKUP.DAT 
4.数据库完整性检测: 
DBCC CHECKDB('DB_SUSPECT') 
5.重新启动MSSQLSERVER服务. 
如果没有全备份,那就要用一些特殊的方法: 
1.设置数据库为紧急模式 
Use Master 
GO 
sp_configure 'allow updates', 1 
reconfigure with override 
GO 
UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT' 
GO 
2.停掉SQL Server服务: 
NET STOP MSSQLSERVER 
3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走: 
4.启动SQL Server服务: 
NET START MSSQLSERVER 
5.重新建立一个同名的数据库DB_SUSPECT; 
USE master 
GO 
CREATE DATABASE DB_SUSPECT 
ON 
( NAME = DBNAME_DAT, 
FILENAME = 'C:', 
SIZE = 10, 
FILEGROWTH = 5 ) 
LOG ON 
( NAME = 'DBNAME_LOG', 
FILENAME = 'g:', 
SIZE = 5MB, 
FILEGROWTH = 5MB ) 
GO 
6.设置数据库运行在单用户的模式: 
USE MASTER 
GO 
ALTER DATABASE DB_SUSPECT SET SINGLE_USER 
GO 
7.停掉SQL服务: 
NET STOP MSSQLSERVER 
8.把原来的数据文件再覆盖回来: 
9.启动SQL Server服务: 
NET START MSSQLSERVER 
10.重新设置SQLSERVER的状态: 
USE MASTER 
GO 
EXEC sp_resetstatus "DB_SUSPECT" 
11.数据库完整性检测: 
DBCC CHECKDB('DB_SUSPECT') 
12.恢复数据库为多用户模式: 
USE MASTER 
GO 
ALTER DATABASE DB_SUSPECT SET MULTI_USER 
GO 
13.恢复SQLSERVER原始的配置: 
USE MATER 
GO 
UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT' 
GO 
14.配置SQLSERVER不允许更新系统表: 
USE MASTER 
GO 
sp_configure 'allow updates', 0 
reconfigure with override 
GO 
15.重新启动MSSQLSERVER服务: 
最好重新启动操作系统 
16.备份数据库: 
可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT 
补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限

#3


无数据库日志文件恢复数据库方法两则

方法一

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

方法二

事情的起因:昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于是我决意缩小这个日志文件。经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数据库恢复的文章上都说道:“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知道我那时候是怎么想的?!

这下子坏了!这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。而且最要命的,这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。最终成功恢复的全部步骤如下:

设置数据库为紧急模式
停掉SQL Server服务;

把应用数据库的数据文件XXX_Data.mdf移走;

重新建立一个同名的数据库XXX;

停掉SQL服务;

把原来的数据文件再覆盖回来;

运行以下语句,把该数据库设置为紧急模式;

运行“Use Master

Go

sp_configure 'allow updates', 1

reconfigure with override

Go”

执行结果:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。

接着运行“update sysdatabases set status = 32768 where name = 'XXX'”

执行结果:(所影响的行数为 1 行)

重启SQL Server服务;

运行以下语句,把应用数据库设置为Single User模式;

运行“sp_dboption 'XXX', 'single user', 'true'”

执行结果:

命令已成功完成。

做DBCC CHECKDB;

运行“DBCC CHECKDB('XXX')”

执行结果:

'XXX' 的 DBCC 结果。

'sysobjects' 的 DBCC 结果。

对象 'sysobjects' 有 273 行,这些行位于 5 页中。

'sysindexes' 的 DBCC 结果。

对象 'sysindexes' 有 202 行,这些行位于 7 页中。

'syscolumns' 的 DBCC 结果。

………

运行以下语句把系统表的修改选项关掉;

运行“sp_resetstatus "XXX"

go

sp_configure 'allow updates', 0

reconfigure with override

Go”

执行结果:

在 sysdatabases 中更新数据库 'XXX' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),

没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。

重新建立另外一个数据库XXX.Lost;

DTS导出向导
运行DTS导出向导;

复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;

选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;

所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;

于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;

视图和存储过程是执行SQL语句添加的。

这样,XXX.Lost数据库就可以替换原来的应用数据库了。

#4


数据库被置疑后的解决方法
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 


--数据库(如test) 分离后再附加  

EXEC sp_detach_db 'test' 

EXEC sp_attach_db 'test','c:\Program Files\Microsoft SQL Server\MSSQL\Data\test.mdf','c:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf'


#5


引用楼主 ys_go 的帖子:
服务器上2005的数据库,a数据库某天后面突然多了可疑两字,分离后,附加不上去了。现在只有mdf文件好用,根据提示好像是ldf文件受损。在网上了找了很多资料,不过大多是根据2000来的,我试过其中一个说是新建一个数据库,将要还原的数据库的mdf文件覆盖它的,怎样,怎样,结果还是不行,测试数据库并没有出现他说的紧急状态,如何修改呢?还有就是改成了紧急状态后又如何将它改成正常状态呢?救命呀,请各位帮帮忙,急死人了。


顶下,现在用的是sqlserver2000,因为100%的结贴率-->特别敬仰楼主!

#6


数据库置疑的处理办法


在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因: 
 1.错误的删除日志; 
 2.硬件(HD)损坏,造成日志和数据文件写错误; 
 3.硬盘的空间不够,比如日志文件过大; 
 
 
 解决办法: 
 
 这是最简单的办法是有数据库的全备份,然后恢复即可. 
 步骤: 
 
 1. 删除原始的数据库: 
 USE MASTER 
 GO 
 DROP DATABASE DB_SUEPECT 
 
 
 2.建立同名的数据库: 
 USE master 
 GO 
 CREATE DATABASE DB_SUSPECT 
 ON 
 ( NAME = DBNAME_DAT, 
 FILENAME = 'C:', 
 SIZE = 10, 
 FILEGROWTH = 5 ) 
 LOG ON 
 ( NAME = 'DBNAME_LOG', 
 FILENAME = 'g:', 
 SIZE = 5MB, 
 FILEGROWTH = 5MB ) 
 GO 
 
 
 3.恢复数据库: 
 RESTORE DATABASE DB_SUSPECT 
 FROM DBNAME_BACKUP.DAT 
 
 
 4.数据库完整性检测: 
 DBCC CHECKDB('DB_SUSPECT') 
 
 5.重新启动MSSQLSERVER服务. 
 
 如果没有全备份,那就要用一些特殊的方法: 
 
 1.设置数据库为紧急模式 
 Use Master 
 GO 
 sp_configure 'allow updates', 1 
 reconfigure with override 
 GO 
 UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT' 
 GO 
 
 2.停掉SQL Server服务: 
 NET STOP MSSQLSERVER 
 
 3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走: 
 
 4.启动SQL Server服务: 
 NET START MSSQLSERVER 
 
 5.重新建立一个同名的数据库DB_SUSPECT; 
 
 USE master 
 GO 
 CREATE DATABASE DB_SUSPECT 
 ON 
 ( NAME = DBNAME_DAT, 
 FILENAME = 'C:', 
 SIZE = 10, 
 FILEGROWTH = 5 ) 
 LOG ON 
 ( NAME = 'DBNAME_LOG', 
 FILENAME = 'g:', 
 SIZE = 5MB, 
 FILEGROWTH = 5MB ) 
 GO 
 
 
 6.设置数据库运行在单用户的模式: 
 USE MASTER 
 GO 
 ALTER DATABASE DB_SUSPECT SET SINGLE_USER 
 GO 
 
 7.停掉SQL服务: 
 NET STOP MSSQLSERVER 
 
 8.把原来的数据文件再覆盖回来: 
 
 
 9.启动SQL Server服务: 
 NET START MSSQLSERVER 
 
 10.重新设置SQLSERVER的状态: 
 USE MASTER 
 GO 
 EXEC sp_resetstatus "DB_SUSPECT" 
 
 11.数据库完整性检测: 
 DBCC CHECKDB('DB_SUSPECT') 
 
 12.恢复数据库为多用户模式: 
 USE MASTER 
 GO 
 ALTER DATABASE DB_SUSPECT SET MULTI_USER 
 GO 
 
 13.恢复SQLSERVER原始的配置: 
 USE MATER 
 
 GO 
 
 UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT' 
 GO 
 
 14.配置SQLSERVER不允许更新系统表: 
 USE MASTER 
 GO 
 sp_configure 'allow updates', 0 
 reconfigure with override 
 GO 
 
 15.重新启动MSSQLSERVER服务: 
 
 最好重新启动操作系统 
 
 16.备份数据库: 
 
 可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT 
 补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限. 

#7


引用 4 楼 dawugui 的回复:
数据库被置疑后的解决方法 
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager 
里面建立。 
B.停掉数据库服务器。 
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据 
库数据文件test_data.mdf。 
D.启动数据库服务器。此时会看到数据库test的状态为"置疑"。这时候不能对此数据库进行任何*作。 
E.设置数据库允许直接*作系统…


正解啊,太全面了啊,老大!

#8


感谢楼上的几位的热心,不过我觉得跟我实际的情况都不符合,dawugui 这位朋友的方法用在SQL2000上估计有效,我试过了,现在我的数据库我已经将其还原,不过数据丢失了一小部分,伤心~,至于变成质疑的方法,楼上说的在2005里找不到,因为涉及到一个SQL系统表,这里步骤是我们经理弄的,我现在也莫名其妙的。现在数据库已投入使用,但以前好好的一些程序,又莫名奇妙的出现了问题。(以前库上的过程,视图,我一个没少全加上了),程序以前也一直好好的,没有改动过。
现在我估计问题是:数据库迁移后,是不是程序里以前映射的表结构出现了问题?如果说是这样,为什么有的程序又可以读到数据呢?令人费解。望各位朋友帮帮忙。

#9


为什么有的程序又可以读到数据呢?

---


它读的数据在其它程序读不出来?  如果某个表在所有的程序都读不出来,你应该进行一次数据检查,、、

dbcc checkdb

#10


帮顶。

#11


问题都已解决,数据已完全修复。(咋们老百姓呀,心里真高兴~)程序没有改动,数据库修复后就都OK了。下面分享一下解决步骤,散分。
SingleMdf为数据库名称
--①设置数据库为可更新状态
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go

--②将数据库模式改为紧急
ALTER DATABASE SingleMdf SET EMERGENCY

--③更改数据库单用户使用模式
sp_dboption 'SingleMdf', 'single user', 'true'

--④重建日志文件
dbcc checkdb('SingleMdf',REPAIR_ALLOW_DATA_LOSS)

--⑤检查数据库状态(可省略)
DBCC CHECKDB('SingleMdf')

--⑥取消单用户使用模式
sp_dboption 'SingleMdf','dbo use only','false'
go

--⑦改变数据库可更新状态
sp_configure 'allow updates', 0
reconfigure wITh override
Go

#12


--④重建日志文件 
dbcc checkdb('SingleMdf',REPAIR_ALLOW_DATA_LOSS) 

没丢数据?

#13




楼上的,这个7是怎么打出来的啊?

#14


顶一下!

#15


太好了,我昨天也碰到了这样的问题,不过没敢盲目下手,先上来学点经验。
 

13楼的兄弟,你用只能ABC输入法输入V2就能打出⑨⑦⑩这样的数字了

#16


SQL2005里的数据库变成可疑,分离后附加的问题/forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/18.gif][/img]://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/30.gif][/img]

#17


太感谢各位了,我正头痛这上问题呢

#1


参考

http://topic.csdn.net/u/20071031/18/433fedf6-7aae-4b3c-846e-0bd64e2e079f.html

#2


--參考
据库置疑的处理办法 
在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因: 
1.错误的删除日志; 
2.硬件(HD)损坏,造成日志和数据文件写错误; 
3.硬盘的空间不够,比如日志文件过大; 
解决办法: 
这是最简单的办法是有数据库的全备份,然后恢复即可. 
步骤: 
1. 删除原始的数据库: 
USE MASTER 
GO 
DROP DATABASE DB_SUEPECT 
2.建立同名的数据库: 
USE master 
GO 
CREATE DATABASE DB_SUSPECT 
ON 
( NAME = DBNAME_DAT, 
FILENAME = 'C:', 
SIZE = 10, 
FILEGROWTH = 5 ) 
LOG ON 
( NAME = 'DBNAME_LOG', 
FILENAME = 'g:', 
SIZE = 5MB, 
FILEGROWTH = 5MB ) 
GO 
3.恢复数据库: 
RESTORE DATABASE DB_SUSPECT 
FROM DBNAME_BACKUP.DAT 
4.数据库完整性检测: 
DBCC CHECKDB('DB_SUSPECT') 
5.重新启动MSSQLSERVER服务. 
如果没有全备份,那就要用一些特殊的方法: 
1.设置数据库为紧急模式 
Use Master 
GO 
sp_configure 'allow updates', 1 
reconfigure with override 
GO 
UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT' 
GO 
2.停掉SQL Server服务: 
NET STOP MSSQLSERVER 
3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走: 
4.启动SQL Server服务: 
NET START MSSQLSERVER 
5.重新建立一个同名的数据库DB_SUSPECT; 
USE master 
GO 
CREATE DATABASE DB_SUSPECT 
ON 
( NAME = DBNAME_DAT, 
FILENAME = 'C:', 
SIZE = 10, 
FILEGROWTH = 5 ) 
LOG ON 
( NAME = 'DBNAME_LOG', 
FILENAME = 'g:', 
SIZE = 5MB, 
FILEGROWTH = 5MB ) 
GO 
6.设置数据库运行在单用户的模式: 
USE MASTER 
GO 
ALTER DATABASE DB_SUSPECT SET SINGLE_USER 
GO 
7.停掉SQL服务: 
NET STOP MSSQLSERVER 
8.把原来的数据文件再覆盖回来: 
9.启动SQL Server服务: 
NET START MSSQLSERVER 
10.重新设置SQLSERVER的状态: 
USE MASTER 
GO 
EXEC sp_resetstatus "DB_SUSPECT" 
11.数据库完整性检测: 
DBCC CHECKDB('DB_SUSPECT') 
12.恢复数据库为多用户模式: 
USE MASTER 
GO 
ALTER DATABASE DB_SUSPECT SET MULTI_USER 
GO 
13.恢复SQLSERVER原始的配置: 
USE MATER 
GO 
UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT' 
GO 
14.配置SQLSERVER不允许更新系统表: 
USE MASTER 
GO 
sp_configure 'allow updates', 0 
reconfigure with override 
GO 
15.重新启动MSSQLSERVER服务: 
最好重新启动操作系统 
16.备份数据库: 
可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT 
补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限

#3


无数据库日志文件恢复数据库方法两则

方法一

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

方法二

事情的起因:昨天,系统管理员告诉我,我们一个内部应用数据库所在的磁盘空间不足了。我注意到数据库事件日志文件XXX_Data.ldf文件已经增长到了3GB,于是我决意缩小这个日志文件。经过收缩数据库等操作未果后,我犯了一个自进入行业以来的最大最愚蠢的错误:竟然误删除了这个日志文件!后来我看到所有论及数据库恢复的文章上都说道:“无论如何都要保证数据库日志文件存在,它至关重要”,甚至微软甚至有一篇KB文章讲如何只靠日志文件恢复数据库的。我真是不知道我那时候是怎么想的?!

这下子坏了!这个数据库连不上了,企业管理器在它的旁边写着“(置疑)”。而且最要命的,这个数据库从来没有备份了。我唯一找得到的是迁移半年前的另外一个数据库服务器,应用倒是能用了,但是少了许多记录、表和存储过程。最终成功恢复的全部步骤如下:

设置数据库为紧急模式
停掉SQL Server服务;

把应用数据库的数据文件XXX_Data.mdf移走;

重新建立一个同名的数据库XXX;

停掉SQL服务;

把原来的数据文件再覆盖回来;

运行以下语句,把该数据库设置为紧急模式;

运行“Use Master

Go

sp_configure 'allow updates', 1

reconfigure with override

Go”

执行结果:

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。

接着运行“update sysdatabases set status = 32768 where name = 'XXX'”

执行结果:(所影响的行数为 1 行)

重启SQL Server服务;

运行以下语句,把应用数据库设置为Single User模式;

运行“sp_dboption 'XXX', 'single user', 'true'”

执行结果:

命令已成功完成。

做DBCC CHECKDB;

运行“DBCC CHECKDB('XXX')”

执行结果:

'XXX' 的 DBCC 结果。

'sysobjects' 的 DBCC 结果。

对象 'sysobjects' 有 273 行,这些行位于 5 页中。

'sysindexes' 的 DBCC 结果。

对象 'sysindexes' 有 202 行,这些行位于 7 页中。

'syscolumns' 的 DBCC 结果。

………

运行以下语句把系统表的修改选项关掉;

运行“sp_resetstatus "XXX"

go

sp_configure 'allow updates', 0

reconfigure with override

Go”

执行结果:

在 sysdatabases 中更新数据库 'XXX' 的条目之前,模式 = 0,状态 = 28(状态 suspect_bit = 0),

没有更新 sysdatabases 中的任何行,因为已正确地重置了模式和状态。没有错误,未进行任何更改。

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。

重新建立另外一个数据库XXX.Lost;

DTS导出向导
运行DTS导出向导;

复制源选择EmergencyMode的数据库XXX,导入到XXX.Lost;

选择“在SQL Server数据库之间复制对象和数据”,试了多次,好像不行,只是复制过来了所有表结构,但是没有数据,也没有视图和存储过程,而且DTS向导最后报告复制失败;

所以最后选择“从源数据库复制表和视图”,但是后来发现,这样总是只能复制一部分表记录;

于是选择“用一条查询指定要传输的数据”,缺哪个表记录,就导哪个;

视图和存储过程是执行SQL语句添加的。

这样,XXX.Lost数据库就可以替换原来的应用数据库了。

#4


数据库被置疑后的解决方法
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 


--数据库(如test) 分离后再附加  

EXEC sp_detach_db 'test' 

EXEC sp_attach_db 'test','c:\Program Files\Microsoft SQL Server\MSSQL\Data\test.mdf','c:\Program Files\Microsoft SQL Server\MSSQL\Data\test_log.ldf'


#5


引用楼主 ys_go 的帖子:
服务器上2005的数据库,a数据库某天后面突然多了可疑两字,分离后,附加不上去了。现在只有mdf文件好用,根据提示好像是ldf文件受损。在网上了找了很多资料,不过大多是根据2000来的,我试过其中一个说是新建一个数据库,将要还原的数据库的mdf文件覆盖它的,怎样,怎样,结果还是不行,测试数据库并没有出现他说的紧急状态,如何修改呢?还有就是改成了紧急状态后又如何将它改成正常状态呢?救命呀,请各位帮帮忙,急死人了。


顶下,现在用的是sqlserver2000,因为100%的结贴率-->特别敬仰楼主!

#6


数据库置疑的处理办法


在MS SQLSERVER中一直有这样的问题,SQLSERVER的状态"置疑",我们先来分析一下SQLSERVER数据库"置疑"的原因: 
 1.错误的删除日志; 
 2.硬件(HD)损坏,造成日志和数据文件写错误; 
 3.硬盘的空间不够,比如日志文件过大; 
 
 
 解决办法: 
 
 这是最简单的办法是有数据库的全备份,然后恢复即可. 
 步骤: 
 
 1. 删除原始的数据库: 
 USE MASTER 
 GO 
 DROP DATABASE DB_SUEPECT 
 
 
 2.建立同名的数据库: 
 USE master 
 GO 
 CREATE DATABASE DB_SUSPECT 
 ON 
 ( NAME = DBNAME_DAT, 
 FILENAME = 'C:', 
 SIZE = 10, 
 FILEGROWTH = 5 ) 
 LOG ON 
 ( NAME = 'DBNAME_LOG', 
 FILENAME = 'g:', 
 SIZE = 5MB, 
 FILEGROWTH = 5MB ) 
 GO 
 
 
 3.恢复数据库: 
 RESTORE DATABASE DB_SUSPECT 
 FROM DBNAME_BACKUP.DAT 
 
 
 4.数据库完整性检测: 
 DBCC CHECKDB('DB_SUSPECT') 
 
 5.重新启动MSSQLSERVER服务. 
 
 如果没有全备份,那就要用一些特殊的方法: 
 
 1.设置数据库为紧急模式 
 Use Master 
 GO 
 sp_configure 'allow updates', 1 
 reconfigure with override 
 GO 
 UPDATE sysdatabases SET status = 32768 where name = 'DB_SUSPECT' 
 GO 
 
 2.停掉SQL Server服务: 
 NET STOP MSSQLSERVER 
 
 3.把原始数据库的数据文件DBNAME_DAT.MDF,DBNAME_LOG.LDF移走: 
 
 4.启动SQL Server服务: 
 NET START MSSQLSERVER 
 
 5.重新建立一个同名的数据库DB_SUSPECT; 
 
 USE master 
 GO 
 CREATE DATABASE DB_SUSPECT 
 ON 
 ( NAME = DBNAME_DAT, 
 FILENAME = 'C:', 
 SIZE = 10, 
 FILEGROWTH = 5 ) 
 LOG ON 
 ( NAME = 'DBNAME_LOG', 
 FILENAME = 'g:', 
 SIZE = 5MB, 
 FILEGROWTH = 5MB ) 
 GO 
 
 
 6.设置数据库运行在单用户的模式: 
 USE MASTER 
 GO 
 ALTER DATABASE DB_SUSPECT SET SINGLE_USER 
 GO 
 
 7.停掉SQL服务: 
 NET STOP MSSQLSERVER 
 
 8.把原来的数据文件再覆盖回来: 
 
 
 9.启动SQL Server服务: 
 NET START MSSQLSERVER 
 
 10.重新设置SQLSERVER的状态: 
 USE MASTER 
 GO 
 EXEC sp_resetstatus "DB_SUSPECT" 
 
 11.数据库完整性检测: 
 DBCC CHECKDB('DB_SUSPECT') 
 
 12.恢复数据库为多用户模式: 
 USE MASTER 
 GO 
 ALTER DATABASE DB_SUSPECT SET MULTI_USER 
 GO 
 
 13.恢复SQLSERVER原始的配置: 
 USE MATER 
 
 GO 
 
 UPDATE sysdatabases SET status = 4194320 where name = 'DB_SUSPECT' 
 GO 
 
 14.配置SQLSERVER不允许更新系统表: 
 USE MASTER 
 GO 
 sp_configure 'allow updates', 0 
 reconfigure with override 
 GO 
 
 15.重新启动MSSQLSERVER服务: 
 
 最好重新启动操作系统 
 
 16.备份数据库: 
 
 可以通过SQLSERVER企业管理器或T-SQL.需要备份MASTER和DB_SUSPECT 
 补充一点,如果用DOMAIN\USER时,要注意对.MDF.LDF的所在目录的权限. 

#7


引用 4 楼 dawugui 的回复:
数据库被置疑后的解决方法 
A.我们使用默认方式建立一个供恢复使用的数据库(如test)。可以在SQL Server Enterprise Manager 
里面建立。 
B.停掉数据库服务器。 
C.将刚才生成的数据库的日志文件test_log.ldf删除,用要恢复的数据库mdf文件覆盖刚才生成的数据 
库数据文件test_data.mdf。 
D.启动数据库服务器。此时会看到数据库test的状态为"置疑"。这时候不能对此数据库进行任何*作。 
E.设置数据库允许直接*作系统…


正解啊,太全面了啊,老大!

#8


感谢楼上的几位的热心,不过我觉得跟我实际的情况都不符合,dawugui 这位朋友的方法用在SQL2000上估计有效,我试过了,现在我的数据库我已经将其还原,不过数据丢失了一小部分,伤心~,至于变成质疑的方法,楼上说的在2005里找不到,因为涉及到一个SQL系统表,这里步骤是我们经理弄的,我现在也莫名其妙的。现在数据库已投入使用,但以前好好的一些程序,又莫名奇妙的出现了问题。(以前库上的过程,视图,我一个没少全加上了),程序以前也一直好好的,没有改动过。
现在我估计问题是:数据库迁移后,是不是程序里以前映射的表结构出现了问题?如果说是这样,为什么有的程序又可以读到数据呢?令人费解。望各位朋友帮帮忙。

#9


为什么有的程序又可以读到数据呢?

---


它读的数据在其它程序读不出来?  如果某个表在所有的程序都读不出来,你应该进行一次数据检查,、、

dbcc checkdb

#10


帮顶。

#11


问题都已解决,数据已完全修复。(咋们老百姓呀,心里真高兴~)程序没有改动,数据库修复后就都OK了。下面分享一下解决步骤,散分。
SingleMdf为数据库名称
--①设置数据库为可更新状态
use master
go
sp_configure 'allow updates',1
go
reconfigure with override
go

--②将数据库模式改为紧急
ALTER DATABASE SingleMdf SET EMERGENCY

--③更改数据库单用户使用模式
sp_dboption 'SingleMdf', 'single user', 'true'

--④重建日志文件
dbcc checkdb('SingleMdf',REPAIR_ALLOW_DATA_LOSS)

--⑤检查数据库状态(可省略)
DBCC CHECKDB('SingleMdf')

--⑥取消单用户使用模式
sp_dboption 'SingleMdf','dbo use only','false'
go

--⑦改变数据库可更新状态
sp_configure 'allow updates', 0
reconfigure wITh override
Go

#12


--④重建日志文件 
dbcc checkdb('SingleMdf',REPAIR_ALLOW_DATA_LOSS) 

没丢数据?

#13




楼上的,这个7是怎么打出来的啊?

#14


顶一下!

#15


太好了,我昨天也碰到了这样的问题,不过没敢盲目下手,先上来学点经验。
 

13楼的兄弟,你用只能ABC输入法输入V2就能打出⑨⑦⑩这样的数字了

#16


SQL2005里的数据库变成可疑,分离后附加的问题/forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/18.gif][/img]://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/30.gif][/img]

#17


太感谢各位了,我正头痛这上问题呢