数据库质疑的处理
一SQL 2000
对于SQL 2000数据库质疑的修复步骤如下:
1. 在查询分析器中,运行如下命令将数据库置于紧急模式。
Sp_configure 'allow update', 1
Go
Reconfigure with override
Go
Begin Tran
Update master..sysdatabases set status = 32768 where name ='<DatabaseName>'
Commit Tran
--此处<DatabaseName>需要替代成您出问题的数据库名字。
--以下同
Go
Select * from sysdatabases
--检查数据库状态是否已经变成 32768
Go
2. 重启SQL Server服务。
3. 如果第二步中重启服务,数据库再次进入suspect模式,请设置数据库紧急模式,使用BCP方式导出数据。
否则在查询分析器中,重新连接到SQL Server,运行如下命令重建日志。
特别注意: dbcc rebuild_log是内部命令,请您阅读附件中的DBCC Rebuild Run Command.doc。 只有当您同意了附件中的内容,才可以运行此命令。
dbcc rebuild_log('<DatabaseName>','<The file name and the path of the log file>')
--此处<The file name and the path of the log file>是新的日志文件的物理文件的绝对地址。
go
如果rebuild_log失败,请运行如下命令,
Use <DatabaseName>
Go
如果数据库在emergency 方式能够进入紧急模式,直接使用BCP方式导出数据,没有其他方式来恢复数据库。
如果不能进入,则没有其他方式恢复数据库。如果数据库在Rebuild_log之后恢复正常,进入第四步。
4. 关掉查询分析器,再次打开查询分析器,运行如下语句,查询出问题的数据库的DBID
Select * from master.dbo.sysdatabases
Go
5. 再运行如下命令,检查是否有人在使用当前出问题的数据库,如果有的话,请将他们退出。
Select * from master.dbo.sysprocesses
Go
6. 然后运行如下命令,将数据库置于单用户使用模式。如果设置不生效,可以尝试使用企业管理器->数据库属性-> 选项来直接设置.
exec sp_dboption N'<DatabaseName>', N'single', N'true'
7. 在查询分析器中,运行如下命令,检查数据库是否有损坏。
dbcc checkdb('<DatabaseName>')
go
8. 如果您运行上述命令发现数据库有错误。 此时我们需要根据错误来处理。 接下去有两个方向。
方向一:
使用Repair_Allow_Data_Loss选项修复数据库。
优点: 可能可以恢复尽量多的数据
缺点:
a) 不一定能够将全部错误修复,还有可能越修越多。同时,需要大量时间,需要经过多次执行修复命令.十几次,甚至数十次.修复时间不能预估.
b) 就算我们将所有错误修复,我们也不能保证数据在应用程序逻辑这一层次上的数据正确性,您需要找您的应用程序提供商来检查数据在程序逻辑层次是否正确。
dbcc checkdb ('<DB_name>', REPAIR_ALLOW_DATA_LOSS) go
--此命令可能需要运行多次,才能完全修复。
方向二:
通过BCP,DTS,select into等方式将好的表,或者表中好的数据导出来。建议使用BCP的方法,这样可以最大限度的回复数据.BCP会停在出错的纪录上,但是前面的数据就能成功导出.使用DTS或Select into的话, 我们很难判断最大限度能导出的记录数.
优点:导出来的数据保证在应用程序逻辑这一层次的正确性
缺点:不会修复数据库中存在的错误,丢失的数据量会比较大,取决于第7步的运行结果。
9. 数据库完全恢复正常之后,将数据库置于正常状态,并将单用户模式改成多用户模式。(16或者0)
begin tran
update sysdatabases set status = 8 where name = 'db_name'
commit tran
sp_configure 'allow', 0
go
reconfigure with override
exec sp_dboption N'<DatabaseName>', N'single', N'false'
go
二 SQL2005
当SQL SERVER数据库状态为质疑(SUSPECT)状态时,我们可以用以下方法来处理:
1. 修改数据库为紧急模式:ALTER DATABASE DBName SET EMERGENCY .
2. 检查数据库的完整性:DBCC CHECKDB(‘DBName’)
3. 检查没有错误则恢复数据库为正常模式:ALTER DATABASE DBName SET ONLINE;
4 如检查数据库有错误则修改数据库为单用户模式,依情况选择以下命令行进行修复数据;
Code Snippet
DBCC CHECKDB('DBName', REPAIR_FAST);
DBCC CHECKDB('DBName', REPAIR_REBUILD);
DBCC CHECKDB('DBName', REPAIR_ALLOW_DATA_LOSS);
修复完成后将数据库改为正常模式,重启SQL服务或重启服务器。
Code Snippet
ALTER DATABASE DBName SET EMERGENCY /* 修改数据库为紧急模式*/
ALTER DATABASE DBName SET SINGLE_USER /* 修改数据库为单用户模式*/
ALTER DATABASE DBName SET MULTI_USER /* 修改数据库为多用户模式*/
ALTER DATABASE DBName SET ONLINE /* 数据库从紧急&单用户&多用户模式恢复为正常模式*/
DBCC CHECKDB('DBName') /* 检查数据库完整性*/
DBCC CHECKDB('DBName', REPAIR_FAST) /* 快速修复数据库*/
DBCC CHECKDB('DBName', REPAIR_REBUILD) /* 重建索引并修复*/
DBCC CHECKDB('DBName', REPAIR_ALLOW_DATA_LOSS) /*如果必要允许丢失数据修复,数据库修复需在单用户模式下进行