1. 程式人生 > >資料庫置疑(可疑狀態)的修復方法

資料庫置疑(可疑狀態)的修復方法

首先要強調的是最好要在此資料庫斷開所有連線,沒有未被提交的事務的狀態下關掉資料庫,否則可能會引起日誌檔案無法重做。

有如下幾種可行的方案:

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'