利用數據庫日誌恢復數據到時間點的操作(總結)

===引自http://topic.csdn.net/t/20060417/22/4693646.html===

 

工作中的一點小總結希望對大家有點幫助
一、利用sql語句或者存儲過程操作
這個是我在csdn論壇上摘抄的
一種處理中用到的備份還原的存儲過程

RESTORE   DATABASE   MyNwind
      FROM   MyNwind_1,   MyNwind_2
      WITH   NORECOVERY
RESTORE   LOG   MyNwind
      FROM   MyNwindLog1
      WITH   NORECOVERY
RESTORE   LOG   MyNwind
      FROM   MyNwindLog2
      WITH   RECOVERY,   STOPAT   =   'Apr   15,   1998   12:00   AM '

--關閉用戶進程處理
if       @overexist=1       and       @killuser=1
begin
declare       hCForEach       cursor       for
select       s= 'kill       '+cast(spid       as       varchar)       from       master..sysprocesses      
where       dbid=db_id(@dbname)
exec       sp_msforeach_worker       '? '
end

優點:查詢分析器直接操作數據庫恢復數據,有良好的改裝和適用性
缺點   :需要多次操作熟悉其過程,比較難達到企業安全統計審計要求

二、使用組件編程來實現
1、使用sqldmo.dll
C#語言書寫的用於Microsoft       SQL       Server數據庫備份和恢復的類:                        

using       System;

namespace       DbService
{
///       <summary>
///       DbOper類,主要實現對Microsoft       SQL       Server數據庫的備份和恢復   ,注意使用了數據庫時就必須殺死該進程
///       </summary>
public       sealed       class       DbOper
{
///       <summary>
///       DbOper類的構造函數
///       </summary>
private       DbOper()
{
}

///       <summary>
///       數據庫備份
///       </summary>
public       static       void       DbBackup()
{
try
{
SQLDMO.Backup       oBackup       =       new       SQLDMO.BackupClass();
SQLDMO.SQLServer       oSQLServer       =       new       SQLDMO.SQLServerClass();
oSQLServer.LoginSecure       =       false;
oSQLServer.Connect( "localhost ",       "sa ",       "1234 ");
oBackup.Action       =       SQLDMO.SQLDMO_BACKUP_TYPE.SQLDMOBackup_Database;
oBackup.Database       =       "Northwind ";
oBackup.Files       =       @ "d:\\Northwind.bak ";
oBackup.BackupSetName       =       "Northwind ";
oBackup.BackupSetDescription       =       "數據庫備份 ";
oBackup.Initialize       =       true;
oBackup.SQLBackup(oSQLServer);
}
catch
{
throw;
}
}

///       <summary>
///       數據庫恢復
///       </summary>
public       static       void       DbRestore()
{
try
{
SQLDMO.Restore       oRestore       =       new       SQLDMO.RestoreClass();
SQLDMO.SQLServer       oSQLServer       =       new       SQLDMO.SQLServerClass();
oSQLServer.LoginSecure       =       false;
oSQLServer.Connect( "localhost ",       "sa ",       "1234 ");
oRestore.Action       =       SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
oRestore.Database       =       "Northwind ";
oRestore.Files       =       @ "d:\\Northwind.bak ";
oRestore.FileNumber       =       1;
oRestore.ReplaceDatabase       =       true;
oRestore.SQLRestore(oSQLServer);
}
catch
{
throw;
}
}
}
}

 

優點:SQLDMO是SQLServer中企業管理器所使用的應用程序接口,所以它可以執行很多功能,有良好的改裝和適用性,能製作出界面操作良好程序已供使用   。
缺點   :SQLDMO已封裝,製作程序比較難達到企業安全統計審計要求

2、利用命名空間System.Data;   System.Data.SqlClient;進行存儲過程編程,來實現數據恢復以前我看過的一個用該命名空間來實現的sqlserver企業管理
http://sourceforge.net/project/showfiles.php?group_id=63363&package_id=63541&release_id=119730
codeproject有下載
優點:有良好的改裝和適用性,能製作出界面操作良好程序已供使用,能通過web端口來實現運行存儲過程數據恢復備份   。
缺點   :製作程序比較難達到企業安全統計審計要求

