Java程式呼叫expdp資料泵實現自動邏輯備份Oracle資料庫的方案設計

neverinit發表於2018-11-09

如果用Java開發一個程式,能夠呼叫Oracle的資料泵expdp實現自動備份,這樣即使是一個不懂Linux,UNIX等作業系統命令以及Oracle資料庫的業務人員,也能透過點選頁面上的選單,實現資料庫的邏輯備份。本文提供了一個設計的思路,供大家學習與交流。


針對資料量比較小的情況下,使用expdp進行備份速度也是比較快的。如果資料量稍大,還可以透過新增parallel引數,用於提升備份的速度,但parallel數值不要超過伺服器CPU數量。


針對Java程式呼叫expdp的方案,需要思考如下幾個問題:

(1)備份需要等待返回嗎?還是透過Java程式調起expdp程式就好?

(2)如果需要等待返回,等了很長時間沒返回怎麼辦?

(3)如果需要等待返回,expdp備份失敗怎麼辦?

(4)如果備份失敗,該又怎樣告訴使用者?


對於問題1,這裡選擇等待返回。一個使用者友好型的設計,是需要和使用者進行互動的,所以要設計成有返回的程式。

對於問題2,3,4,其實是同一個問題,就是程式怎麼告知使用者備份成功了,或者備份失敗了。這裡選擇計時器+日誌檢索+狀態查詢+訊息中心的設計模式,用於應對下列幾種情況:

(1)如果備份程式正常完成工作,各項檢查無誤,透過訊息中心向使用者返回成功資訊。

(2)如果備份程式執行失敗,檢查export.log存在ORA報錯資訊,透過訊息中心向使用者返回失敗資訊。

(3)如果備份程式hang住了,很長時間無返回,比如設定1小時,同時expdp的job狀態也是存在的,那麼就透過訊息中心向使用者返回告警資訊。


下面描述完整的設計過程:

1.準備工作

(1)建立directory和作業系統目錄,配置read,write許可權。

(2)檢查計劃備份資料的Oracle例項當前狀態為read,write。

(3)手工備份hr使用者,測試expdp命令能否正常執行。我曾遇到directory為NFS檔案系統,備份時提示錯誤。

(4)評估備份所需的空間,使用資料泵expdp的estimate=statistics|blocks和estimate_only=y引數對資料庫備份大小進行評估。

(5)檢查邏輯備份的儲存空間是否充足,可以執行命令df -k或df -h檢視。

2.程式設計

設計Java程式,部署在Oracle資料庫伺服器的某一個節點下(可以部署在Tomcat,Weblogic等中介軟體裡,也可以選擇獨立部署,開發人員按照規範自行開發),與伺服器的Oracle使用者進行命令互動,發起expdp的備份命令。

這裡解釋一下計時器+日誌檢索+狀態查詢+訊息中心的設計模式,每個功能的作用:

(1)狀態查詢

狀態查詢的功能是確定expdp是否還在執行,透過定時任務每幾秒查詢資料庫sql,檢視伺服器程式等方式確認,這裡時間間隔可以選擇3秒,5秒等,短時間的偏差不會影響功能體驗。

① 程式呼叫sql,查詢expdp發起時的job是否還在執行

② ps -ef | grep expdp |grep job_name檢視Linux系統程式是否存在

(2)日誌檢索設計

在expdp命令執行完成之後,檢查匯出日誌中是否存在ORA字元,如果存在,意味著有報錯資訊。

(注:如果想設計的更加智慧,可以抓取ORA資訊,呼叫oerr獲取報錯資訊,透過訊息中心傳送給技術人員)

(3)計時器

計時器從程式向系統呼叫expdp命令時開始啟用,狀態查詢確認執行完畢後停止。如果出現超過1小時expdp程式還未停止,程式透過訊息中心向技術人員傳送告警資訊。

(注:超時時間的閾值可以根據實際情況自行調整,30分鐘,2小時都行)

(4)訊息中心

訊息中心是一套獨立的訊息傳送程式,可選擇方案較多,這裡列舉常用四種方案:

①較為簡單的就是向操作介面返回訊息,顯示在頁面上;

②時效性比較低的可以選擇呼叫郵件伺服器,向相關人員傳送成功/失敗/告警郵件;

③時效性較高的是呼叫微信/QQ等網際網路通訊軟體的API介面向使用者推送訊息;

④時效性最高的是透過移動、聯通、電信等運營商向使用者手機傳送簡訊。


到這裡,心中應該有一個程式方案的雛形了。

不過有一點需要注意一下,expdp的命令最好設計成為可配置的,千萬不要硬編碼到程式中,不然程式的可擴充性、可維護性就大大降低。


3.測試案例/場景的準備

為了能夠充分測試各種應用場景以及測試的便利性,這裡做一些約定,同時設計一些測試場景/案例。

約定內容如下:

(1)新掛載一個50M的盤,directory備份路徑指向該盤

(2)使用最簡單的介面操作返回訊息。

測試場景/案例

(1)成功:備份scott使用者,expdp很快完成備份,操作介面在1分鐘之內顯示備份成功訊息。

(2)失敗:全備資料庫,備份會因為磁碟空間滿報錯,操作介面稍後會收到備份失敗訊息。

(3)失敗:刪除備份directory目錄後,備份scott使用者,操作介面會收到備份失敗訊息。

(4)失敗:在expdp備份資料庫的時候,kill備份程式,操作介面會收到備份失敗訊息。

(5)失敗:在expdp備份資料庫的時候,暫停job,操作介面會收到備份失敗訊息。

(6)告警:將計時器超時時間改為1分鐘,全備資料庫,操作介面在1分鐘之後收到告警訊息。


如果讀者有興趣,可以自行開發微信的API推送訊息,或者透過郵件伺服器推送郵件訊息。

如果要傳送簡訊的話,需要和運營商簽訂協議,有條件的朋友,可以在公司的測試環境測試。


4.程式調優/修復BUG

經過多輪測試之後,可能會發現程式某些地方設計不合理,可能會發現程式未按照預期執行,也可能會發現程式有BUG報錯。

那麼下一步,那就是程式調優和修復BUG的工作了,直到自己用著方便,業務用著舒服 ,開發用著滿意。加油吧~


至此,一套完整的Java程式呼叫expdp資料泵實現自動邏輯備份Oracle資料庫的方案設計完畢。

如有其他問題,歡迎交流指正。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31394774/viewspace-2219493/,如需轉載,請註明出處,否則將追究法律責任。

相關文章