熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

利用作業備份和恢復數據庫

2013-11-13 16:22:33  來源: Oracle 

  備份和恢復是數據庫管理員維護數據庫安全性和完整性的重要操作雖然各種數據庫系統本身提供了備份和恢復數據庫的功能但是操作步驟比較煩瑣本文以SQL Server為例總結了常用的幾種備份和恢復數據庫的方法分析了作業機制的原理並提出了一種以作業機制實現恢復和備份數據庫的方法利用此方法用戶不必打開數據庫管理器在應用程序客戶端就可以方便地實現數據庫的備份和恢復
  常用方法
  備份可以防止由於表和數據庫遭受破壞介質失效或用戶錯誤而造成的數據災難恢復是在意外發生後利用備份來恢復數據庫的操作任何數據維護系統都必須具有備份和恢復數據庫的功能
  SQL Server 的管理器Enterprise Manager是一個強大的管理工具能完成很多功能備份和恢復數據庫是其中的一項基本功能借助這個管理工具有三種常用的方法實現備份和恢復數據庫
  .完全手工方式
  首先選擇要備份和恢復的數據庫然後單擊鼠標右鍵在快捷菜單中的ALL TASKS下選擇備份或者恢復數據庫利用這種方式用戶要進行多步操作其中要涉及到一些參數的設置使用起來容易出錯而且一旦操作失誤可能帶來很大的損失
  .半手工方式
  這種方式要求管理員事先建立備份或者恢復數據庫的作業待到需要備份或者恢復數據庫的時候管理員打開SQL Server Enterprise ManagerManager裡找到相應的作業然後執行這種方式雖然是基於作業方式實現的但是管理員必須打開數據庫管理器在繁多的作業中進行選擇一旦選擇錯誤並執行就有可能帶來意想不到的損失
  .全自動方式
  這種方式也要求管理員事先建立好恢復或者備份數據庫的作業然後定制一個執行計劃讓計算機在特定的條件下自己執行備份和恢復操作這種方式看起來簡單省事但是機器在異常情況下(如掉電)就不能按照計劃執行了
  這幾種實現和恢復數據庫的方法都需要用戶對Enterprise Manager相當熟悉而且處理步驟較為煩瑣操作起來容易發生失誤因此我們需要一種更加簡便可行的實現方法
  作業機制的工作原理
  作業是Enterprise Manager提供的一種定期處理數據的方法可以在應用程序客戶端啟動和關閉
  作業機制由控制體和執行體兩大部分構成(如圖所示)
  
  〈p align=center〉〈img src=〉〈/p〉
  控制體是控制作業執行的實體靠具體編程實現控制體實現時要調用MSDB數據庫的系統存儲過程Sp_start_jobSp_end_job等同時要訪問表sysjobhistory獲取作業執行狀態
  執行體是作業執行的整體在應用系統投入使用時建立
  控制體由用戶觸發啟動相應的作業交由執行體執行在執行過程中執行體執行的每一步的狀態信息都要寫入MSDB數據庫的sysjobhistory表裡同時控制體不斷獲取執行狀態信息根據這些信息控制體決定繼續執行還是停止該作業在作業執行完畢或者出錯停止後控制體向用戶反饋執行結果
  實現備份和恢復
  為了便於說明本文以PB實現的一個具體系統為例來介紹數據庫的備份和恢復
  .執行體的建立
  ●建立應用系統的數據庫XCCXXT
  ●建立備份數據庫所使用的設備XCCXXTBAK
  DAT
  ●建立備份作業XCCXXT BACKUP其中命令行為BACKUP DATABASE XCCXXT TO DISK=C\MSSQL\DATA\BACKUP\XCCXXTBAKDAT
  .控制體的實現
  在相應對象的備份按鈕的click事件中寫入以下代碼
  //聲明相應的變量
  string ls_databasels_passls_datels_time
  integer li_gsli_gs_o
  transaction login_trans
  login_trans = create transaction
  if messagebox(提示信息是否真的要進行數據備份操作?Exclamation!OKCancel!)〈〉 then return
  //連接MSDB數據庫
  login_transdatabase = msdb
  connect using login_trans;
  if login_transsqlcode 〈〉 then
  messagebox(數據庫錯誤信息login_transsqlerrtext)
  return
  end if
  //檢測上次該執行體執行結果用以區別本次執行狀況
  select max(instance_id) into :li_gs_o from sysjobhistory using login_trans;
  if isnull(li_gs_o) then li_gs_o =
  login_transautocommit = true
  ls_pass = login_translogpass
  //運行系統存儲過程Sp_start_job啟動執行體
  prepare sqlsa from Sp_start_job ? using login_trans;
  if login_transsqlcode 〈〉 then
  messagebox(數據庫錯誤信息login_transsqlerrtext)
  login_transautocommit = false
  disconnect using login_trans;
  login_transdatabase = ls_database
  return
  end if
  EXECUTE sqlsa USING XCCXXT BACKUP;
  //檢測執行體啟動是否正常
  if login_transsqlcode 〈〉 then
  messagebox(數據庫錯誤信息login_transsqlerrtext)
  login_transautocommit = false
  disconnect using login_trans;
  return
  end if
  //檢測執行體執行的整個過程
  do
  uf_sleep ()
  select max(instance_id) into :li_gs from sysjobhistory
  using login_trans;
  if isnull(li_gs) then li_gs =
  loop while li_gs〈=li_gs_o+
  //運行系統存儲過程Sp_end_job關閉執行體
  prepare sqlsa from Sp_end_job ? using login_trans;
  if login_transsqlcode 〈〉 then
  messagebox(數據庫錯誤信息login_transsqlerrtext)
  login_transautocommit = false
  disconnect using login_trans;
  login_transdatabase = ls_database
  return
  end if
  EXECUTE sqlsa USING XCCXXT BACKUP;
  //返回執行結果
  li_gs_o=li_gs -
  select run_statusrun_daterun_time into :li_gs:ls_date:ls_time from sysjobhistory where instance_id =:li_gs_o using login_trans;
  if li_gs = then
  st_text = left(ls_date)++mid(ls_date)++right(ls_date)+ + left(ls_time)+:+mid(ls_time)+:+right(ls_time)
  messagebox(提示數據庫備份操作成功!)
  else
  messagebox(提示數據庫備份操作失敗!)
  end if
  //斷開與數據庫MSDB的連接
  login_transautocommit = false
  disconnect using login_trans;
  if login_transsqlcode 〈〉 then
  messagebox(數據庫錯誤信息login_transsqlerrtext)
  end if
  備份是對源數據庫進行讀操作執行體執行之前不需要檢查用戶對數據庫的使用狀態而恢復則是對整個數據庫進行寫操作在啟動執行體之前一定要檢查是否有數據庫進行寫操作否則可能導致失敗
  小結
  作業機制打破了常規上在數據庫管理器裡對大型數據庫備份和恢復的局限性實現了在應用程序客戶端對數據庫的備份和恢復

From:http://tw.wingwit.com/Article/program/Oracle/201311/18228.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.