背景:由於服務器硬盤損壞,服務器異常關機。重新進入后,數據庫為質疑狀態。(數據庫名字上面有個感嘆號,連接不了)
經過無數次的百度以及大佬們的指點下,終於成功恢復,下面來說一下方法。
第一種:
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運行。
會提示數據條數成功與否,基本上就是這樣!
給我指點迷津的原文地址:https://www.2cto.com/database/201209/154614.html