西西軟件園多重安全檢測下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁西西教程數(shù)據(jù)庫教程 → 通過數(shù)據(jù)庫日志恢復(fù)MSSql誤刪除的記錄

通過數(shù)據(jù)庫日志恢復(fù)MSSql誤刪除的記錄

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時(shí)間:2012/2/29 0:24:04字體大小:A-A+

作者:西西點(diǎn)擊:949次評論:3次標(biāo)簽: MSSql

  • 類型:數(shù)據(jù)庫類大。3.1M語言:英文 評分:6.6
  • 標(biāo)簽:
立即下載

在本機(jī)操作,Debug的時(shí)候,一切似乎都在掌控之中。可是提交到服務(wù)器之后,一切顯地都無比陌生。因?yàn)椴皇煜QL,準(zhǔn)確來說就只會點(diǎn)Select,Update,Delete,Insert而已。昨天不小心誤刪了一張數(shù)據(jù)不多但是不在人工處理范圍內(nèi)的一張表內(nèi)的數(shù)據(jù)。

因?yàn)橹繱QL Server是有日志這種東西的,事后我表現(xiàn)地?zé)o比淡定,在事發(fā)一個(gè)小時(shí)以內(nèi)。一個(gè)小時(shí)之后,我發(fā)現(xiàn)我無法掌控這一事件了。

上網(wǎng)查找了恢復(fù)數(shù)據(jù)的辦法。有必要啰嗦一下。

問題1:

無論是遠(yuǎn)程端還是服務(wù)器端,都無法對數(shù)據(jù)庫(假設(shè)數(shù)據(jù)庫叫Test)進(jìn)行除‘增刪查改’的其它操作,譬如分離,脫機(jī),還原...錯誤提示是

e.g.1 “無法分離 Test 數(shù)據(jù)庫 因?yàn)樗?dāng)前正在使用!

e.g.2 “因?yàn)閿?shù)據(jù)庫正在使用,未獲得對數(shù)據(jù)的排他訪問權(quán),操作異常終止”

反正嘛,就是說你丫不能阻止別人的訪問?晌覀兙褪且@樣做的...只好跟它說拜拜了。

說拜拜的方法就是關(guān)掉所有訪問數(shù)據(jù)庫Test的進(jìn)程。

