天天看點

如何恢複資料庫

在本機操作,Debug的時候,一切似乎都在掌控之中。可是送出到伺服器之後,一切顯地都無比陌生。因為不熟悉SQL,準确來說就隻會點Select,Update,Delete,Insert而已。昨天不小心誤删了一張資料不多但是不在人工處理範圍内的一張表内的資料。

因為知道SQL Server是有日志這種東西的,事後我表現地無比淡定,在事發一個小時以内。一個小時之後,我發現我無法掌控這一事件了。

上網查找了恢複資料的辦法。有必要啰嗦一下。

問題1:

無論是遠端端還是伺服器端,都無法對資料庫(假設資料庫叫Test)進行除‘增删查改’的其它操作,譬如分離,脫機,還原...錯誤提示是

e.g.1 “無法分離 Test 資料庫 因為它目前正在使用。”

e.g.2 “因為資料庫正在使用,未獲得對資料的排他通路權,操作異常終止”

反正嘛,就是說你丫不能阻止别人的通路。可我們就是要這樣做的...隻好跟它說拜拜了。

說拜拜的方法就是關掉所有通路資料庫Test的程序。

<a></a>

PS:

代碼我是這樣了解的,定義一段殺死通路資料庫程序的存儲過程。寫一段擷取程序ID的代碼,循環殺死每一個程序。最後調用存儲過程。

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

問題2:

沒有備份資料庫,那該如何恢複資料呢

有個軟體叫做Log Explorer 這個東西可以根據資料庫的日志回到過去的任何一個時刻。

View Code

Log Explorer for SQL Server 是個好東西,但是這根本無法解決我的問題。資料庫在伺服器端,學校根本不會讓我安裝一個軟體在伺服器上面。而且我證明過,這個軟體必須要在伺服器端裝伺服器端軟體的。是以,這個對于我來說,是泡湯的。但是不代表這不是一個利器。

最後我用了一個很蛋疼的方法解決了。

1.分離資料庫,備份一個Test;

2.将資料庫附加回去,用自帶的恢複方式恢複到一個很久以前的狀态;

3.将需要的那張表複制到備份的那個資料庫;

4.将備份的那個資料庫挂回去,原資料庫删了。

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

頭一次知道DBA的重要性。

我的方法是一個很偶然的東西,希望大家分享一下真正能解決恢複問題的辦法。當然,每隔一段時間備份是絕對沒有錯的。

方法

  另外發現一個比較有技術性的可行的方法

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

  (如果為了不讓日志檔案變大而置trunc. log on chkpt.選項為1那你就死翹了)

  2,恢複一個全庫備份,注意需要使用with norecovery,如果還有其他差異或增量備份,則逐個恢複

3,恢複最後一個日志備份即剛做的日志備份,指定恢複時間點到誤操作之前的時刻

完整代碼

  經過驗證,這才叫有技術性!我那純屬“鄧艾的屯‘田’”小孩子過家家。。。

參考的資料:

<a href="http://blog.163.com/liushui19860112@126/blog/static/132373046201052841232492/">http://blog.163.com/liushui19860112@126/blog/static/132373046201052841232492/</a>

<a href="http://blog.csdn.net/voyage_mh1987/article/details/4133798">http://blog.csdn.net/voyage_mh1987/article/details/4133798</a>

<a href="http://kenwu.blog.hexun.com/32603385_d.html">http://kenwu.blog.hexun.com/32603385_d.html</a>

本文轉自 Ron Ngai 部落格園部落格,原文連結:http://www.cnblogs.com/rond/archive/2012/02/28/2372502.html  ,如需轉載請自行聯系原作者