数据库置疑(可疑状态)的修复方法

来源:互联网 发布:知乎日报 瞎扯合集 编辑:程序博客网 时间:2024/05/16 14:52

首先要强调的是最好要在此数据库断开所有连接,没有未被提交的事务的状态下关掉数据库,否则可能会引起日志文件无法重做。

有如下几种可行的方案:

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'


0 0