createproc  killspid (@dbnamevarchar(20))
   as
   begin
   declare@sqlnvarchar(500)
   declare@spidint
   set@sql='declare  getspid  cursor  for  select  spid  from  sysprocesses  where  dbid=db_id('''+@dbname+''')'
   exec(@sql)
   open  getspid
   fetchnextfrom  getspid  into@spid
   while@@fetch_status<>-1
   begin
   exec('kill  '+@spid)
   fetchnextfrom  getspid  into@spid
   end
   close  getspid
   deallocate  getspid
   end      
   
   --用法      
   use  master      
   exec  killspid  '數(shù)據(jù)庫名'   

PS:

代碼我是這樣理解的,定義一段殺死訪問數(shù)據(jù)庫進(jìn)程的存儲過程。寫一段獲取進(jìn)程ID的代碼,循環(huán)殺死每一個(gè)進(jìn)程。最后調(diào)用存儲過程。

雖然不了解存儲過程,但是意思就是這樣的吧。

問題2:

沒有備份數(shù)據(jù)庫,那該如何恢復(fù)數(shù)據(jù)呢

有個(gè)軟件叫做Log Explorer 這個(gè)東西可以根據(jù)數(shù)據(jù)庫的日志回到過去的任何一個(gè)時(shí)刻。

Log Explorer for SQL Server 

  打開log explorer file=>attach log file->選擇服務(wù)器和登陸方式->connect-> 

  選擇數(shù)據(jù)庫->attach->左面對話框中browse->view log->就可以看到log記錄了 

  點(diǎn)擊“View DDL Commands”里面就有很多drop table 命令 

  點(diǎn)擊下面的“undo”按鈕是生成表結(jié)構(gòu)的語句(create table ....) 

  點(diǎn)擊下面的“Salvage”按鈕是生成插入語句的(insert into ...values....) 

  想恢復(fù)的話: 右鍵log記錄 undo transation->選擇保存文件名和路徑->然后打開該文件到查詢分析器里執(zhí)行 

  T-sql代碼就可以了 

  例如 如果log是delete table where ...的話,生成的文件代碼就是insert table .... 

  log explorer使用的幾個(gè)問題 

  對數(shù)據(jù)庫做了完全 差異 和日志備份 

  備份時(shí)選用了刪除事務(wù)日志中不活動的條目 

  再用Log explorer打試圖看日志時(shí) 

  提示No log recorders found that match the filter,would you like to view unfiltered data 

  選擇yes,就看不到剛才的記錄了 

  如果不選用了刪除事務(wù)日志中不活動的條目 

  再用Log explorer打試圖看日志時(shí),就能看到原來的日志

Log Explorer for SQL Server 是個(gè)好東西,但是這根本無法解決我的問題。數(shù)據(jù)庫在服務(wù)器端,學(xué)校根本不會讓我安裝一個(gè)軟件在服務(wù)器上面。而且我證實(shí)過,這個(gè)軟件必須要在服務(wù)器端裝服務(wù)器端軟件的。所以,這個(gè)對于我來說,是泡湯的。但是不代表這不是一個(gè)利器。

最后我用了一個(gè)很蛋疼的方法解決了。

1.分離數(shù)據(jù)庫,備份一個(gè)Test;

2.將數(shù)據(jù)庫附加回去,用自帶的恢復(fù)方式恢復(fù)到一個(gè)很久以前的狀態(tài);

3.將需要的那張表復(fù)制到備份的那個(gè)數(shù)據(jù)庫;

4.將備份的那個(gè)數(shù)據(jù)庫掛回去,原數(shù)據(jù)庫刪了。

這是一個(gè)很蛋疼而且碰巧那張表沒被改的方法。

頭一次知道DBA的重要性。

我的方法是一個(gè)很偶然的東西,希望大家分享一下真正能解決恢復(fù)問題的辦法。當(dāng)然,每隔一段時(shí)間備份是絕對沒有錯的。

方法

  另外發(fā)現(xiàn)一個(gè)比較有技術(shù)性的可行的方法

  1,如果誤操作之前存在一個(gè)全庫備份(或已有多個(gè)差異備份或增量備份),首先要做的事就是進(jìn)進(jìn)行一次日志備份

 。ㄈ绻麨榱瞬蛔屓罩疚募兇蠖胻runc. log on chkpt.選項(xiàng)為1那你就死翹了)

    backup log dbName to disk='fileName'

----注意:是日志備份!

  2,恢復(fù)一個(gè)全庫備份,注意需要使用with norecovery,如果還有其他差異或增量備份,則逐個(gè)恢復(fù)
    

restore database dbName from disk='fileName' with norecovery


  3,恢復(fù)最后一個(gè)日志備份即剛做的日志備份,指定恢復(fù)時(shí)間點(diǎn)到誤操作之前的時(shí)刻
    

restore log dbName from disk='fileName'
    with stopat='date_time'

完整代碼

----1,如果誤操作之前存在一個(gè)全庫備份(或已有多個(gè)差異備份或增量備份),首先要做的事就是進(jìn)進(jìn)行一次日志備份(如果為了不讓日志文件變大而置trunc. log on chkpt.選項(xiàng)為1那你就死翹了)
    backup log dbName to disk='fileName'

----注意:是日志備份!
----2,恢復(fù)一個(gè)全庫備份,注意需要使用with norecovery,如果還有其他差異或增量備份,則逐個(gè)恢復(fù)
    restore database dbName from disk='fileName' with norecovery
----3,恢復(fù)最后一個(gè)日志備份即剛做的日志備份,指定恢復(fù)時(shí)間點(diǎn)到誤操作之前的時(shí)刻
    restore log dbName from disk='fileName'
    with stopat='date_time'

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(3)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)