1.在SQL Server 2005或SQL Server 2008中急救“质疑”数据库的办法
--------------------------------------------------------------------
1)将“质疑”数据库附加至SQL Server中
注意:通常“质疑”数据库都无法成功添加到其他的数据库中,可以通过以下办法任意一个尝试附加:
方法a.将数据库文件.mdf和.ldf文件存放至默认的数据目录中:C:/Program files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/
方法b.利用以下语句,只添加mdf文件
EXEC sp_attach_single_file_db @dbname = 'AdventureWorks',
@physname = N'C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/AdventureWorks_Data.mdf';
方法c.创建同名数据库->停止SQL Server服务->替换同名数据库文件->启动SQL Server服务
2)将数据库设置为“单用户模式”
use master
go
alter database test set single_user
go
3)将数据库设置为“紧急模式”
alter database test set emergency
go
4)检查数据库
DBCC CHECKDB('test')
go
5)尝试使用通过重建索引对数据库做“无损”数据恢复
DBCC CHECKDB('test',REPAIR_REBUILD )
Go
6)如果步骤5失败,尝试对数据库做“有损”数据恢复,执行完毕后,注意SQL Server的输出结果,会提供数据库有哪些数据发生损失
DBCC CHECKDB('test',REPAIR_ALLOW_DATA_LOSS )
Go
参考链接:http://msdn.microsoft.com/zh-cn/library/ms176064(v=SQL.90).aspx
7)如果步骤6失败,尝试通过导出表来获取剩余数据,存储过程等等
use test
go
select * from sys.objects where type='U'
go
参考链接:http://msdn.microsoft.com/zh-cn/library/ms190324(v=SQL.90).aspx
8)当操作完毕后,将数据库设置为“多用户模式”
alter database test set multi_user
go
注意:无论使用什么办法成功地修复了数据库,我们都建议客户能够创建一个新的数据库,将旧的数据库的架构和数据导入新数据库后,废除旧的数据库,以免今后出现潜在的风险。
2.在SQL Server 2000中急救“质疑”数据库的办法
--------------------------------------------------------------------
1)将“质疑”数据库附加至SQL Server中
注意:通常“质疑”数据库都无法成功添加到其他的数据库中,可以通过以下办法任意一个尝试附加:
方法a.利用以下语句,只添加mdf文件
EXEC sp_attach_single_file_db @dbname = 'AdventureWorks',
@physname = N'C:/Program Files/Microsoft SQL Server/MSSQL.1/MSSQL/Data/AdventureWorks_Data.mdf';
方法b.创建同名数据库->停止SQL Server服务->替换同名数据库文件->启动SQL Server服务
EXEC sp_attach_single_file_db @dbname = 'pubs',
@physname = 'c:/Program Files/Microsoft SQL Server/MSSQL/Data/pubs.mdf'
2)允许更新服务器配置
use master
go
Sp_configure 'allow updates', 1
Go
Reconfigure with override
Go
3)将数据库设置为“紧急”状态
select * from sysobjects
go
Update master..sysdatabases set status = 32768 where name =' '
Go
Select * from sysdatabases
--Check that above UPDATE statement change the status to 32768
Go
执行以上语句后需要重新启动SQL Server服务才能生效。
参考链接:http://msdn.microsoft.com/zh-cn/library/aa260406(v=sql.80).aspx
4)重新创建数据库日志文件
dbcc rebuild_log('DB_name','LDF path and name')
--LDF name should be different with the previous name.
go
Update master..sysdatabases set status = 0 where name =' '
go
sp_configure 'allow updates', 0
go
reconfigure with override
go
5)将数据库设置为“单用户模式”
select * from sysobjects
go
Update master..sysdatabases set status = 4096 where name =' '
Go
Select * from sysdatabases
--Check that above UPDATE statement change the status to 4096
Go
执行以上语句后需要重新启动SQL Server服务才能生效。
6)检查数据库
DBCC CHECKDB('test')
go
7)尝试使用通过重建索引对数据库做“无损”数据恢复
DBCC CHECKDB('test',REPAIR_REBUILD )
Go
8)如果步骤7失败,尝试对数据库做“有损”数据恢复,执行完毕后,注意SQL Server的输出结果,会提供数据库有哪些数据发生损失
DBCC CHECKDB('test',REPAIR_ALLOW_DATA_LOSS )
Go
参考链接:http://msdn.microsoft.com/zh-cn/library/aa258278(v=sql.80).aspx
9)如果步骤8失败,尝试通过导出表来获取剩余数据,存储过程等等
select * from sysobjects
go
Update master..sysdatabases set status = 32768 where name =' '
Go
Select * from sysdatabases
--Check that above UPDATE statement change the status to 32768
Go
重新启动SQL Server服务使以上数据库状态修改生效。
use test
go
select * from sysobjects where type='U'
go
参考链接:http://msdn.microsoft.com/zh-cn/library/aa260447(v=sql.80).aspx
8)当操作完毕后,将数据库设置为“正常状态”
select * from sysobjects
go
Update master..sysdatabases set status = 0 where name =' '
Go
Select * from sysdatabases
--Check that above UPDATE statement change the status to 0
Go
重新启动SQL Server服务使以上数据库状态修改生效。
注意:无论使用什么办法成功地修复了数据库,我们都建议客户能够创建一个新的数据库,将旧的数据库的架构和数据导入新数据库后,废除旧的数据库,以免今后出现潜在的风险。