由於突然斷電等原因,資料庫會被損壞,提示莫名奇妙的錯誤,比如串連失敗,或某個系統資料表出現錯誤等。這樣的資料庫分為兩類,一類是可以用查詢分析器串連進去,這種是可以進行修複的;第二類是查詢分析器連不上的,據我所知這種還沒有什麼修複辦法。
但凡修複一詞,無論資料庫還是實物,都不會像修複前那樣完整,可能會造成資料丟失,或多或少的問題。下面是我工作當中修複資料庫的一點經驗,分為幾個步驟,如果前面的步驟就可以解決,不必往下進行。
第一步,只是某個表損壞。修複語句為:
==================================================
--修複資料庫的某個表
--用下面的語句進行修複
exec sp_dboption '資料庫名', 'single user', 'true'
Go
DBCC CHECKTABLE('表名',repair_allow_data_loss)
go
sp_dboption '資料庫名', 'single user', 'false'
Go
==================================================
根據我的經驗,一般使用者表修複的幾率比較大,系統資料表修複的幾率比較小;
第二步,錯誤不確定是那個或哪幾個表,或任何其他錯誤,按照資料庫損壞來修複。修複語句為:
==================================================
--修複整個資料庫
--用下面的語句進行修複
ALTER DATABASE [資料庫名] SET SINGLE_USER
GO
DBCC CHECKDB('資料庫名',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [資料庫名] SET MULTI_USER
GO
==================================================
第三步,以上兩種都試過不行,可以用匯入匯出功能。
方法是建立一個空表資料庫,從損壞的資料庫中把表結構和資料導過來,也可以先在原資料庫中產生sql指令碼,在空資料庫中執行先建立資料庫結構然後只導資料,這樣的成功率高一些。匯入的時候可能會遇到錯誤提示,比如提示某個表有錯誤,可以暫時不導這個,單獨處理。這部分可以靈活處理。
第四步,匯出匯入功能也不行,就是老提示錯誤,怎麼都導不了,那就這樣做:
1、建立一個空白資料庫,我們叫庫1,在原資料庫中執行這個資料轉移語句:select * into [庫1].[dbo].[表名] from 表名,這個語句只會將表的欄位和表中的資料轉移過去,不會複製約束索引,所以一般都可以複製過去;
2、建立第二個空白資料庫,我們叫庫2,用原資料庫的sql指令碼建立結構,然後用匯入匯出功能將庫1的資料到入到庫2.
這個方法一般資料庫都可以解決。
第五步,能保留多少算多少。以上皆行不通,那就看能留下什麼算什麼吧。