3、如果是對Yukon   CLR有研究的朋友,可以利用這一新特性考慮對此編程,也不失爲一種方式
參考連接:
http://blog.csdn.net/leimin/archive/2004/08/16/75662.aspx


二、利用第三方軟件
用第三方工具
1、
Log   Explorer   for   SQL   Server   v4.0.2
該軟件我比較推薦的
安裝完畢後,註冊該程序(壓縮文件有註冊機)


打開log   explorer   file=> attach   log   file-> 選擇服務器和登陸方式-> connect->
選擇數據庫-> attach-> 左面對話框中browse-> view   log-> 就可以看到log記錄了
點擊“View   DDL   Commands”裏面就有很多drop   table   命令
點擊下面的“undo”按鈕是生成表結構的語句(create   table   ....)
點擊下面的“Salvage”按鈕是生成插入語句的(insert   into   ...values....)
(以上lynx1111提供)

想恢復的話:   右鍵log記錄   undo   transation-> 選擇保存文件名和路徑-> 然後打開該文件到查詢分析器裏執行
T-sql代碼就可以了

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

log   explorer使用的幾個問題

1)對數據庫做了完全   差異   和日誌備份
備份時選用了刪除事務日誌中不活動的條目
再用Log   explorer打試圖看日誌時
提示No   log   recorders   found   that   match   the   filter,would   you   like   to   view   unfiltered   data
選擇yes   就看不到剛纔的記錄了

如果不選用了刪除事務日誌中不活動的條目
再用Log   explorer打試圖看日誌時,就能看到原來的日誌

2)修改了其中一個表中的部分數據,此時用Log   explorer看日誌,可以作日誌恢復

3)然後恢復備份,(注意:恢復是斷開log   explorer與數據庫的連接,或連接到其他數據上,
否則會出現數據庫正在使用無法恢復)
恢復完後,再打開log   explorer   提示No   log   recorders   found   that   match   the   filter,would   you   like   to   view   unfiltered   data
選擇yes   就看不到剛纔在2中修改的日誌記錄,所以無法做恢復.

3)
不要用SQL的備份功能備份,搞不好你的日誌就破壞了.

正確的備份方法是:
停止SQL服務,複製數據文件及日誌文件進行文件備份.

然後啓動SQL服務,用log   explorer恢復數據

4)
如果你的數據庫的日誌恢復模型是simple,那就不可能用log   explorer恢復

5)
Log   explorer必須安裝在要恢復數據庫的sql   server服務器上,或者在sql   server服務器上安裝服務端,在操作的電腦上安裝客戶端進行數據恢復

2、如果數據量比較大的話,使用磁帶機和集羣的話,安裝了正版的VERITAS   ,恢復數據是比較好的方法。  
下面是該   軟件重要的新功能:  
·災難恢復演習(Disaster   Recovery   Fire   Drill)——能夠自由測試、規劃和檢驗災難恢復計劃,而不會中斷生產過程。
·集羣模擬器(Cluster   Simulator)——可測試應用故障切換方案,以驗證應用的可用性,確認應用是否根據計劃的故障切換策略和應用需求,遷移到最適當的服務器。
·全局集羣選件(Global   Cluster   Option)——當可用性要求從本地遷移到廣域災難恢復時,能夠快速、輕鬆地升級到任何體系結構。
·即時訪問複製數據——在複製數據的同時,能夠即時訪問數據,只佔用客戶的部分可用存儲容量。
·卷複製顧問工具(Volume   Replicator   Advisor)——準確地分析帶寬需求,確保應用得到優化。

由於該安裝軟件的使用幫助比較齊備,我就不再這裏詳細描述了。我有刻錄的VERITAS   Cluster   Server多用戶版,需要的同事可以找我安裝試用
該軟件的缺點是:價格會比較貴。

另外有幾點恢復數據心得:
1、平時需要做好雙機熱備份,日備份,月備份,年備份,數據複製,異常記錄等工作,在數據丟失的情況下才能做到心中不急

2、如果硬盤損害錯誤,或者誤刪除數據庫的時候,可以考慮用Easyrecovery或者Recover4all等軟件恢復刪除或者受到損害的文件,再恢復數據。

3、如果實在遇到自然因素,網絡又斷開了複製操作的情況下,建議只有手工 "造取 "一批數據出來彌補丟失數據,一般選取類似緯度(如時間、區域等)的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章