首先要强调的是最好要在此数据库断开所有连接,没有未被提交的事务的状态下关掉数据库,否则可能会引起日志文件无法重做。
有如下几种可行的方案:
1.一般情况
ALTER DATABASE DatabaseName SET EMERGENCY
ALTER DATABASE DatabaseName SET SINGLE_USER
DBCC CheckDB (DatabaseName, REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE DatabaseName SET multi_USER
按以上语句操作便可恢复数据库状态
2,最快速方法
分离此数据库,把日志文件备份转移到别的文件夹下,附加此数据库下的所有数据文件,不要日志文件,附加后会自动重新创建日志文件,这种方法数据库在最短时间内便可恢复,但恢复后最好用如下语句修复数据库以免留下后遗症
DBCC CheckDB (DatabaseName, REPAIR_ALLOW_DATA_LOSS)
3,若数据库可疑不能执行以上操作语句,还可按下面的步骤执行就能解决问题
SQL Server 2005/2008/2008R2修复步骤
方法一
alter database <DatabaseName>set emergency
go
alter database <DatabaseName>set single_user with rollback immediate
go
use master
go
alter database <DatabaseName>Rebuild Log on
(name=<DatabaseName>_log,filename='c:\sql\logs\<DatabaseName>_log.LDF')
go
select * from sys.databases
go
dbcc checkdb('<DatabaseName>', repair_allow_data_loss)
go
sp_dboption '<DatabaseName>','single user','false'
方法二
alter database <DatabaseName> set emergency
go
alter database <DatabaseName> set single_user with rollback immediate
go
use master
go
alter database <DatabaseName> Rebuild Log on
(name=<DatabaseName>_log,filename='c:\sql\logs\<DatabaseName>_log.LDF')
go
use <DatabaseName>
go
dbcc checkdb
go
--此时checkdb有错误才需要做步骤d)
d) 此时数据库应处于emergency状态,创建一个新数据库,通过bcp/bulk insert/DTS/SSIS方式将数据导出到新的数据库.
请注意,这种情况下索引,存储过程,视图等,都需要手工导出来。
4.若数据库不能切换为单用户模式或者无法操作或者非正常关闭,那就需要将数据库分离或者脱机或者关掉数据库服务,使其MDF文件和NDF文件可用,
重新创建同名数据库,同时按照待恢复的数据库相同的NDF文件创建时间顺序创建每个NDF文件,创建好后用如下这样的语句用待恢复的数据文件替换现有库文件
ALTER DATABASE databasename
MODIFY FILE (NAME =logicName,
FILENAME ='H:\file\name.ndf')
ALTER DATABASE databasename
MODIFY FILE (NAME =logicName,
FILENAME ='H:\file\name_log.ldf')
替换后重新启动数据库服务,再按如下步骤执行
alter database <DatabaseName>set emergency
go
alter database <DatabaseName>set single_user with rollback immediate
go
use master
go
alter database <DatabaseName>Rebuild Log on
(name=<DatabaseName>_log,filename='c:\sql\logs\<DatabaseName>_log.LDF')
go
select * from sys.databases
go
dbcc checkdb('<DatabaseName>', repair_allow_data_loss)
go
sp_dboption '<DatabaseName>','single user','false'