SQL Server 緊急狀態下的資料庫恢復

2022-02-11 12:36:28 字數 2226 閱讀 3921

背景:由於伺服器硬碟損壞,伺服器異常關機。重新進入後,資料庫為質疑狀態。(資料庫名字上面有個感嘆號,連線不了)

第一種:

1、在伺服器上停掉出問題的資料庫服務,把.mdf資料庫檔案和.ldf日誌檔案拷貝至本地。

2、本地新建一個同名資料庫,找到檔案地址,停掉sql服務後。把.mdf檔案刪掉(可以也把.ldf也刪掉,但刪不刪除我都試過了,最後都會重新生成一個新的.ldf的檔案,所以這裡沒啥特別要注意的地方),再把伺服器上拷貝的.mdf檔案貼上到該路徑下面。實際上就是替換一下。

3、開啟sql服務,此時資料庫還是不能用,執行下面指令,使資料庫進入緊急狀態

alter database 出問題的資料庫的名字 set emergency

(設定完後可以弄一下停止,重啟sql服務,主要是看了很多答案,有的說弄一下,我只是跟風,不重啟sql服務也行吧,反正我重啟了)

4、執行下面指令,使資料庫進入單使用者模式

alter database 出問題的資料庫的名字 set single_user

5.1、檢查並重建日誌檔案

dbcc checkdb('出問題的資料庫的名字',repair_allow_data_loss)

(我資料庫8.5g,我大概跑了30分鐘,另外一個配置好一點電腦跑了10多分鐘,這一步就耐心等候就好了)

5.2、進行修復。如果沒有錯誤,可以跳過。(我ldf檔案沒刪,就報什麼檔案不匹配,我感覺一般都會報錯,用下面的命令再執行一下,這個時候又得耐心的等候了)

dbcc checkdb('出問題的資料庫的名字',repair_rebuild)

6、最後恢復成多使用者模式

alter database 出問題的資料庫的名字 set multi_user

然後就看臉了,重新整理一下資料庫,狀態變為正常就大功搞成了!

第二種:

上面一種是mdf檔案損壞成都可能很小,有的時候並不能成功。(我一個大佬朋友就試過,沒能成功恢復)

所以這個時候就看能不能搶修資料了,一般資料庫都建了維護計劃,會自動備份。這個時候利用這個備份檔案把資料庫還原,想辦法恢復當天的資料就可以了。

第一種方法中,緊急狀態下資料是可以讀的,所以可以通過bcp查詢需要的資料匯出,再匯入到備份的資料上。

匯出:

bcp "select * from stcjoblog.dbo.t_step where s_addtime > '2019-03-05 00:00:00' and s_addtime < '2019-03-05 14:00:00'" queryout e:\data_2.txt -c -t "|" -r \n -u sa -p "123456"

上面應該很清晰了,stcjoblog.dbo.t_step  指定資料庫和表,後面條件可以忽略。根據實際情況自己查

e:\data_2.txt  指定匯出的路徑及檔名

-u sa -p "123456"   sql server 連線的使用者

匯入:

bcp stcjoblog.dbo.t_step in d:\data_2.txt -b 5000 -c -t "|" -r \n -u sa -p "123456"

這個與上面差不多,就不解釋了。

忘記說了,這需要用cmd執行。

會提示資料條數成功與否,基本上就是這樣!